CVE-2026-49983: Deno: process.loadEnvFile() bypasses env permission checks and mutates process.env with only read access
Summary
In Deno, environment access is gated by the env permission. You can deny it with --deny-env, or restrict it to a specific allowlist with --allow-env=FOO,BAR. The expectation is that a program running without env permission cannot change process.env.
process.loadEnvFile() (the Node-compatible API for loading variables from a .env file) does not honor this. It only checks that the program has read permission for the dotenv file, then writes every key in that file into the process environment — even when env access is denied.
In effect, --allow-read plus a writable or attacker-controlled .env file is enough to defeat --deny-env.
Am I affected?
You are potentially affected if all of the following are true:
1. You run Deno v2.3.0 or newer. 2. Your program (or any dependency it imports) calls process.loadEnvFile() from node:process. 3. You rely on Deno's permission model — specifically --deny-env, an --allow-env=… allowlist, or running without granting env — as a security boundary. 4. The .env path passed to loadEnvFile() can be controlled or modified by a less-trusted party (untrusted input, user-writable directory, third-party dependency, etc.) and is covered by your --allow-read grant.
If your program does not use process.loadEnvFile() at all, or if it already grants full env access, this advisory does not change your risk.
Other sources
Deno is a JavaScript, TypeScript, and WebAssembly runtime. Prior to 2.8.1, environment access is gated by the env permission. You can deny it with --deny-env, or restrict it to a specific allowlist with --allow-env=FOO,BAR. The expectation is that a program running without env permission cannot change process.env. process.loadEnvFile() (the Node-compatible API for loading variables from a .env file) does not honor this. It only checks that the program has read permission for the dotenv file, then writes every key in that file into the process environment — even when env access is denied. In effect, --allow-read plus a writable or attacker-controlled .env file is enough to defeat --deny-env. This vulnerability is fixed in 2.8.1.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
rust/denoto a version that resolves this vulnerability.Fixed in 2.8.1 - Upgrade
Upgrade
Denoto a version that resolves this vulnerability.Fixed in 2.8.1 - Configuration
When using Deno's permission model, prefer restricting environment access with `--allow-env=FOO,BAR` rather than relying on `--deny-env`; note that `process.loadEnvFile()` can defeat `--deny-env` if a writable or attacker-controlled `.env` file is reachable via `--allow-read`.
Deno permissions --allow-env = FOO,BAR - Compensating control
If your program or any dependency calls `process.loadEnvFile()` and you must use `--allow-read`, ensure the `.env` path/file is not writable or attacker-controlled (e.g., not in a user-writable directory or otherwise untrusted location), since `process.loadEnvFile()` only requires read permission and then writes every key into `process.env` even when `--deny-env` is set.
Event History
Frequently Asked Questions
What is the severity of CVE-2026-49983?
CVE-2026-49983 has a medium severity rating of 5.2.
How do I fix CVE-2026-49983?
To mitigate CVE-2026-49983, ensure that environment access is restricted by using the --deny-env or --allow-env=FOO,BAR flags in Deno.
What software is affected by CVE-2026-49983?
CVE-2026-49983 affects the Deno runtime environment.
What is the risk level of CVE-2026-49983?
CVE-2026-49983 has a risk level of 32, indicating a moderate threat.
What does CVE-2026-49983 affect?
CVE-2026-49983 affects the environment variable handling in Deno, potentially allowing unauthorized changes to process.env.