summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2021-11-18 11:48:42 -0800
committerJule Anger <janger@samba.org>2022-01-31 12:23:53 +0100
commit4fc4bd4f20cdfcf1df63f76f2f9940808b286c72 (patch)
treeec7b9259927b5c7bd854674593e89e9b05e8be3b
parent738c7080e78553b9f6eeef778522a1df9a88f977 (diff)
downloadsamba-4fc4bd4f20cdfcf1df63f76f2f9940808b286c72.tar.gz
CVE-2021-44141: s3: smbd: Tighten up info level checks for SMB1+POSIX to make sure POSIX was negotiated first.
Add knownfail file knownfail.d/posix_infolevel_fails for tests that don't currently negotiate SMB1+POSIX before using SMB1+POSIX calls. These are: samba3.smbtorture_s3.plain.POSIX-BLOCKING-LOCK.smbtorture\(nt4_dc_smb1\) samba3.blackbox.acl_xattr.NT1.nt_affects_posix.* samba3.blackbox.acl_xattr.NT1.nt_affects_chown.* samba3.blackbox.acl_xattr.NT1.nt_affects_chgrp.* samba3.blackbox.inherit_owner.*.NT1.*verify.*unix\ owner.* samba3.unix.info2.info2\(nt4_dc_smb1\) samba3.unix.info2.info2\(ad_dc_smb1\) samba3.raw.search.one\ file\ search.* BUG: https://bugzilla.samba.org/show_bug.cgi?id=14911 Signed-off-by: Jeremy Allison <jra@samba.org>
-rw-r--r--selftest/knownfail.d/posix_infolevel_fails8
-rw-r--r--source3/smbd/trans2.c60
2 files changed, 62 insertions, 6 deletions
diff --git a/selftest/knownfail.d/posix_infolevel_fails b/selftest/knownfail.d/posix_infolevel_fails
new file mode 100644
index 00000000000..78a6781684c
--- /dev/null
+++ b/selftest/knownfail.d/posix_infolevel_fails
@@ -0,0 +1,8 @@
+^samba3.smbtorture_s3.plain.POSIX-BLOCKING-LOCK.smbtorture\(nt4_dc_smb1\)
+^samba3.blackbox.acl_xattr.NT1.nt_affects_posix.*
+^samba3.blackbox.acl_xattr.NT1.nt_affects_chown.*
+^samba3.blackbox.acl_xattr.NT1.nt_affects_chgrp.*
+^samba3.blackbox.inherit_owner.*.NT1.*verify.*unix\ owner.*
+^samba3.unix.info2.info2\(nt4_dc_smb1\)
+^samba3.unix.info2.info2\(ad_dc_smb1\)
+^samba3.raw.search.one\ file\ search.*
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 3ba7011b989..33ba9da9f83 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -2717,6 +2717,10 @@ close_if_end = %d requires_resume_key = %d backup_priv = %d level = 0x%x, max_da
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
goto out;
}
+ if (!req->posix_pathnames) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ goto out;
+ }
break;
default:
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
@@ -3183,6 +3187,10 @@ resume_key = %d resume name = %s continue=%d level = %d\n",
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
return;
}
+ if (!req->posix_pathnames) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
break;
default:
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
@@ -5144,8 +5152,13 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
uint32_t access_mask = 0;
size_t len = 0;
- if (INFO_LEVEL_IS_UNIX(info_level) && !lp_unix_extensions()) {
- return NT_STATUS_INVALID_LEVEL;
+ if (INFO_LEVEL_IS_UNIX(info_level)) {
+ if (!lp_unix_extensions()) {
+ return NT_STATUS_INVALID_LEVEL;
+ }
+ if (!req->posix_pathnames) {
+ return NT_STATUS_INVALID_LEVEL;
+ }
}
DEBUG(5,("smbd_do_qfilepathinfo: %s (%s) level=%d max_data=%u\n",
@@ -5958,9 +5971,15 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
DEBUG(3,("call_trans2qfilepathinfo: TRANSACT2_QFILEINFO: level = %d\n", info_level));
- if (INFO_LEVEL_IS_UNIX(info_level) && !lp_unix_extensions()) {
- reply_nterror(req, NT_STATUS_INVALID_LEVEL);
- return;
+ if (INFO_LEVEL_IS_UNIX(info_level)) {
+ if (!lp_unix_extensions()) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
+ if (!req->posix_pathnames) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
}
/* Initial check for valid fsp ptr. */
@@ -6053,6 +6072,10 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
return;
}
+ if (!req->posix_pathnames) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
}
if (req->posix_pathnames) {
@@ -9061,7 +9084,9 @@ NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn,
if (!lp_unix_extensions()) {
return NT_STATUS_INVALID_LEVEL;
}
-
+ if (!req->posix_pathnames) {
+ return NT_STATUS_INVALID_LEVEL;
+ }
status = smbd_do_posix_setfilepathinfo(conn,
req,
req,
@@ -9282,6 +9307,17 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
}
info_level = SVAL(params,2);
+ if (INFO_LEVEL_IS_UNIX(info_level)) {
+ if (!lp_unix_extensions()) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
+ if (!req->posix_pathnames) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
+ }
+
smb_fname = fsp->fsp_name;
if (fsp_get_pathref_fd(fsp) == -1) {
@@ -9360,6 +9396,18 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
}
info_level = SVAL(params,0);
+
+ if (INFO_LEVEL_IS_UNIX(info_level)) {
+ if (!lp_unix_extensions()) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
+ if (!req->posix_pathnames) {
+ reply_nterror(req, NT_STATUS_INVALID_LEVEL);
+ return;
+ }
+ }
+
if (req->posix_pathnames) {
srvstr_get_path_posix(req,
params,