dcesrv_core: alter_context logon failures should result in DCERPC_FAULT_ACCESS_DENIED
authorStefan Metzmacher <metze@samba.org>
Thu, 12 Nov 2020 15:41:21 +0000 (16:41 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 23 Jan 2024 10:14:09 +0000 (11:14 +0100)
We should use DCERPC_FAULT_ACCESS_DENIED as default for
gensec status results of e.g. NT_STATUS_LOGON_FAILURE or
NT_STATUS_INVALID_PARAMTER.

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

Signed-off-by: Stefan Metzmacher <metze@samba.org>
librpc/rpc/dcesrv_core.c

index 747d41704ca8d954d2c0e9cce8eebceb0e7e5fde..10b6535a16bfcaeb7bddf1c9a222e1e6c2694767 100644 (file)
@@ -1904,7 +1904,20 @@ static void dcesrv_alter_done(struct tevent_req *subreq)
 
        status = dcesrv_auth_complete(call, status);
        if (!NT_STATUS_IS_OK(status)) {
-               status = dcesrv_fault_disconnect(call, DCERPC_FAULT_SEC_PKG_ERROR);
+               /*
+                * NT_STATUS_ACCESS_DENIED from gensec means
+                * a signing check or decryption failure,
+                * which should result in DCERPC_FAULT_SEC_PKG_ERROR.
+                *
+                * Any other status, e.g. NT_STATUS_LOGON_FAILURE or
+                * NT_STATUS_INVALID_PARAMETER should result in
+                * DCERPC_FAULT_ACCESS_DENIED.
+                */
+               if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) {
+                       status = dcesrv_fault_disconnect(call, DCERPC_FAULT_SEC_PKG_ERROR);
+               } else {
+                       status = dcesrv_fault_disconnect(call, DCERPC_FAULT_ACCESS_DENIED);
+               }
                dcesrv_conn_auth_wait_finished(conn, status);
                return;
        }