[SCM] Samba Shared Repository - branch v4-16-stable updated

Jule Anger janger at samba.org
Wed Jul 19 14:28:46 UTC 2023


The branch, v4-16-stable has been updated
       via  225a003a043 VERSION: Disable GIT_SNAPSHOT for the 4.16.11 release.
       via  40053373794 WHATSNEW: Add release notes for Samba 4.16.11.
       via  caf21883fa8 s3:rpc_server:netlogon: generate FAULT_INVALID_TAG for invalid netr_LogonGetCapabilities levels
       via  585df7e0220 s4:rpc_server:netlogon: generate FAULT_INVALID_TAG for invalid netr_LogonGetCapabilities levels
       via  5d48ea23dec s4:torture/rpc: let rpc.schannel also check netr_LogonGetCapabilities with different levels
       via  6e87858185f netlogon.idl: add support for netr_LogonGetCapabilities response level 2
       via  1809843614b CVE-2023-34968: mdssvc: return a fake share path
       via  cecd415a0ab CVE-2023-34968: mdscli: return share relative paths
       via  d6b9c5234ff CVE-2023-34968: mdssvc: introduce an allocating wrapper to sl_pack()
       via  0fdfc85f28a CVE-2023-34968: mdssvc: switch to doing an early return
       via  34f9f1b37ec CVE-2023-34968: mdssvc: remove response blob allocation
       via  739f72a0703 CVE-2023-34968: rpcclient: remove response blob allocation
       via  7bbaa191be6 CVE-2023-34968: smbtorture: remove response blob allocation in mdssvc.c
       via  82cc2a422db CVE-2023-34968: mdscli: remove response blob allocation
       via  3636b54616e CVE-2023-34968: mdscli: use correct TALLOC memory context when allocating spotlight_blob
       via  8c95f7ae6b3 CVE-2023-34968: mdssvc: add missing "kMDSStoreMetaScopes" dict key in slrpc_fetch_properties()
       via  b09e22cfc79 CVE-2023-34968: mdssvc: cache and reuse stat info in struct sl_inode_path_map
       via  843ec381de3 CVE-2023-34968: lib: Move subdir_of() to source3/lib/util_path.c
       via  5b4353cc60b CVE-2023-34967: mdssvc: add type checking to dalloc_value_for_key()
       via  92d014bc44b CVE-2023-34967: CI: add a test for type checking of dalloc_value_for_key()
       via  cb6f3e22024 CVE-2023-34966: mdssvc: harden sl_unpack_loop()
       via  01cf3cf7a83 CVE-2023-34966: CI: test for sl_unpack_loop()
       via  2eabbe31f64 CVE-2022-2127: ntlm_auth: cap lanman response length value
       via  5c6fe5a491b CVE-2022-2127: winbindd: Fix WINBINDD_PAM_AUTH_CRAP length checks
       via  1dd3ae281b9 CVE-2022-2127: s3:winbind: Move big NTLMv2 blob checks to parent process
       via  76fc517cc54 VERSION: Bump version up to Samba 4.16.11...
      from  32d0bb89272 VERSION: Disable GIT_SNAPSHOT for the 4.16.10 release.

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-16-stable


- Log -----------------------------------------------------------------
commit 225a003a043eee399b6d266d94440c399b6877e4
Author: Jule Anger <janger at samba.org>
Date:   Mon Jul 17 21:39:58 2023 +0200

    VERSION: Disable GIT_SNAPSHOT for the 4.16.11 release.
    
    Signed-off-by: Jule Anger <janger at samba.org>

commit 40053373794dba56762b184e6d34c2c937065f50
Author: Jule Anger <janger at samba.org>
Date:   Mon Jul 17 21:39:40 2023 +0200

    WHATSNEW: Add release notes for Samba 4.16.11.
    
    Signed-off-by: Jule Anger <janger at samba.org>

commit caf21883fa83a3277a1df405c32eeeda3950495b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jul 15 16:11:48 2023 +0200

    s3:rpc_server:netlogon: generate FAULT_INVALID_TAG for invalid netr_LogonGetCapabilities levels
    
    This is important as Windows clients with KB5028166 seem to
    call netr_LogonGetCapabilities with query_level=2 after
    a call with query_level=1.
    
    An unpatched Windows Server returns DCERPC_NCA_S_FAULT_INVALID_TAG
    for query_level values other than 1.
    While Samba tries to return NT_STATUS_NOT_SUPPORTED, but
    later fails to marshall the response, which results
    in DCERPC_FAULT_BAD_STUB_DATA instead.
    
    Because we don't have any documentation for level 2 yet,
    we just try to behave like an unpatched server and
    generate DCERPC_NCA_S_FAULT_INVALID_TAG instead of
    DCERPC_FAULT_BAD_STUB_DATA.
    Which allows patched Windows clients to keep working
    against a Samba DC.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15418
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Mon Jul 17 07:35:09 UTC 2023 on atb-devel-224
    
    (cherry picked from commit dfeabce44fbb78083fbbb2aa634fc4172cf83db9)

commit 585df7e0220b57c022b0a7218e52ec811ee5b05e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jul 15 16:11:48 2023 +0200

    s4:rpc_server:netlogon: generate FAULT_INVALID_TAG for invalid netr_LogonGetCapabilities levels
    
    This is important as Windows clients with KB5028166 seem to
    call netr_LogonGetCapabilities with query_level=2 after
    a call with query_level=1.
    
    An unpatched Windows Server returns DCERPC_NCA_S_FAULT_INVALID_TAG
    for query_level values other than 1.
    While Samba tries to return NT_STATUS_NOT_SUPPORTED, but
    later fails to marshall the response, which results
    in DCERPC_FAULT_BAD_STUB_DATA instead.
    
    Because we don't have any documentation for level 2 yet,
    we just try to behave like an unpatched server and
    generate DCERPC_NCA_S_FAULT_INVALID_TAG instead of
    DCERPC_FAULT_BAD_STUB_DATA.
    Which allows patched Windows clients to keep working
    against a Samba DC.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15418
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    (cherry picked from commit d5f1097b6220676d56ed5fc6707acf667b704518)

commit 5d48ea23decc42ba6f28bd8589ab27630cbe1670
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jul 15 17:25:05 2023 +0200

    s4:torture/rpc: let rpc.schannel also check netr_LogonGetCapabilities with different levels
    
    The important change it that we expect DCERPC_NCA_S_FAULT_INVALID_TAG
    for unsupported query_levels, we allow it to work with servers
    with or without support for query_level=2.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15418
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    (cherry picked from commit 404ce08e9088968311c714e756f5d58ce2cef715)

commit 6e87858185f33318e6206ca831d46643172beb47
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jul 15 17:20:32 2023 +0200

    netlogon.idl: add support for netr_LogonGetCapabilities response level 2
    
    We don't have any documentation about this yet, but tests against
    a Windows Server 2022 patched with KB5028166 revealed that
    the response for query_level=2 is exactly the same as
    for querey_level=1.
    
    Until we know the reason for query_level=2 we won't
    use it as client nor support it in the server, but
    we want ndrdump to work.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15418
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    (cherry picked from commit 5f87888ed53320538cf773d64868390d8641a40e)

commit 1809843614bbd407db221ace2c90faf9259065b0
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 5 18:02:20 2023 +0200

    CVE-2023-34968: mdssvc: return a fake share path
    
    Instead of returning the real server-side absolute path of shares and search
    results, return a fake absolute path replacing the path of the share with the
    share name, iow for a share "test" with a server-side path of "/foo/bar", we
    previously returned
    
      /foo/bar and
      /foo/bar/search/result
    
    and now return
    
      /test and
      /test/search/result
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit cecd415a0abd857831a33d1f0719b870d85e7966
Author: Ralph Boehme <slow at samba.org>
Date:   Sat Jun 17 13:53:27 2023 +0200

    CVE-2023-34968: mdscli: return share relative paths
    
    The next commit will change the Samba Spotlight server to return absolute paths
    that start with the sharename as "/SHARENAME/..." followed by the share path
    relative appended.
    
    So given a share
    
      [spotlight]
        path = /foo/bar
        spotlight = yes
    
    and a file inside this share with a full path of
    
      /foo/bar/dir/file
    
    previously a search that matched this file would returns the absolute
    server-side pato of the file, ie
    
      /foo/bar/dir/file
    
    This will be change to
    
      /spotlight/dir/file
    
    As currently the mdscli library and hence the mdsearch tool print out these
    paths returned from the server, we have to change the output to accomodate these
    fake paths. The only way to do this sensibly is by makeing the paths relative to
    the containing share, so just
    
      dir/file
    
    in the example above.
    
    The client learns about the share root path prefix – real server-side of fake in
    the future – in an initial handshake in the "share_path" out argument of the
    mdssvc_open() RPC call, so the client can use this path to convert the absolute
    path to relative.
    
    There is however an additional twist: the macOS Spotlight server prefixes this
    absolute path with another prefix, typically "/System/Volumes/Data", so in the
    example above the full path for the same search would be
    
      /System/Volumes/Data/foo/bar/dir/file
    
    So macOS does return the full server-side path too, just prefixed with an
    additional path. This path prefixed can be queried by the client in the
    mdssvc_cmd() RPC call with an Spotlight command of "fetchPropertiesForContext:"
    and the path is returned in a dictionary with key "kMDSStorePathScopes". Samba
    just returns "/" for this.
    
    Currently the mdscli library doesn't issue this Spotlight RPC
    request (fetchPropertiesForContext), so this is added in this commit. In the
    end, all search result paths are stripped of the combined prefix
    
      kMDSStorePathScopes + share_path (from mdssvc_open).
    
    eg
    
      kMDSStorePathScopes = /System/Volumes/Data
      share_path = /foo/bar
      search result = /System/Volumes/Data/foo/bar/dir/file
      relative path returned by mdscli = dir/file
    
    Makes sense? :)
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit d6b9c5234ffc6bf415156c693aac3256d17e259c
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 19 18:16:57 2023 +0200

    CVE-2023-34968: mdssvc: introduce an allocating wrapper to sl_pack()
    
    sl_pack_alloc() does the buffer allocation that previously all callers of
    sl_pack() did themselves.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 0fdfc85f28a21f66aa2f1d7e337fe9184368e972
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:05:22 2023 +0200

    CVE-2023-34968: mdssvc: switch to doing an early return
    
    Just reduce indentation of the code handling the success case. No change in
    behaviour.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 34f9f1b37ec07a4f233fe90a0e97ce504e0cdffb
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:42:10 2023 +0200

    CVE-2023-34968: mdssvc: remove response blob allocation
    
    This is alreay done by NDR for us.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 739f72a07032da15b3a74a8b96959300d555e836
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:35:41 2023 +0200

    CVE-2023-34968: rpcclient: remove response blob allocation
    
    This is alreay done by NDR for us.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 7bbaa191be6a1b389604eff75aba9913b0e75d98
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 20 11:28:47 2023 +0200

    CVE-2023-34968: smbtorture: remove response blob allocation in mdssvc.c
    
    This is alreay done by NDR for us.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 82cc2a422db8d4402378c2e6f1e138ff385b0f15
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 19 18:28:41 2023 +0200

    CVE-2023-34968: mdscli: remove response blob allocation
    
    This is handled by the NDR code transparently.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 3636b54616ee63e17d8571af610a0e21d667b592
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Jun 19 17:14:38 2023 +0200

    CVE-2023-34968: mdscli: use correct TALLOC memory context when allocating spotlight_blob
    
    d is talloc_free()d at the end of the functions and the buffer was later used
    after beeing freed in the DCERPC layer when sending the packet.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 8c95f7ae6b3f30ccdc5ce4f0c44b3f8c1fc6a5c8
Author: Ralph Boehme <slow at samba.org>
Date:   Sat Jun 17 13:39:55 2023 +0200

    CVE-2023-34968: mdssvc: add missing "kMDSStoreMetaScopes" dict key in slrpc_fetch_properties()
    
    We were adding the value, but not the key.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit b09e22cfc79845ef751acc9b5ecf479cb56b135f
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jun 6 15:17:26 2023 +0200

    CVE-2023-34968: mdssvc: cache and reuse stat info in struct sl_inode_path_map
    
    Prepare for the "path" being a fake path and not the real server-side
    path where we won't be able to vfs_stat_fsp() this fake path. Luckily we already
    got stat info for the object in mds_add_result() so we can just pass stat info
    from there.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15388
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 843ec381de3f5ce3740679783d3b3637a7474648
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Oct 15 13:29:14 2022 +0200

    CVE-2023-34968: lib: Move subdir_of() to source3/lib/util_path.c
    
    Make it available for other components
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=15207
    Signed-off-by: Volker Lendecke <vl at samba.org>
    (backported from commit d905dbddf8d2655e6c91752b750cbe9c15837ee5)
    [slow at samba.org: subdir_of() didn't exist yet in 4.16 so this just adds it]

commit 5b4353cc60b75610f0aa12b1cced36d35a4d04d4
Author: Ralph Boehme <slow at samba.org>
Date:   Fri May 26 15:06:38 2023 +0200

    CVE-2023-34967: mdssvc: add type checking to dalloc_value_for_key()
    
    Change the dalloc_value_for_key() function to require an additional final
    argument which denotes the expected type of the value associated with a key. If
    the types don't match, return NULL.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15341
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 92d014bc44b32478aa597f38bf11687f1fc95ff1
Author: Ralph Boehme <slow at samba.org>
Date:   Wed May 31 16:26:14 2023 +0200

    CVE-2023-34967: CI: add a test for type checking of dalloc_value_for_key()
    
    Sends a maliciously crafted packet where the value in a key/value style
    dictionary for the "scope" key is a simple string object whereas the server
    expects an array. As the server doesn't perform type validation on the value, it
    crashes when trying to use the "simple" object as a "complex" one.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15341
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit cb6f3e2202473eeccf81e34ebcdb4bc4f726548a
Author: Ralph Boehme <slow at samba.org>
Date:   Fri May 26 13:06:19 2023 +0200

    CVE-2023-34966: mdssvc: harden sl_unpack_loop()
    
    A malicious client could send a packet where subcount is zero, leading to a busy
    loop because
    
        count -= subcount
    =>  count -= 0
    =>  while (count > 0)
    
    loops forever.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15340
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 01cf3cf7a83f0f3fcdf1f4026327c84e4c17f853
Author: Ralph Boehme <slow at samba.org>
Date:   Wed May 31 15:34:26 2023 +0200

    CVE-2023-34966: CI: test for sl_unpack_loop()
    
    Send a maliciously crafted packet where a nil type has a subcount of 0. This
    triggers an endless loop in mdssvc sl_unpack_loop().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15340
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 2eabbe31f64a8456813a502afb05907beb46ffad
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jun 16 12:28:47 2023 +0200

    CVE-2022-2127: ntlm_auth: cap lanman response length value
    
    We already copy at most sizeof(request.data.auth_crap.lm_resp) bytes to the
    lm_resp buffer, but we don't cap the length indicator.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15072
    
    Signed-off-by: Ralph Boehme <slow at samba.org>

commit 5c6fe5a491b16bb658c191cfafb5edc0beb5fab2
Author: Volker Lendecke <vl at samba.org>
Date:   Fri May 20 10:55:23 2022 +0200

    CVE-2022-2127: winbindd: Fix WINBINDD_PAM_AUTH_CRAP length checks
    
    With WBFLAG_BIG_NTLMV2_BLOB being set plus lm_resp_len too large you
    can crash winbind. We don't independently check lm_resp_len
    sufficiently.
    
    Discovered via Coverity ID 1504444 Out-of-bounds access
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15072
    
    Signed-off-by: Volker Lendecke <vl at samba.org>

commit 1dd3ae281b9d9260859822bbf6891e94c2f86882
Author: Samuel Cabrero <scabrero at samba.org>
Date:   Thu Feb 24 17:48:27 2022 +0100

    CVE-2022-2127: s3:winbind: Move big NTLMv2 blob checks to parent process
    
    The winbindd_dual_pam_auth_crap() function will be converted to a local
    RPC call handler and it won't receive a winbindd_cli_state struct. Move
    the checks accessing this struct to the parent.
    
    Signed-off-by: Samuel Cabrero <scabrero at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    (cherry picked from commit 74a511a8eab72cc82940738a1e20e63e12b81374)

-----------------------------------------------------------------------

Summary of changes:
 VERSION                                       |   2 +-
 WHATSNEW.txt                                  |  74 +++++++-
 librpc/idl/netlogon.idl                       |   1 +
 python/samba/tests/blackbox/mdsearch.py       |   8 +-
 python/samba/tests/dcerpc/mdssvc.py           |  26 +--
 source3/lib/util_path.c                       |  52 ++++++
 source3/lib/util_path.h                       |   4 +
 source3/rpc_client/cli_mdssvc.c               | 191 ++++++++++++++++----
 source3/rpc_client/cli_mdssvc_private.h       |   4 +
 source3/rpc_client/cli_mdssvc_util.c          | 148 ++++++++-------
 source3/rpc_client/cli_mdssvc_util.h          |   4 +
 source3/rpc_server/mdssvc/dalloc.c            |  14 +-
 source3/rpc_server/mdssvc/marshalling.c       |  45 +++--
 source3/rpc_server/mdssvc/marshalling.h       |   9 +-
 source3/rpc_server/mdssvc/mdssvc.c            | 142 ++++++++++-----
 source3/rpc_server/mdssvc/mdssvc.h            |   7 +-
 source3/rpc_server/mdssvc/srv_mdssvc_nt.c     |  32 ++--
 source3/rpc_server/netlogon/srv_netlog_nt.c   |  29 ++-
 source3/rpcclient/cmd_spotlight.c             |  48 +----
 source3/utils/ntlm_auth.c                     |   8 +-
 source3/winbindd/winbindd_pam.c               |  12 --
 source3/winbindd/winbindd_pam_auth_crap.c     |  23 +++
 source4/rpc_server/netlogon/dcerpc_netlogon.c |  28 ++-
 source4/torture/rpc/mdssvc.c                  | 250 +++++++++++++++++++++++---
 source4/torture/rpc/netlogon.c                |  77 +++++++-
 25 files changed, 945 insertions(+), 293 deletions(-)


Changeset truncated at 500 lines:

diff --git a/VERSION b/VERSION
index 2d9c8387993..3eb1e7e9d58 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
 ########################################################
 SAMBA_VERSION_MAJOR=4
 SAMBA_VERSION_MINOR=16
-SAMBA_VERSION_RELEASE=10
+SAMBA_VERSION_RELEASE=11
 
 ########################################################
 # If a official release has a serious bug              #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 4ddfe2db83c..2b6da8e411c 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,3 +1,74 @@
+                   ===============================
+                   Release Notes for Samba 4.16.11
+                            July 19, 2023
+                   ===============================
+
+
+This is a security release in order to address the following defects:
+
+o CVE-2022-2127:  When winbind is used for NTLM authentication, a maliciously
+                  crafted request can trigger an out-of-bounds read in winbind
+                  and possibly crash it.
+                  https://www.samba.org/samba/security/CVE-2022-2127.html
+
+o CVE-2023-34966: An infinite loop bug in Samba's mdssvc RPC service for
+                  Spotlight can be triggered by an unauthenticated attacker by
+                  issuing a malformed RPC request.
+                  https://www.samba.org/samba/security/CVE-2023-34966.html
+
+o CVE-2023-34967: Missing type validation in Samba's mdssvc RPC service for
+                  Spotlight can be used by an unauthenticated attacker to
+                  trigger a process crash in a shared RPC mdssvc worker process.
+                  https://www.samba.org/samba/security/CVE-2023-34967.html
+
+o CVE-2023-34968: As part of the Spotlight protocol Samba discloses the server-
+                  side absolute path of shares and files and directories in
+                  search results.
+                  https://www.samba.org/samba/security/CVE-2023-34968.html
+
+
+Changes since 4.16.10
+---------------------
+
+o  Ralph Boehme <slow at samba.org>
+   * BUG 15072: CVE-2022-2127.
+   * BUG 15340: CVE-2023-34966.
+   * BUG 15341: CVE-2023-34967.
+   * BUG 15388: CVE-2023-34968.
+
+o  Samuel Cabrero <scabrero at samba.org>
+   * BUG 15072: CVE-2022-2127.
+
+o  Volker Lendecke <vl at samba.org>
+   * BUG 15072: CVE-2022-2127.
+
+o  Stefan Metzmacher <metze at samba.org>
+   * BUG 15418: Secure channel faulty since Windows 10/11 update 07/2023.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+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.16.10
                            March 29, 2023
@@ -56,8 +127,7 @@ database (https://bugzilla.samba.org/).
 ======================================================================
 
 
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
                    ==============================
                    Release Notes for Samba 4.16.9
                          February 16, 2023
diff --git a/librpc/idl/netlogon.idl b/librpc/idl/netlogon.idl
index d956a661fff..b51767136d3 100644
--- a/librpc/idl/netlogon.idl
+++ b/librpc/idl/netlogon.idl
@@ -1241,6 +1241,7 @@ interface netlogon
 	/* Function 0x15 */
 	typedef [switch_type(uint32)] union {
 		[case(1)] netr_NegotiateFlags server_capabilities;
+		[case(2)] netr_NegotiateFlags server_capabilities;
 	} netr_Capabilities;
 
 	NTSTATUS netr_LogonGetCapabilities(
diff --git a/python/samba/tests/blackbox/mdsearch.py b/python/samba/tests/blackbox/mdsearch.py
index c9156ae6e0e..c8e75661f15 100644
--- a/python/samba/tests/blackbox/mdsearch.py
+++ b/python/samba/tests/blackbox/mdsearch.py
@@ -76,10 +76,7 @@ class MdfindBlackboxTests(BlackboxTestCase):
         self.t.start()
         time.sleep(1)
 
-        pipe = mdssvc.mdssvc('ncacn_np:fileserver[/pipe/mdssvc]', self.get_loadparm())
-        conn = mdscli.conn(pipe, 'spotlight', '/foo')
-        self.sharepath = conn.sharepath()
-        conn.disconnect(pipe)
+        self.sharepath = os.environ["LOCAL_PATH"]
 
         for file in testfiles:
             f = open("%s/%s" % (self.sharepath, file), "w")
@@ -126,5 +123,4 @@ class MdfindBlackboxTests(BlackboxTestCase):
         output = self.check_output("mdsearch --configfile=%s -U %s%%%s fileserver spotlight '*==\"samba*\"'" % (config, username, password))
 
         actual = output.decode('utf-8').splitlines()
-        expected = ["%s/%s" % (self.sharepath, file) for file in testfiles]
-        self.assertEqual(expected, actual)
+        self.assertEqual(testfiles, actual)
diff --git a/python/samba/tests/dcerpc/mdssvc.py b/python/samba/tests/dcerpc/mdssvc.py
index b0df509ddc7..5002e5d26d6 100644
--- a/python/samba/tests/dcerpc/mdssvc.py
+++ b/python/samba/tests/dcerpc/mdssvc.py
@@ -84,10 +84,11 @@ class MdssvcTests(RpcInterfaceTestCase):
         self.t = threading.Thread(target=MdssvcTests.http_server, args=(self,))
         self.t.setDaemon(True)
         self.t.start()
+        self.sharepath = os.environ["LOCAL_PATH"]
         time.sleep(1)
 
         conn = mdscli.conn(self.pipe, 'spotlight', '/foo')
-        self.sharepath = conn.sharepath()
+        self.fakepath = conn.sharepath()
         conn.disconnect(self.pipe)
 
         for file in testfiles:
@@ -105,12 +106,11 @@ class MdssvcTests(RpcInterfaceTestCase):
         self.server.serve_forever()
 
     def run_test(self, query, expect, json_in, json_out):
-        expect = [s.replace("%BASEPATH%", self.sharepath) for s in expect]
         self.server.json_in = json_in.replace("%BASEPATH%", self.sharepath)
         self.server.json_out = json_out.replace("%BASEPATH%", self.sharepath)
 
         self.conn = mdscli.conn(self.pipe, 'spotlight', '/foo')
-        search = self.conn.search(self.pipe, query, self.sharepath)
+        search = self.conn.search(self.pipe, query, self.fakepath)
 
         # Give it some time, the get_results() below returns immediately
         # what's available, so if we ask to soon, we might get back no results
@@ -141,7 +141,7 @@ class MdssvcTests(RpcInterfaceTestCase):
             ]
           }
         }'''
-        exp_results = ["%BASEPATH%/foo", "%BASEPATH%/bar"]
+        exp_results = ["foo", "bar"]
         self.run_test('*=="samba*"', exp_results, exp_json_query, fake_json_response)
 
     def test_mdscli_search_escapes(self):
@@ -181,14 +181,14 @@ class MdssvcTests(RpcInterfaceTestCase):
           }
         }'''
         exp_results = [
-            r"%BASEPATH%/x+x",
-            r"%BASEPATH%/x*x",
-            r"%BASEPATH%/x=x",
-            r"%BASEPATH%/x'x",
-            r"%BASEPATH%/x?x",
-            r"%BASEPATH%/x x",
-            r"%BASEPATH%/x(x",
-            "%BASEPATH%/x\"x",
-            r"%BASEPATH%/x\x",
+            r"x+x",
+            r"x*x",
+            r"x=x",
+            r"x'x",
+            r"x?x",
+            r"x x",
+            r"x(x",
+            "x\"x",
+            r"x\x",
         ]
         self.run_test(sl_query, exp_results, exp_json_query, fake_json_response)
diff --git a/source3/lib/util_path.c b/source3/lib/util_path.c
index c34b734384c..e6bed724551 100644
--- a/source3/lib/util_path.c
+++ b/source3/lib/util_path.c
@@ -23,6 +23,8 @@
 
 #include "replace.h"
 #include <talloc.h>
+#include "lib/util/debug.h"
+#include "lib/util/fault.h"
 #include "lib/util/samba_util.h"
 #include "lib/util_path.h"
 
@@ -210,3 +212,53 @@ char *canonicalize_absolute_path(TALLOC_CTX *ctx, const char *pathname_in)
 	*p++ = '\0';
 	return pathname;
 }
+
+/*
+ * Take two absolute paths, figure out if "subdir" is a proper
+ * subdirectory of "parent". Return the component relative to the
+ * "parent" without the potential "/". Take care of "parent"
+ * possibly ending in "/".
+ */
+bool subdir_of(const char *parent,
+	       size_t parent_len,
+	       const char *subdir,
+	       const char **_relative)
+{
+	const char *relative = NULL;
+	bool matched;
+
+	SMB_ASSERT(parent[0] == '/');
+	SMB_ASSERT(subdir[0] == '/');
+
+	if (parent_len == 1) {
+		/*
+		 * Everything is below "/"
+		 */
+		*_relative = subdir+1;
+		return true;
+	}
+
+	if (parent[parent_len-1] == '/') {
+		parent_len -= 1;
+	}
+
+	matched = (strncmp(subdir, parent, parent_len) == 0);
+	if (!matched) {
+		return false;
+	}
+
+	relative = &subdir[parent_len];
+
+	if (relative[0] == '\0') {
+		*_relative = relative; /* nothing left */
+		return true;
+	}
+
+	if (relative[0] == '/') {
+		/* End of parent must match a '/' in subdir. */
+		*_relative = relative+1;
+		return true;
+	}
+
+	return false;
+}
diff --git a/source3/lib/util_path.h b/source3/lib/util_path.h
index 3e7d04de550..0ea508bf5bb 100644
--- a/source3/lib/util_path.h
+++ b/source3/lib/util_path.h
@@ -31,5 +31,9 @@ char *lock_path(TALLOC_CTX *mem_ctx, const char *name);
 char *state_path(TALLOC_CTX *mem_ctx, const char *name);
 char *cache_path(TALLOC_CTX *mem_ctx, const char *name);
 char *canonicalize_absolute_path(TALLOC_CTX *ctx, const char *abs_path);
+bool subdir_of(const char *parent,
+	       size_t parent_len,
+	       const char *subdir,
+	       const char **_relative);
 
 #endif
diff --git a/source3/rpc_client/cli_mdssvc.c b/source3/rpc_client/cli_mdssvc.c
index 82d14372fe4..03aed61c00c 100644
--- a/source3/rpc_client/cli_mdssvc.c
+++ b/source3/rpc_client/cli_mdssvc.c
@@ -43,10 +43,12 @@ char *mdscli_get_basepath(TALLOC_CTX *mem_ctx,
 struct mdscli_connect_state {
 	struct tevent_context *ev;
 	struct mdscli_ctx *mdscli_ctx;
+	struct mdssvc_blob response_blob;
 };
 
 static void mdscli_connect_open_done(struct tevent_req *subreq);
 static void mdscli_connect_unknown1_done(struct tevent_req *subreq);
+static void mdscli_connect_fetch_props_done(struct tevent_req *subreq);
 
 struct tevent_req *mdscli_connect_send(TALLOC_CTX *mem_ctx,
 				       struct tevent_context *ev,
@@ -111,6 +113,7 @@ static void mdscli_connect_open_done(struct tevent_req *subreq)
 	struct mdscli_connect_state *state = tevent_req_data(
 		req, struct mdscli_connect_state);
 	struct mdscli_ctx *mdscli_ctx = state->mdscli_ctx;
+	size_t share_path_len;
 	NTSTATUS status;
 
 	status = dcerpc_mdssvc_open_recv(subreq, state);
@@ -120,6 +123,18 @@ static void mdscli_connect_open_done(struct tevent_req *subreq)
 		return;
 	}
 
+	share_path_len = strlen(mdscli_ctx->mdscmd_open.share_path);
+	if (share_path_len < 1 || share_path_len > UINT16_MAX) {
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+	mdscli_ctx->mdscmd_open.share_path_len = share_path_len;
+
+	if (mdscli_ctx->mdscmd_open.share_path[share_path_len-1] == '/') {
+		mdscli_ctx->mdscmd_open.share_path[share_path_len-1] = '\0';
+		mdscli_ctx->mdscmd_open.share_path_len--;
+	}
+
 	subreq = dcerpc_mdssvc_unknown1_send(
 			state,
 			state->ev,
@@ -146,6 +161,8 @@ static void mdscli_connect_unknown1_done(struct tevent_req *subreq)
 		subreq, struct tevent_req);
 	struct mdscli_connect_state *state = tevent_req_data(
 		req, struct mdscli_connect_state);
+	struct mdscli_ctx *mdscli_ctx = state->mdscli_ctx;
+	struct mdssvc_blob request_blob;
 	NTSTATUS status;
 
 	status = dcerpc_mdssvc_unknown1_recv(subreq, state);
@@ -154,6 +171,108 @@ static void mdscli_connect_unknown1_done(struct tevent_req *subreq)
 		return;
 	}
 
+	status = mdscli_blob_fetch_props(state,
+					 state->mdscli_ctx,
+					 &request_blob);
+	if (tevent_req_nterror(req, status)) {
+		return;
+	}
+
+	subreq = dcerpc_mdssvc_cmd_send(state,
+					state->ev,
+					mdscli_ctx->bh,
+					&mdscli_ctx->ph,
+					0,
+					mdscli_ctx->dev,
+					mdscli_ctx->mdscmd_open.unkn2,
+					0,
+					mdscli_ctx->flags,
+					request_blob,
+					0,
+					mdscli_ctx->max_fragment_size,
+					1,
+					mdscli_ctx->max_fragment_size,
+					0,
+					0,
+					&mdscli_ctx->mdscmd_cmd.fragment,
+					&state->response_blob,
+					&mdscli_ctx->mdscmd_cmd.unkn9);
+	if (tevent_req_nomem(subreq, req)) {
+		return;
+	}
+	tevent_req_set_callback(subreq, mdscli_connect_fetch_props_done, req);
+	mdscli_ctx->async_pending++;
+	return;
+}
+
+static void mdscli_connect_fetch_props_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct mdscli_connect_state *state = tevent_req_data(
+		req, struct mdscli_connect_state);
+	struct mdscli_ctx *mdscli_ctx = state->mdscli_ctx;
+	DALLOC_CTX *d = NULL;
+	sl_array_t *path_scope_array = NULL;
+	char *path_scope = NULL;
+	NTSTATUS status;
+	bool ok;
+
+	status = dcerpc_mdssvc_cmd_recv(subreq, state);
+	TALLOC_FREE(subreq);
+	state->mdscli_ctx->async_pending--;
+	if (tevent_req_nterror(req, status)) {
+		return;
+	}
+
+	d = dalloc_new(state);
+	if (tevent_req_nomem(d, req)) {
+		return;
+	}
+
+	ok = sl_unpack(d,
+		       (char *)state->response_blob.spotlight_blob,
+		       state->response_blob.length);
+	if (!ok) {
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+
+	path_scope_array = dalloc_value_for_key(d,
+						"DALLOC_CTX", 0,
+						"kMDSStorePathScopes",
+						"sl_array_t");
+	if (path_scope_array == NULL) {
+		DBG_ERR("Missing kMDSStorePathScopes\n");
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+
+	path_scope = dalloc_get(path_scope_array, "char *", 0);
+	if (path_scope == NULL) {
+		DBG_ERR("Missing path in kMDSStorePathScopes\n");
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+
+	mdscli_ctx->path_scope_len = strlen(path_scope);
+	if (mdscli_ctx->path_scope_len < 1 ||
+	    mdscli_ctx->path_scope_len > UINT16_MAX)
+	{
+		DBG_ERR("Bad path_scope: %s\n", path_scope);
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return;
+	}
+	mdscli_ctx->path_scope = talloc_strdup(mdscli_ctx, path_scope);
+	if (tevent_req_nomem(mdscli_ctx->path_scope, req)) {
+		return;
+	}
+
+	if (mdscli_ctx->path_scope[mdscli_ctx->path_scope_len-1] == '/') {
+		mdscli_ctx->path_scope[mdscli_ctx->path_scope_len-1] = '\0';
+		mdscli_ctx->path_scope_len--;
+	}
+
 	tevent_req_done(req);
 }
 
@@ -276,15 +395,6 @@ struct tevent_req *mdscli_search_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	state->response_blob.spotlight_blob = talloc_array(
-		state,
-		uint8_t,
-		mdscli_ctx->max_fragment_size);
-	if (tevent_req_nomem(state->response_blob.spotlight_blob, req)) {
-		return tevent_req_post(req, ev);
-	}
-	state->response_blob.size = mdscli_ctx->max_fragment_size;
-
 	subreq = dcerpc_mdssvc_cmd_send(state,
 					ev,
 					mdscli_ctx->bh,
@@ -457,15 +567,6 @@ struct tevent_req *mdscli_get_results_send(
 		return tevent_req_post(req, ev);
 	}
 
-	state->response_blob.spotlight_blob = talloc_array(
-		state,
-		uint8_t,
-		mdscli_ctx->max_fragment_size);
-	if (tevent_req_nomem(state->response_blob.spotlight_blob, req)) {
-		return tevent_req_post(req, ev);
-	}
-	state->response_blob.size = mdscli_ctx->max_fragment_size;
-
 	subreq = dcerpc_mdssvc_cmd_send(state,
 					ev,
 					mdscli_ctx->bh,
@@ -681,15 +782,6 @@ struct tevent_req *mdscli_get_path_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
-	state->response_blob.spotlight_blob = talloc_array(
-		state,
-		uint8_t,
-		mdscli_ctx->max_fragment_size);
-	if (tevent_req_nomem(state->response_blob.spotlight_blob, req)) {
-		return tevent_req_post(req, ev);
-	}
-	state->response_blob.size = mdscli_ctx->max_fragment_size;
-
 	subreq = dcerpc_mdssvc_cmd_send(state,
 					ev,
 					mdscli_ctx->bh,
@@ -724,7 +816,10 @@ static void mdscli_get_path_done(struct tevent_req *subreq)
 	struct mdscli_get_path_state *state = tevent_req_data(
 		req, struct mdscli_get_path_state);
 	DALLOC_CTX *d = NULL;
+	size_t pathlen;
+	size_t prefixlen;
 	char *path = NULL;
+	const char *p = NULL;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list