CVE Catalog

CVE-2026-105963

MediumCVSS 5.1
Published: Updated: Translated: NVD NIST

Exploitation Probability (EPSS)

Elevated risk
0.72%

53th percentile - higher than 53% of all known CVEs

Summary

The plug_crypto library in Elixir exposes sensitive information (including the secret key base) in application logs when a wrong-typed argument is passed to public functions. Because type validation happens in function-head guards, a failed guard raises FunctionClauseError with the actual argument values in the top stack frame, and the library's rescue blocks and prune_args_from_stacktrace/1 never catch guard failures. Plug.Cowboy and Bandit write that frame to the error log and attach it as crash_reason Logger metadata, which error trackers forward.

Risk Assessment

An unauthenticated remote attacker can cause the secret key base or an API key to leak into logs and error-tracking systems. Disclosure of these values may allow token forgery and compromise of application sessions or data.

Recommendation

Upgrade plug to version 1.7.0 or later and plug_crypto to version 2.2.1 or later. Additionally restrict access to logs and error trackers and consider rotating any exposed secrets.

Related vulnerabilities

Original NVD description (English source)

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.

Vulnerability data from NVD (NIST) · CISA KEV · EPSS