Skip to content

Fix CWE-93 newline injection in DOTENV DataSet writer - #626

Open
sfc-gh-ikryvanos wants to merge 1 commit into
mainfrom
ikryvanos/fix-dotenv-newline-injection
Open

Fix CWE-93 newline injection in DOTENV DataSet writer#626
sfc-gh-ikryvanos wants to merge 1 commit into
mainfrom
ikryvanos/fix-dotenv-newline-injection

Conversation

@sfc-gh-ikryvanos

Copy link
Copy Markdown
Collaborator

The dotenv SetDataByKey path wrote key=value unquoted and only prefixed a backslash before raw \n / \r bytes, so a caller authorized for a single data_key could embed a newline in the value and inject arbitrary extra environment variables (e.g. LD_PRELOAD) into the .env file, escalating a constrained single-key write into arbitrary env-var injection on the host at the next service start.

Reject rather than escape: validate the key against a strict POSIX env-var charset ([A-Za-z_][A-Za-z0-9_]*) and reject any value containing a newline or other control character, failing closed before the file is opened so a rejected write changes nothing. A .env value cannot safely span physical lines in the unquoted single-line format the writer emits.

Add TestIntegration regression coverage: the LD_PRELOAD PoC, CR and CRLF variants, a control-char value, malicious keys, the two-call rewrite sequence, and happy-path overwrite/append.

The dotenv SetDataByKey path wrote key=value unquoted and only prefixed
a backslash before raw \n / \r bytes, so a caller authorized for a single
data_key could embed a newline in the value and inject arbitrary extra
environment variables (e.g. LD_PRELOAD) into the .env file, escalating a
constrained single-key write into arbitrary env-var injection on the host
at the next service start.

Reject rather than escape: validate the key against a strict POSIX env-var
charset ([A-Za-z_][A-Za-z0-9_]*) and reject any value containing a newline
or other control character, failing closed before the file is opened so a
rejected write changes nothing. A .env value cannot safely span physical
lines in the unquoted single-line format the writer emits.

Add TestIntegration regression coverage: the LD_PRELOAD PoC, CR and CRLF
variants, a control-char value, malicious keys, the two-call rewrite
sequence, and happy-path overwrite/append.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants