Bug 2550363 (CVE-2026-109971)

Summary: CVE-2026-109971 clevis: clevis: PKCS#11 token PIN exposed on command line via pkcs11-tool
Product: [Other] Security Response Reporter: OSIDB Bzimport <bzimport>
Component: vulnerabilityAssignee: Product Security <prodsec-ir-bot>
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 the clevis PKCS#11 pin. The clevis-decrypt-pkcs11 script passes the PKCS#11 token PIN as a command-line argument to pkcs11-tool, making it visible to any local user through process listing or the /proc filesystem.
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:
Deadline: 2026-12-07   

Description OSIDB Bzimport 2026-10-13 11:35:13 UTC
The clevis-decrypt-pkcs11 script passes the PKCS#11 token PIN via the -p command-line argument to pkcs11-tool at lines 121-122:

  pkcs11-tool --login --decrypt --input-file ${ENC} \
      -p ${PIN_value} ${module_opt} ${mechanism_option} ${slot_opt}

This makes the PIN visible to any local user via /proc/<pid>/cmdline or ps aux for the lifetime of the pkcs11-tool process. Unlike the daemon's -k flag (which is not used in production), this code path is exercised in the default production flow on every boot.

The PIN is the authentication credential for the PKCS#11 token. An attacker who captures the PIN and has physical access to the token can perform unauthorized private key operations.

The pkcs11-tool binary supports reading the PIN from an environment variable via the env: prefix on the -p flag (e.g., -p env:CLEVIS_PKCS11_PIN), which would prevent command-line exposure since /proc/<pid>/environ is mode 0400 (owner-only). This is supported by pkcs11-tool's util_get_pin() function in OpenSC source (src/tools/util.c).

Additionally, the variables ${ENC}, ${PIN_value}, ${module_opt}, ${mechanism_option}, ${slot_opt} are all passed unquoted to pkcs11-tool, which is a secondary correctness issue (word splitting/globbing) but not security-critical.

Affected files: src/pins/pkcs11/clevis-decrypt-pkcs11 (lines 121-122)
Versions affected: >= v21 through v22 (latest)

Steps to reproduce:
1. Boot a system using Clevis PKCS#11 pin for LUKS decryption.
2. During boot, as any local user: while true; do ps aux | grep '[p]kcs11-tool.*-p' && break; sleep 0.01; done
3. If the timing window is hit, the PIN appears in the pkcs11-tool command-line arguments.