Bug 2478664 (CVE-2026-104044)

Summary: CVE-2026-104044 sssd: sssd: Denial of Service via crafted passkey Kerberos authentication request
Product: [Other] Security Response Reporter: OSIDB Bzimport <bzimport>
Component: vulnerabilityAssignee: Product Security DevOps Team <prodsec-dev>
Status: NEW --- QA Contact:
Severity: medium Docs Contact:
Priority: medium    
Version: unspecifiedCC: akhatavk, aos-team-art-private, asdas, dpaolell, jdelft, jupierce, lgarciaa, mbiarnes, ppalepu, ppostler, prdhamdh, rhel-process-autobot, security-response-team, sghai, sidsharm, suppawar, vlaad, watson-tool-maintainers
Target Milestone: ---Keywords: Security
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: ---
Doc Text:
A flaw was found in sssd. A local attacker can trigger a Denial of Service (DoS) by sending a specially crafted Pluggable Authentication Module (PAM) request when passkey authentication is enabled. Due to a missing state validation check in passkey Kerberos handling, the PAM responder dereferences an uninitialized pointer and crashes. This failure disrupts authentication services on the host.
Story Points: ---
Clone Of: Environment:
Last Closed: Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On: 2546262, 2546258    
Bug Blocks:    

Description OSIDB Bzimport 2026-05-18 03:41:45 UTC
AI_ONLY_REPORT
package: sssd-2.12.0-1.el10
------
Summary: Reachable NULL Pointer Dereference in `passkey_kerberos`  
(`SSS_AUTHTOK_TYPE_PASSKEY_KRB`) causing Local DoS: crafted local PAM  
authentication requests can reach `passkey_kerberos()` before passkey  
pre-auth state is initialized and crash `sssd_pam`.
Requirements to exploit: Local access to the PAM responder socket and the  
ability to send a crafted `SSS_PAM_AUTHENTICATE` request with `authtok`  
type `SSS_AUTHTOK_TYPE_PASSKEY_KRB`, a non-NULL passkey `prompt` and `key`,  
and no prior successful `SSS_PAM_PREAUTH` that would initialize  
`pk_table_data`. The affected path is present only when the package is  
built with `BUILD_PASSKEY` and `pam_passkey_auth` is enabled; deployments  
that restrict PAM responder access to trusted users reduce reachability.
Component affected: `sssd-2.12.0-1.el10`, PAM responder passkey handling in  
`src/responder/pam/pamsrv_passkey.c` (`passkey_kerberos()`), with  
reachability from `src/responder/pam/pamsrv_cmd.c` and state initialization  
in `save_passkey_data()`.
Version affected: `sssd-2.12.0-1.el10`, when built with passkey support  
(`BUILD_PASSKEY`) and with `pam_passkey_auth = true`
Patch available: no released package fix established; proposed patch  
included below
Version fixed: unknown
Upstream coordination: Not notified.
CVSS: CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - 6.2 (MEDIUM)
AV:L - exploitation requires local access to the PAM responder socket.
AC:L - the attacker only needs to send a crafted request that selects  
`SSS_AUTHTOK_TYPE_PASSKEY_KRB` without first establishing passkey pre-auth  
state.
PR:N - under the default PAM responder posture in this tree, the crafted  
request path does not require elevated privileges or prior authorization to  
the vulnerable code path; restricting responder access to trusted users  
reduces reachability.
UI:N - no user interaction is required once the crafted request is sent.
S:U - the crash occurs within the PAM responder's own security scope.
C:N - no confidentiality impact was established.
I:N - no integrity impact was established.
A:H - successful exploitation can crash `sssd_pam` and disrupt  
authentication handling on the host.
Impact: Moderate. Under Red Hat severity guidance, this is best classified  
as Moderate because it can disrupt availability of an authentication  
responder, but the available evidence supports only a local denial of  
service, not remote reachability, privilege escalation, or  
confidentiality/integrity compromise. The issue is also conditional on  
passkey support being built and enabled.
Embargo: no
Reason: This is a local denial-of-service issue with straightforward  
mitigations, no demonstrated confidentiality or integrity impact, and no  
evidence of remote exploitation. Public disclosure without embargo is  
appropriate.
Acknowledgement: Aisle Research
Vulnerability Details: `passkey_kerberos()` validates that the  
attacker-controlled passkey blob contains non-NULL `prompt` and `key`  
fields, but it does not verify that `pctx->pk_table_data` exists before  
dereferencing `pctx->pk_table_data->table`:
```c
if (prompt == NULL || key == NULL) {
DEBUG(SSSDBG_OP_FAILURE,
"Passkey prompt and key are missing or invalid.\n");
return EIO;
}
data = sss_ptr_hash_lookup(pctx->pk_table_data->table, key,
struct pk_child_user_data);
if (data == NULL) {
DEBUG(SSSDBG_OP_FAILURE,
"Failed to lookup passkey authtok\n");
return EIO;
}
```
That state is allocated in `save_passkey_data()`, which is reached from  
passkey pre-auth response handling:
```c
pctx->pk_table_data = talloc_zero(tmp_ctx, struct  
pam_passkey_table_data);
if (pctx->pk_table_data == NULL) {
return ENOMEM;
}
if (pctx->pk_table_data->table == NULL) {
pctx->pk_table_data->table =  
sss_ptr_hash_create(pctx->pk_table_data,
NULL, NULL);
if (pctx->pk_table_data->table == NULL) {
ret = ENOMEM;
goto done;
}
}
```
The authenticate path can still dispatch to `passkey_kerberos()` based on  
token type alone:
```c
#ifdef BUILD_PASSKEY
if ((pd->cmd == SSS_PAM_AUTHENTICATE)) {
if (may_do_passkey_auth(pctx, pd)) {
if (sss_authtok_get_type(pd->authtok) ==  
SSS_AUTHTOK_TYPE_PASSKEY_KRB) {
ret = passkey_kerberos(pctx, preq->pd, preq);
goto done;
} else if ((sss_authtok_get_type(pd->authtok) ==  
SSS_AUTHTOK_TYPE_PASSKEY) ||
(sss_authtok_get_type(pd->authtok) ==  
SSS_AUTHTOK_TYPE_EMPTY)) {
ret = passkey_local(cctx, cctx->ev, pctx, preq, pd);
```
The request parser also accepts `SSS_AUTHTOK_TYPE_PASSKEY_KRB` directly  
from client input:
```c
case SSS_AUTHTOK_TYPE_PASSKEY:
case SSS_AUTHTOK_TYPE_PASSKEY_KRB:
case SSS_AUTHTOK_TYPE_PASSKEY_REPLY:
case SSS_AUTHTOK_TYPE_PAM_STACKED:
ret = sss_authtok_set(tok, auth_token_type,
auth_token_data, auth_token_length);
break;
```
As a result, a crafted local `SSS_PAM_AUTHENTICATE` request can select the  
passkey-Kerberos path without first populating `pk_table_data`. When that  
happens, the dereference of `pctx->pk_table_data->table` triggers a NULL  
pointer dereference and crashes `sssd_pam`. The available evidence supports  
availability impact only.
Steps to reproduce:
1. Use a build with passkey support enabled (`BUILD_PASSKEY`) and with  
`pam_passkey_auth = true`.
2. Connect to the PAM responder UNIX socket (`.../pipes/pam`).
3. Send a protocol v3 `SSS_PAM_AUTHENTICATE` request with `authtok` type  
`SSS_AUTHTOK_TYPE_PASSKEY_KRB`, a passkey blob containing non-NULL `prompt`  
and `key` fields, and no prior successful `SSS_PAM_PREAUTH` that would  
populate `pk_table_data`.
4. Observe `sssd_pam` crash from the NULL dereference at  
`pctx->pk_table_data->table` in `passkey_kerberos()`.
Mitigation: If passkey authentication is not required, disable  
`pam_passkey_auth` to remove the vulnerable path. Where operationally  
feasible, restrict PAM responder access to explicitly trusted users instead  
of relying on the default trusted-user posture. These measures reduce or  
remove reachability but do not replace a code fix.
Proposed Fix: Add a guard before dereferencing `pctx->pk_table_data->table`  
and return an error when passkey Kerberos state has not been initialized.
```diff
diff --git a/src/responder/pam/pamsrv_passkey.c  
b/src/responder/pam/pamsrv_passkey.c
— a/src/responder/pam/pamsrv_passkey.c
+++ b/src/responder/pam/pamsrv_passkey.c
@@ -144,6 +144,13 @@ errno_t passkey_kerberos(struct pam_ctx *pctx,
return EIO;
}
+    if (pctx->pk_table_data == NULL || pctx->pk_table_data->table == NULL)  
{
+        DEBUG(SSSDBG_OP_FAILURE,
+              "Passkey KRB state table missing (pre-auth state not  
initialized).\n");
+        return EIO;
+    }
+
data = sss_ptr_hash_lookup(pctx->pk_table_data->table, key,
struct pk_child_user_data);
if (data == NULL) {
```
------
This report was generated using AI technology. Always review AI-generated  
content prior to use