Secret key base leaks into logs via wrong-typed Plug.Crypto arguments
Key facts
- Attack vector
- Network
- Privileges required
- High
- User interaction
- None
- Attack complexity
- Low
- Attack requirements
- None
- Impact type
- Information disclosure
- Confidentiality · integrity · availability
- Low · None · None
- Fix status
- Fixed
Attack profile from CVSS 4.0 · CNA. Fix status from CNA. Impact type from CWE-532.
Summary
Plug.Crypto in plug from 1.6.3 before 1.7.0 and plug_crypto from 1.0.0 before 2.2.1 exposes argument values when a guard fails. A wrong-typed argument raises FunctionClauseError with the secret key base in the top stack frame, which Plug.Cowboy and Bandit write to logs (CWE-532). An unauthenticated remote attacker can obtain the secret key base from application logs or an error tracker, but needs separate access to those logs.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
Description from the CNA
Externally-Generated Error Message Containing Sensitive Information vulnerability in plug_crypto in elixir-plug plug_crypto allows an unauthenticated remote attacker to expose the secret key base through application logs via a wrong-typed argument. Every public function in Plug.Crypto validates argument types in a function-head guard. A failed guard makes the Erlang VM raise FunctionClauseError with the actual argument values in the top stack frame, so the secret key base, a derived key, or the value an API key is compared against lands in that frame. The library's rescue blocks and Plug.Crypto.prune_args_from_stacktrace/1 only reach exceptions raised inside a function body, so they never see a guard failure. Plug.Cowboy and Bandit write the frame to the error log and attach it as crash_reason Logger metadata, which error trackers forward. Two entry points take request data. Plug.Crypto.verify/4 exposes the secret key base when the token is neither a binary nor nil, which Phoenix.Token.verify/4 reaches because it forwards the token unguarded. Plug.Crypto.secure_compare/2 exposes the other operand when one side is not a binary, as happens when a missing request header yields nil. Reading the leaked value needs separate access to the logs or the error tracker, so the request alone does not disclose the secret to the attacker. This issue affects plug: from 1.6.3 before 1.7.0; plug_crypto: from 1.0.0 before 2.2.1.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- None
- Automatable
- No
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| elixir-plug | plug | 1.6.3 to before 1.7.0 | 1.7.0 | Patch available | CNA |
| elixir-plug | plug_crypto | 1.0.0 to before 2.2.1 | 2.2.1 | Patch available | CNA |
- plug Vendorelixir-plug Affected 1.6.3 to before 1.7.0 Fixed in 1.7.0 Patch available CNA
- plug_crypto Vendorelixir-plug Affected 1.0.0 to before 2.2.1 Fixed in 2.2.1 Patch available CNA
CPE names CNA · 2
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:elixir-plug:plug:*:*:*:*:*:*:*:* | — | — | elixir-plug |
| cpe:2.3:a:elixir-plug:plug_crypto:*:*:*:*:*:*:*:* | — | — | elixir-plug |
- cpe:2.3:a:elixir-plug:plug:*:*:*:*:*:*:*:* Versions — — ·elixir-plug
- cpe:2.3:a:elixir-plug:plug_crypto:*:*:*:*:*:*:*:* Versions — — ·elixir-plug
Remediation
Upgrade plug to 1.7.0 and plug_crypto to 2.2.1, the fixed versions listed for each product.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
- Fix · CNA plug (elixir-plug) Fixed in 1.7.0
- Fix · CNA plug_crypto (elixir-plug) Fixed in 2.2.1
Vendor assessments
Timeline
- 2026-10-23 Threatist record created from CVE-2026-105963
- 2026-10-23 CISA SSVC decision points changed
- 2026-10-25 EPSS moved to the below the 50th percentile
- 2026-11-06 Affected versions changed · Red Hat
- 2026-11-06 CVSS score added · Red Hat
References
More elixir-plug vulnerabilities
- TI-2026-39665 Plug: quadratic-time decoding of nested query/body parameters enables denial of service CVSS 4.0HIGH 8.7
- TI-2026-25180 Atom table exhaustion via HTTP/2 :scheme pseudo-header in plug_cowboy CVSS 4.0HIGH 8.7
- TI-2026-40967 Plug: multipart :length limit is not charged for part headers, enabling unbounded temp-file creation (denial of service) CVSS 4.0MEDIUM 6.9
- TI-2026-07437 Unbounded buffer accumulation in multipart header parsing causes denial of service in plug CVSS 4.0HIGH 8.2
- TI-2026-40966 Cookie attribute injection in Plug.Conn.Cookies.encode/2 CVSS 4.0LOW 2.1
Sources
- CVE-2026-105963 · CVE Program
- CVE-2026-105963 · NVD
- FIRST EPSS
- CVE-2026-105963 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences