CVE-2023-3961:s3:torture: Add test SMB2-INVALID-PIPENAME to show we allow bad pipenam...
authorJeremy Allison <jra@samba.org>
Wed, 26 Jul 2023 00:49:21 +0000 (17:49 -0700)
committerJule Anger <janger@samba.org>
Sun, 8 Oct 2023 20:05:41 +0000 (22:05 +0200)
The raw SMB2-INVALID-PIPENAME test passes against Windows 2022,
as it just returns NT_STATUS_OBJECT_NAME_NOT_FOUND.

Add the knownfail.

BUG:https://bugzilla.samba.org/show_bug.cgi?id=15422

Signed-off-by: Jeremy Allison <jra@samba.org>
selftest/knownfail.d/badpipename [new file with mode: 0644]
source3/selftest/tests.py
source3/torture/proto.h
source3/torture/test_smb2.c
source3/torture/torture.c

diff --git a/selftest/knownfail.d/badpipename b/selftest/knownfail.d/badpipename
new file mode 100644 (file)
index 0000000..e69715f
--- /dev/null
@@ -0,0 +1 @@
+^samba3.smbtorture_s3.smb2.SMB2-INVALID-PIPENAME.smbtorture\(fileserver\)
index 1fdcad1089f92bf0679c22eae6d55e71b1e52015..2c8336d35e87df1801ae6458bf5a96329229dc9b 100755 (executable)
@@ -309,6 +309,20 @@ plantestsuite("samba3.smbtorture_s3.smb2.SMB2-DFS-FILENAME-LEADING-BACKSLASH",
                 smbtorture3,
                 "-mSMB2"])
 
+# BUG: https://bugzilla.samba.org/show_bug.cgi?id=15422
+# Prevent bad pipenames.
+#
+plantestsuite("samba3.smbtorture_s3.smb2.SMB2-INVALID-PIPENAME",
+                "fileserver",
+                [os.path.join(samba3srcdir,
+                              "script/tests/test_smbtorture_s3.sh"),
+                'SMB2-INVALID-PIPENAME',
+                '//$SERVER_IP/tmp',
+                '$USERNAME',
+                '$PASSWORD',
+                smbtorture3,
+                "-mSMB2"])
+
 #
 # SMB2-NON-DFS-SHARE needs to run against a special share non-msdfs-pathname-share
 # This is an empty non-DFS share with no links, used merely to test
index 21d7b3e00a7f2c044f0363adfa235913fe26deeb..3751697596ae5c37b9ca7e8bf58da0de05a7cc83 100644 (file)
@@ -125,6 +125,7 @@ bool run_smb2_non_dfs_share(int dummy);
 bool run_smb2_dfs_share_non_dfs_path(int dummy);
 bool run_smb2_dfs_filename_leading_backslash(int dummy);
 bool run_smb2_pipe_read_async_disconnect(int dummy);
+bool run_smb2_invalid_pipename(int dummy);
 bool run_smb1_dfs_paths(int dummy);
 bool run_smb1_dfs_search_paths(int dummy);
 bool run_smb1_dfs_operations(int dummy);
index 269ade4ef619b67cb8a3311e76fcb5fdbbf46044..7ea3d83de1028bafa46d6f76c4428b1b42a6c777 100644 (file)
@@ -5253,3 +5253,110 @@ bool run_smb2_pipe_read_async_disconnect(int dummy)
        }
        return retval;
 }
+
+bool run_smb2_invalid_pipename(int dummy)
+{
+       struct cli_state *cli = NULL;
+       NTSTATUS status;
+       uint64_t fid_persistent = 0;
+       uint64_t fid_volatile = 0;
+       const char *unknown_pipe = "badpipe";
+       const char *invalid_pipe = "../../../../../../../../../badpipe";
+
+       printf("Starting SMB2-INVALID-PIPENAME\n");
+
+       if (!torture_init_connection(&cli)) {
+               return false;
+       }
+
+       status = smbXcli_negprot(cli->conn,
+                               cli->timeout,
+                               PROTOCOL_SMB2_02,
+                               PROTOCOL_SMB3_11);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("smbXcli_negprot returned %s\n", nt_errstr(status));
+               return false;
+       }
+
+       status = cli_session_setup_creds(cli, torture_creds);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_session_setup returned %s\n", nt_errstr(status));
+               return false;
+       }
+
+       status = cli_tree_connect(cli, "IPC$", "?????", NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("cli_tree_connect returned %s\n", nt_errstr(status));
+               return false;
+       }
+
+       /* Try and connect to an unknown pipename. */
+       status = smb2cli_create(cli->conn,
+                               cli->timeout,
+                               cli->smb2.session,
+                               cli->smb2.tcon,
+                               unknown_pipe,
+                               SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
+                               SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
+                               SEC_STD_SYNCHRONIZE|
+                                       SEC_FILE_READ_DATA|
+                                       SEC_FILE_WRITE_DATA|
+                                       SEC_FILE_READ_ATTRIBUTE, /* desired_access, */
+                               FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
+                               FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
+                               FILE_CREATE, /* create_disposition, */
+                               0, /* create_options, */
+                               NULL, /* smb2_create_blobs *blobs */
+                               &fid_persistent,
+                               &fid_volatile,
+                               NULL, /* struct smb_create_returns * */
+                               talloc_tos(), /* mem_ctx. */
+                               NULL, /* struct smb2_create_blobs * */
+                               NULL); /* struct symlink_reparse_struct */
+       /* We should get NT_STATUS_OBJECT_NAME_NOT_FOUND */
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
+               printf("%s:%d smb2cli_create on name %s returned %s\n",
+                       __FILE__,
+                       __LINE__,
+                       unknown_pipe,
+                       nt_errstr(status));
+               return false;
+       }
+
+       /* Try and connect to an invalid pipename containing unix separators. */
+       status = smb2cli_create(cli->conn,
+                               cli->timeout,
+                               cli->smb2.session,
+                               cli->smb2.tcon,
+                               invalid_pipe,
+                               SMB2_OPLOCK_LEVEL_NONE, /* oplock_level, */
+                               SMB2_IMPERSONATION_IMPERSONATION, /* impersonation_level, */
+                               SEC_STD_SYNCHRONIZE|
+                                       SEC_FILE_READ_DATA|
+                                       SEC_FILE_WRITE_DATA|
+                                       SEC_FILE_READ_ATTRIBUTE, /* desired_access, */
+                               FILE_ATTRIBUTE_NORMAL, /* file_attributes, */
+                               FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access, */
+                               FILE_CREATE, /* create_disposition, */
+                               0, /* create_options, */
+                               NULL, /* smb2_create_blobs *blobs */
+                               &fid_persistent,
+                               &fid_volatile,
+                               NULL, /* struct smb_create_returns * */
+                               talloc_tos(), /* mem_ctx. */
+                               NULL, /* struct smb2_create_blobs * */
+                               NULL); /* struct symlink_reparse_struct */
+       /*
+        * We should still get NT_STATUS_OBJECT_NAME_NOT_FOUND
+        * (tested against Windows 2022).
+        */
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
+               printf("%s:%d smb2cli_create on name %s returned %s\n",
+                       __FILE__,
+                       __LINE__,
+                       invalid_pipe,
+                       nt_errstr(status));
+               return false;
+       }
+       return true;
+}
index 1315b328f5f51085ffc2ac6a2d92bbb462227eb1..d53699c3b0215aa8efe98c8dfa31c22db042bef8 100644 (file)
@@ -15763,6 +15763,10 @@ static struct {
                .name  = "SMB2-DFS-FILENAME-LEADING-BACKSLASH",
                .fn    = run_smb2_dfs_filename_leading_backslash,
        },
+       {
+               .name  = "SMB2-INVALID-PIPENAME",
+               .fn    = run_smb2_invalid_pipename,
+       },
        {
                .name  = "SMB2-PIPE-READ-ASYNC-DISCONNECT",
                .fn    = run_smb2_pipe_read_async_disconnect,