Fedora Account System
Red Hat Associate
Red Hat Customer
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.