CVE-2026-109971: Clevis: clevis: pkcs#11 token pin exposed on command line via pkcs11-tool
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.
Other sources
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 ${PINvalue} ${moduleopt} ${mechanismoption} ${slotopt}
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:CLEVISPKCS11PIN), which would prevent command-line exposure since /proc/<pid>/environ is mode 0400 (owner-only). This is supported by pkcs11-tool's utilgetpin() function in OpenSC source (src/tools/util.c).
Additionally, the variables ${ENC}, ${PINvalue}, ${moduleopt}, ${mechanismoption}, ${slotopt} 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.
— Red Hat
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Pass the PKCS#11 token PIN to pkcs11-tool using the -p env:CLEVIS_PKCS11_PIN form instead of passing the PIN value directly on the command line.
clevis-decrypt-pkcs11 pkcs11-tool PIN argument = env:CLEVIS_PKCS11_PIN
Event History
Frequently Asked Questions
Which systems are exposed to this issue?
Systems using the Clevis PKCS#11 pin in the default production decryption flow are exposed. The affected clevis-decrypt-pkcs11 path is exercised on every boot.
What does an attacker need to exploit the exposure?
An attacker needs local access sufficient to view process listings or /proc/<pid>/cmdline while pkcs11-tool is running. To use a captured PIN for unauthorized private-key operations, the attacker also needs physical access to the PKCS#11 token.
How can I determine whether the PIN may have been exposed?
The PIN is visible for the lifetime of the pkcs11-tool process through ps aux or /proc/<pid>/cmdline. Review whether untrusted local users could observe processes during boot or while Clevis performs PKCS#11 decryption.
What mitigation is described if a fix cannot be applied immediately?
Use pkcs11-tool's environment-variable PIN support, such as -p env:CLEVIS_PKCS11_PIN, instead of supplying the PIN directly on the command line. The provided data states that /proc/<pid>/environ is mode 0400 and owner-only, preventing the command-line exposure.