The branch, v4-13-stable has been updated via 692d5287eaf VERSION: Disable GIT_SNAPSHOT for the 4.13.8 release. via dc853e700d4 WHATSNEW: Add release notes for Samba 4.13.8. via 39d9e71cfcf CVE-2021-20254 passdb: Simplify sids_to_unixids() via a44be607c9d VERSION: Enable GIT_SNAPSHOT. via 2f7500d3927 VERSION: Bump version up to 4.13.8... from bf1d38a7a16 WHATSNEW: Add release notes for Samba 4.13.7.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-13-stable - Log ----------------------------------------------------------------- commit 692d5287eaf0559777b8aeeef11e62549da06068 Author: Karolin Seeger <ksee...@samba.org> Date: Mon Apr 26 13:09:58 2021 +0200 VERSION: Disable GIT_SNAPSHOT for the 4.13.8 release. BUG 14571: CVE-2021-20254: Buffer overrun in sids_to_unixids(). Signed-off-by: Karolin Seeger <ksee...@samba.org> commit dc853e700d4bb1d6faf4d2d8aac180d458d76c8b Author: Karolin Seeger <ksee...@samba.org> Date: Mon Apr 26 12:45:26 2021 +0200 WHATSNEW: Add release notes for Samba 4.13.8. Signed-off-by: Karolin Seeger <ksee...@samba.org> commit 39d9e71cfcff17395ba26c076e2dc5fe0ddc1d65 Author: Volker Lendecke <v...@samba.org> Date: Sat Feb 20 15:50:12 2021 +0100 CVE-2021-20254 passdb: Simplify sids_to_unixids() Best reviewed with "git show -b", there's a "continue" statement that changes subsequent indentation. Decouple lookup status of ids from ID_TYPE_NOT_SPECIFIED Bug: https://bugzilla.samba.org/show_bug.cgi?id=14571 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (backported from patch from master) [backport by npo...@samba.org as master commit 493f5d6b078e0b0f80d1ef25043e2834cb4fcb87 and 58e9b62222ad62c81cdf11d704859a227cb2902b creates conflicts due to rename of WBC_ID_TYPE_* -> ID_TYPE_*] commit a44be607c9d6dca5052e82d12d487e90376e2d28 Author: Karolin Seeger <ksee...@samba.org> Date: Mon Apr 26 13:08:23 2021 +0200 VERSION: Enable GIT_SNAPSHOT. Signed-off-by: Karolin Seeger <ksee...@samba.org> commit 2f7500d3927812bab01680e26bf1b49224e6bd2a Author: Stefan Metzmacher <me...@samba.org> Date: Wed Mar 24 11:52:22 2021 +0100 VERSION: Bump version up to 4.13.8... GIT_SNAPSHOT is already 'yes'. Signed-off-by: Stefan Metzmacher <me...@samba.org> (cherry picked from commit 5677103fe7b49ed7738d5df5e5231473c673e08c) ----------------------------------------------------------------------- Summary of changes: VERSION | 2 +- WHATSNEW.txt | 68 +++++++++++++++++++++++- source3/passdb/lookup_sid.c | 123 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 168 insertions(+), 25 deletions(-) Changeset truncated at 500 lines: diff --git a/VERSION b/VERSION index 9f3a9e91308..030268366fc 100644 --- a/VERSION +++ b/VERSION @@ -25,7 +25,7 @@ ######################################################## SAMBA_VERSION_MAJOR=4 SAMBA_VERSION_MINOR=13 -SAMBA_VERSION_RELEASE=7 +SAMBA_VERSION_RELEASE=8 ######################################################## # If a official release has a serious bug # diff --git a/WHATSNEW.txt b/WHATSNEW.txt index 7df21d367c1..6fe057c5b40 100644 --- a/WHATSNEW.txt +++ b/WHATSNEW.txt @@ -1,3 +1,68 @@ + ============================== + Release Notes for Samba 4.13.8 + April 29, 2021 + ============================== + + +This is a security release in order to address the following defect: + +o CVE-2021-20254: Negative idmap cache entries can cause incorrect group entries + in the Samba file server process token. + + +======= +Details +======= + +o CVE-2021-20254: + The Samba smbd file server must map Windows group identities (SIDs) into unix + group ids (gids). The code that performs this had a flaw that could allow it + to read data beyond the end of the array in the case where a negative cache + entry had been added to the mapping cache. This could cause the calling code + to return those values into the process token that stores the group + membership for a user. + + Most commonly this flaw caused the calling code to crash, but an alert user + (Peter Eriksson, IT Department, Linköping University) found this flaw by + noticing an unprivileged user was able to delete a file within a network + share that they should have been disallowed access to. + + Analysis of the code paths has not allowed us to discover a way for a + remote user to be able to trigger this flaw reproducibly or on demand, + but this CVE has been issued out of an abundance of caution. + + +Changes since 4.13.7 +-------------------- + +o Volker Lendecke <v...@samba.org> + * BUG 14571: CVE-2021-20254: Fix buffer overrun in sids_to_unixids(). + + +####################################### +Reporting bugs & Development Discussion +####################################### + +Please discuss this release on the samba-technical mailing list or by +joining the #samba-technical IRC channel on irc.freenode.net. + +If you do report problems then please try to send high quality +feedback. If you don't provide vital information to help us track down +the problem then you will probably be ignored. All bug reports should +be filed under the Samba 4.1 and newer product in the project's Bugzilla +database (https://bugzilla.samba.org/). + + +====================================================================== +== Our Code, Our Bugs, Our Responsibility. +== The Samba Team +====================================================================== + + +Release notes for older releases follow: +---------------------------------------- + + ============================== Release Notes for Samba 4.13.7 March 24, 2021 @@ -55,8 +120,7 @@ database (https://bugzilla.samba.org/). ====================================================================== -Release notes for older releases follow: ----------------------------------------- +---------------------------------------------------------------------- ============================== diff --git a/source3/passdb/lookup_sid.c b/source3/passdb/lookup_sid.c index 82c47b3145b..4b3aa7e435d 100644 --- a/source3/passdb/lookup_sid.c +++ b/source3/passdb/lookup_sid.c @@ -29,6 +29,7 @@ #include "../libcli/security/security.h" #include "lib/winbind_util.h" #include "../librpc/gen_ndr/idmap.h" +#include "lib/util/bitmap.h" static bool lookup_unix_user_name(const char *name, struct dom_sid *sid) { @@ -1247,7 +1248,9 @@ bool sids_to_unixids(const struct dom_sid *sids, uint32_t num_sids, { struct wbcDomainSid *wbc_sids = NULL; struct wbcUnixId *wbc_ids = NULL; + struct bitmap *found = NULL; uint32_t i, num_not_cached; + uint32_t wbc_ids_size = 0; wbcErr err; bool ret = false; @@ -1255,6 +1258,20 @@ bool sids_to_unixids(const struct dom_sid *sids, uint32_t num_sids, if (wbc_sids == NULL) { return false; } + found = bitmap_talloc(wbc_sids, num_sids); + if (found == NULL) { + goto fail; + } + + /* + * We go through the requested SID array three times. + * First time to look for global_sid_Unix_Users + * and global_sid_Unix_Groups SIDS, and to look + * for mappings cached in the idmap_cache. + * + * Use bitmap_set() to mark an ids[] array entry as + * being mapped. + */ num_not_cached = 0; @@ -1266,17 +1283,20 @@ bool sids_to_unixids(const struct dom_sid *sids, uint32_t num_sids, &sids[i], &rid)) { ids[i].type = ID_TYPE_UID; ids[i].id = rid; + bitmap_set(found, i); continue; } if (sid_peek_check_rid(&global_sid_Unix_Groups, &sids[i], &rid)) { ids[i].type = ID_TYPE_GID; ids[i].id = rid; + bitmap_set(found, i); continue; } if (idmap_cache_find_sid2unixid(&sids[i], &ids[i], &expired) && !expired) { + bitmap_set(found, i); continue; } ids[i].type = ID_TYPE_NOT_SPECIFIED; @@ -1287,62 +1307,121 @@ bool sids_to_unixids(const struct dom_sid *sids, uint32_t num_sids, if (num_not_cached == 0) { goto done; } - wbc_ids = talloc_array(talloc_tos(), struct wbcUnixId, num_not_cached); + + /* + * For the ones that we couldn't map in the loop above, query winbindd + * via wbcSidsToUnixIds(). + */ + + wbc_ids_size = num_not_cached; + wbc_ids = talloc_array(talloc_tos(), struct wbcUnixId, wbc_ids_size); if (wbc_ids == NULL) { goto fail; } - for (i=0; i<num_not_cached; i++) { + for (i=0; i<wbc_ids_size; i++) { wbc_ids[i].type = WBC_ID_TYPE_NOT_SPECIFIED; + wbc_ids[i].id.gid = (uint32_t)-1; } - err = wbcSidsToUnixIds(wbc_sids, num_not_cached, wbc_ids); + err = wbcSidsToUnixIds(wbc_sids, wbc_ids_size, wbc_ids); if (!WBC_ERROR_IS_OK(err)) { DEBUG(10, ("wbcSidsToUnixIds returned %s\n", wbcErrorString(err))); } + /* + * Second time through the SID array, replace + * the ids[] entries that wbcSidsToUnixIds() was able to + * map. + * + * Use bitmap_set() to mark an ids[] array entry as + * being mapped. + */ + num_not_cached = 0; for (i=0; i<num_sids; i++) { - if (ids[i].type == ID_TYPE_NOT_SPECIFIED) { - switch (wbc_ids[num_not_cached].type) { - case WBC_ID_TYPE_UID: - ids[i].type = ID_TYPE_UID; - ids[i].id = wbc_ids[num_not_cached].id.uid; - break; - case WBC_ID_TYPE_GID: - ids[i].type = ID_TYPE_GID; - ids[i].id = wbc_ids[num_not_cached].id.gid; - break; - default: - /* The types match, and wbcUnixId -> id is a union anyway */ - ids[i].type = (enum id_type)wbc_ids[num_not_cached].type; - ids[i].id = wbc_ids[num_not_cached].id.gid; - break; - } - num_not_cached += 1; + if (bitmap_query(found, i)) { + continue; } + + SMB_ASSERT(num_not_cached < wbc_ids_size); + + switch (wbc_ids[num_not_cached].type) { + case WBC_ID_TYPE_UID: + ids[i].type = ID_TYPE_UID; + ids[i].id = wbc_ids[num_not_cached].id.uid; + bitmap_set(found, i); + break; + case WBC_ID_TYPE_GID: + ids[i].type = ID_TYPE_GID; + ids[i].id = wbc_ids[num_not_cached].id.gid; + bitmap_set(found, i); + break; + case WBC_ID_TYPE_BOTH: + ids[i].type = ID_TYPE_BOTH; + ids[i].id = wbc_ids[num_not_cached].id.uid; + bitmap_set(found, i); + break; + case WBC_ID_TYPE_NOT_SPECIFIED: + /* + * wbcSidsToUnixIds() wasn't able to map this + * so we still need to check legacy_sid_to_XXX() + * below. Don't mark the bitmap entry + * as being found so the final loop knows + * to try and map this entry. + */ + ids[i].type = ID_TYPE_NOT_SPECIFIED; + ids[i].id = (uint32_t)-1; + break; + default: + /* + * A successful return from wbcSidsToUnixIds() + * cannot return anything other than the values + * checked for above. Ensure this is so. + */ + smb_panic(__location__); + break; + } + num_not_cached += 1; } + /* + * Third and final time through the SID array, + * try legacy_sid_to_gid()/legacy_sid_to_uid() + * for entries we haven't already been able to + * map. + * + * Use bitmap_set() to mark an ids[] array entry as + * being mapped. + */ + for (i=0; i<num_sids; i++) { - if (ids[i].type != ID_TYPE_NOT_SPECIFIED) { + if (bitmap_query(found, i)) { continue; } if (legacy_sid_to_gid(&sids[i], &ids[i].id)) { ids[i].type = ID_TYPE_GID; + bitmap_set(found, i); continue; } if (legacy_sid_to_uid(&sids[i], &ids[i].id)) { ids[i].type = ID_TYPE_UID; + bitmap_set(found, i); continue; } } done: + /* + * Pass through the return array for consistency. + * Any ids[].id mapped to (uint32_t)-1 must be returned + * as ID_TYPE_NOT_SPECIFIED. + */ for (i=0; i<num_sids; i++) { switch(ids[i].type) { case WBC_ID_TYPE_GID: case WBC_ID_TYPE_UID: case WBC_ID_TYPE_BOTH: - if (ids[i].id == -1) { + if (ids[i].id == (uint32_t)-1) { ids[i].type = ID_TYPE_NOT_SPECIFIED; } break; -- Samba Shared Repository