Your message dated Sat, 15 Mar 2025 09:44:44 +0000
with message-id <e1tto4s-005knk...@coccia.debian.org>
and subject line Close 1095970
has caused the Debian Bug report #1095970,
regarding bookworm-pu: package sssd/2.8.2-4+deb12u1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
1095970: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1095970
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: bookworm
X-Debbugs-Cc: s...@packages.debian.org
Control: affects -1 + src:sssd
User: release.debian....@packages.debian.org
Usertags: pu

[ Reason ]

Fix no-dsa vulnerability CVE-2023-3758: Due to a race condition flaw the
GPO policy is not consistently applied for authenticated users.

[ Impact ]

Bookworm users will remain vulnerable.  Also the issues were fixed in
Bullseye LTS, so users upgrading to Bookworm will regress if it isn't
fixed to that suite too.

[ Tests ]

The upstream test suite doesn't run at build time, but I manually ran it
and verified that the patch doesn't cause any regression.

[ Risks ]

The fixes are trivial; 2.8.x is officially supported upstream and the
upstream patch was cherry-picked to 2.8.2 without conflict.

[ Checklist ]

  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in stable
  [x] the issue is verified as fixed in unstable

[ Changes ]

  * Fix CVE-2023-3758: Due to a race condition flaw the GPO policy is not
    consistently applied for authenticated users. (Closes: #1070369)
  * Add d/.gitlab-ci.yml for Salsa CI.
  * Add d/.gitignore file to exclude d/p/*.patch from upstream gitignore(5)'d
    rules.

-- 
Guilhem.
diffstat for sssd-2.8.2 sssd-2.8.2

 .gitlab-ci.yml              |    8 +
 changelog                   |   11 ++
 patches/CVE-2023-3758.patch |  214 ++++++++++++++++++++++++++++++++++++++++++++
 patches/series              |    1 
 4 files changed, 234 insertions(+)

diff -Nru sssd-2.8.2/debian/changelog sssd-2.8.2/debian/changelog
--- sssd-2.8.2/debian/changelog 2023-04-11 14:19:36.000000000 +0200
+++ sssd-2.8.2/debian/changelog 2025-02-09 11:45:11.000000000 +0100
@@ -1,3 +1,14 @@
+sssd (2.8.2-4+deb12u1) bookworm; urgency=medium
+
+  * Non-maintainer upload.
+  * Fix CVE-2023-3758: Due to a race condition flaw the GPO policy is not
+    consistently applied for authenticated users. (Closes: #1070369)
+  * Add d/.gitlab-ci.yml for Salsa CI.
+  * Add d/.gitignore file to exclude d/p/*.patch from upstream gitignore(5)'d
+    rules.
+
+ -- Guilhem Moulin <guil...@debian.org>  Sun, 09 Feb 2025 11:45:11 +0100
+
 sssd (2.8.2-4) unstable; urgency=medium
 
   [ Sam Morris ]
diff -Nru sssd-2.8.2/debian/.gitlab-ci.yml sssd-2.8.2/debian/.gitlab-ci.yml
--- sssd-2.8.2/debian/.gitlab-ci.yml    1970-01-01 01:00:00.000000000 +0100
+++ sssd-2.8.2/debian/.gitlab-ci.yml    2025-02-09 11:45:11.000000000 +0100
@@ -0,0 +1,8 @@
+include:
+  - 
https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
+
+variables:
+  RELEASE: 'bookworm'
+  SALSA_CI_DISABLE_REPROTEST: 1
+  SALSA_CI_DISABLE_LINTIAN: 1
+  SALSA_CI_DISABLE_PIUPARTS: 1
diff -Nru sssd-2.8.2/debian/patches/CVE-2023-3758.patch 
sssd-2.8.2/debian/patches/CVE-2023-3758.patch
--- sssd-2.8.2/debian/patches/CVE-2023-3758.patch       1970-01-01 
01:00:00.000000000 +0100
+++ sssd-2.8.2/debian/patches/CVE-2023-3758.patch       2025-02-09 
11:45:11.000000000 +0100
@@ -0,0 +1,214 @@
+From: Sumit Bose <sb...@redhat.com>
+Date: Wed, 8 Nov 2023 14:50:24 +0100
+Subject: ad-gpo: use hash to store intermediate results
+
+Currently after the evaluation of a single GPO file the intermediate
+results are stored in the cache and this cache entry is updated until
+all applicable GPO files are evaluated. Finally the data in the cache is
+used to make the decision of access is granted or rejected.
+
+If there are two or more access-control request running in parallel one
+request might overwrite the cache object with intermediate data while
+another request reads the cached data for the access decision and as a
+result will do this decision based on intermediate data.
+
+To avoid this the intermediate results are not stored in the cache
+anymore but in hash tables which are specific to the request. Only the
+final result is written to the cache to have it available for offline
+authentication.
+
+Reviewed-by: Alexey Tikhonov <atikh...@redhat.com>
+Reviewed-by: Tomáš Halman <thal...@redhat.com>
+Origin: 
https://github.com/SSSD/sssd/commit/f4ebe1408e0bc67abfbfb5f0ca2ea13803b36726
+Bug: https://github.com/SSSD/sssd/pull/7302
+Bug-Debian: https://security-tracker.debian.org/tracker/CVE-2023-3758
+Bug-Debian: https://bugs.debian.org/1070369
+---
+ src/providers/ad/ad_gpo.c | 116 ++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 102 insertions(+), 14 deletions(-)
+
+diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c
+index 4b7bbf1..904aa1e 100644
+--- a/src/providers/ad/ad_gpo.c
++++ b/src/providers/ad/ad_gpo.c
+@@ -1316,6 +1316,33 @@ ad_gpo_extract_policy_setting(TALLOC_CTX *mem_ctx,
+     return ret;
+ }
+ 
++static errno_t
++add_result_to_hash(hash_table_t *hash, const char *key, char *value)
++{
++    int hret;
++    hash_key_t k;
++    hash_value_t v;
++
++    if (hash == NULL || key == NULL || value == NULL) {
++        return EINVAL;
++    }
++
++    k.type = HASH_KEY_CONST_STRING;
++    k.c_str = key;
++
++    v.type = HASH_VALUE_PTR;
++    v.ptr = value;
++
++    hret = hash_enter(hash, &k, &v);
++    if (hret != HASH_SUCCESS) {
++        DEBUG(SSSDBG_OP_FAILURE, "Failed to add [%s][%s] to hash: [%s].\n",
++                                 key, value, hash_error_string(hret));
++        return EIO;
++    }
++
++    return EOK;
++}
++
+ /*
+  * This function parses the cse-specific (GP_EXT_GUID_SECURITY) filename,
+  * and stores the allow_key and deny_key of all of the gpo_map_types present
+@@ -1323,6 +1350,7 @@ ad_gpo_extract_policy_setting(TALLOC_CTX *mem_ctx,
+  */
+ static errno_t
+ ad_gpo_store_policy_settings(struct sss_domain_info *domain,
++                             hash_table_t *allow_maps, hash_table_t 
*deny_maps,
+                              const char *filename)
+ {
+     struct ini_cfgfile *file_ctx = NULL;
+@@ -1456,14 +1484,14 @@ ad_gpo_store_policy_settings(struct sss_domain_info 
*domain,
+                 goto done;
+             } else if (ret != ENOENT) {
+                 const char *value = allow_value ? allow_value : empty_val;
+-                ret = sysdb_gpo_store_gpo_result_setting(domain,
+-                                                         allow_key,
+-                                                         value);
++                ret = add_result_to_hash(allow_maps, allow_key,
++                                         talloc_strdup(allow_maps, value));
+                 if (ret != EOK) {
+-                    DEBUG(SSSDBG_CRIT_FAILURE,
+-                          "sysdb_gpo_store_gpo_result_setting failed for key:"
+-                          "'%s' value:'%s' [%d][%s]\n", allow_key, 
allow_value,
+-                          ret, sss_strerror(ret));
++                    DEBUG(SSSDBG_CRIT_FAILURE, "Failed to add key: [%s] "
++                                               "value: [%s] to allow maps "
++                                               "[%d][%s].\n",
++                                               allow_key, value, ret,
++                                               sss_strerror(ret));
+                     goto done;
+                 }
+             }
+@@ -1483,14 +1511,14 @@ ad_gpo_store_policy_settings(struct sss_domain_info 
*domain,
+                 goto done;
+             } else if (ret != ENOENT) {
+                 const char *value = deny_value ? deny_value : empty_val;
+-                ret = sysdb_gpo_store_gpo_result_setting(domain,
+-                                                         deny_key,
+-                                                         value);
++                ret = add_result_to_hash(deny_maps, deny_key,
++                                         talloc_strdup(deny_maps, value));
+                 if (ret != EOK) {
+-                    DEBUG(SSSDBG_CRIT_FAILURE,
+-                          "sysdb_gpo_store_gpo_result_setting failed for key:"
+-                          "'%s' value:'%s' [%d][%s]\n", deny_key, deny_value,
+-                          ret, sss_strerror(ret));
++                    DEBUG(SSSDBG_CRIT_FAILURE, "Failed to add key: [%s] "
++                                               "value: [%s] to deny maps "
++                                               "[%d][%s].\n",
++                                               deny_key, value, ret,
++                                               sss_strerror(ret));
+                     goto done;
+                 }
+             }
+@@ -1783,6 +1811,8 @@ struct ad_gpo_access_state {
+     int num_cse_filtered_gpos;
+     int cse_gpo_index;
+     const char *ad_domain;
++    hash_table_t *allow_maps;
++    hash_table_t *deny_maps;
+ };
+ 
+ static void ad_gpo_connect_done(struct tevent_req *subreq);
+@@ -1905,6 +1935,19 @@ ad_gpo_access_send(TALLOC_CTX *mem_ctx,
+         goto immediately;
+     }
+ 
++    ret = sss_hash_create(state, 0, &state->allow_maps);
++    if (ret != EOK) {
++        DEBUG(SSSDBG_FATAL_FAILURE, "Could not create allow maps "
++              "hash table [%d]: %s\n", ret, sss_strerror(ret));
++        goto immediately;
++    }
++
++    ret = sss_hash_create(state, 0, &state->deny_maps);
++    if (ret != EOK) {
++        DEBUG(SSSDBG_FATAL_FAILURE, "Could not create deny maps "
++              "hash table [%d]: %s\n", ret, sss_strerror(ret));
++        goto immediately;
++    }
+ 
+     subreq = sdap_id_op_connect_send(state->sdap_op, state, &ret);
+     if (subreq == NULL) {
+@@ -2724,6 +2767,43 @@ ad_gpo_cse_step(struct tevent_req *req)
+     return EAGAIN;
+ }
+ 
++static errno_t
++store_hash_maps_in_cache(struct sss_domain_info *domain,
++                         hash_table_t *allow_maps, hash_table_t *deny_maps)
++{
++    int ret;
++    struct hash_iter_context_t *iter;
++    hash_entry_t *entry;
++    size_t c;
++    hash_table_t *hash_list[] = { allow_maps, deny_maps, NULL};
++
++
++    for (c = 0; hash_list[c] != NULL; c++) {
++        iter = new_hash_iter_context(hash_list[c]);
++        if (iter == NULL) {
++            DEBUG(SSSDBG_OP_FAILURE, "Failed to create hash iterator.\n");
++            return EINVAL;
++        }
++
++        while ((entry = iter->next(iter)) != NULL) {
++            ret = sysdb_gpo_store_gpo_result_setting(domain,
++                                                     entry->key.c_str,
++                                                     entry->value.ptr);
++            if (ret != EOK) {
++                free(iter);
++                DEBUG(SSSDBG_OP_FAILURE,
++                      "sysdb_gpo_store_gpo_result_setting failed for key:"
++                      "[%s] value:[%s] [%d][%s]\n", entry->key.c_str,
++                      (char *) entry->value.ptr, ret, sss_strerror(ret));
++                return ret;
++            }
++        }
++        talloc_free(iter);
++    }
++
++    return EOK;
++}
++
+ /*
+  * This cse-specific function (GP_EXT_GUID_SECURITY) increments the
+  * cse_gpo_index until the policy settings for all applicable GPOs have been
+@@ -2765,6 +2845,7 @@ ad_gpo_cse_done(struct tevent_req *subreq)
+      * (as part of the GPO Result object in the sysdb cache).
+      */
+     ret = ad_gpo_store_policy_settings(state->host_domain,
++                                       state->allow_maps, state->deny_maps,
+                                        cse_filtered_gpo->policy_filename);
+     if (ret != EOK && ret != ENOENT) {
+         DEBUG(SSSDBG_OP_FAILURE,
+@@ -2778,6 +2859,13 @@ ad_gpo_cse_done(struct tevent_req *subreq)
+ 
+     if (ret == EOK) {
+         /* ret is EOK only after all GPO policy files have been downloaded */
++        ret = store_hash_maps_in_cache(state->host_domain,
++                                       state->allow_maps, state->deny_maps);
++        if (ret != EOK) {
++            DEBUG(SSSDBG_OP_FAILURE, "Failed to store evaluated GPO maps "
++                                     "[%d][%s].\n", ret, sss_strerror(ret));
++            goto done;
++        }
+         ret = ad_gpo_perform_hbac_processing(state,
+                                              state->gpo_mode,
+                                              state->gpo_map_type,
diff -Nru sssd-2.8.2/debian/patches/series sssd-2.8.2/debian/patches/series
--- sssd-2.8.2/debian/patches/series    2023-03-24 09:10:33.000000000 +0100
+++ sssd-2.8.2/debian/patches/series    2025-02-09 11:45:11.000000000 +0100
@@ -2,3 +2,4 @@
 default-to-socket-activated-services.diff
 fix-shebang-on-sss_analyze.patch
 0004-Makefile-Install-dbus-policy-in-usr-not-etc.patch
+CVE-2023-3758.patch

Attachment: signature.asc
Description: PGP signature


--- End Message ---
--- Begin Message ---
Version: 12.10
This update has been released as part of 12.10. Thank you for your contribution.

--- End Message ---

Reply via email to