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:
- You run Deno v2.3.0 or newer.
- Your program (or any dependency it imports) calls
process.loadEnvFile()
from node:process.
- You rely on Deno's permission model — specifically
--deny-env, an
--allow-env=… allowlist, or running without granting env — as a
security boundary.
- 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.
References
Summary
In Deno, environment access is gated by the
envpermission. You can deny itwith
--deny-env, or restrict it to a specific allowlist with--allow-env=FOO,BAR. The expectation is that a program running withoutenvpermission cannot change
process.env.process.loadEnvFile()(the Node-compatible API for loading variables from a.envfile) does not honor this. It only checks that the program hasread permission for the dotenv file, then writes every key in that file
into the process environment — even when
envaccess is denied.In effect,
--allow-readplus a writable or attacker-controlled.envfileis enough to defeat
--deny-env.Am I affected?
You are potentially affected if all of the following are true:
process.loadEnvFile()from
node:process.--deny-env, an--allow-env=…allowlist, or running without grantingenv— as asecurity boundary.
.envpath passed toloadEnvFile()can be controlled or modified bya less-trusted party (untrusted input, user-writable directory, third-party
dependency, etc.) and is covered by your
--allow-readgrant.If your program does not use
process.loadEnvFile()at all, or if it alreadygrants full
envaccess, this advisory does not change your risk.References