GHSA-4C8G-JVCX-V4HV
Vulnerability from github – Published: 2026-06-16 19:04 – Updated: 2026-06-16 19:04Summary
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()fromnode:process. - You rely on Deno's permission model — specifically
--deny-env, an--allow-env=…allowlist, or running without grantingenv— as a security boundary. - The
.envpath passed toloadEnvFile()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-readgrant.
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.
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 2.8.0"
},
"package": {
"ecosystem": "crates.io",
"name": "deno"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "2.8.1"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-49983"
],
"database_specific": {
"cwe_ids": [
"CWE-863"
],
"github_reviewed": true,
"github_reviewed_at": "2026-06-16T19:04:57Z",
"nvd_published_at": null,
"severity": "MODERATE"
},
"details": "## Summary\n\nIn Deno, environment access is gated by the `env` permission. You can deny it\nwith `--deny-env`, or restrict it to a specific allowlist with\n`--allow-env=FOO,BAR`. The expectation is that a program running without `env`\npermission cannot change `process.env`.\n\n`process.loadEnvFile()` (the Node-compatible API for loading variables from a\n`.env` file) does **not** honor this. It only checks that the program has\n**read** permission for the dotenv file, then writes every key in that file\ninto the process environment \u2014 even when `env` access is denied.\n\nIn effect, **`--allow-read` plus a writable or attacker-controlled `.env` file\nis enough to defeat `--deny-env`.**\n\n## Am I affected?\n\nYou are potentially affected if **all** of the following are true:\n\n1. You run Deno **v2.3.0 or newer**.\n2. Your program (or any dependency it imports) calls `process.loadEnvFile()`\n from `node:process`.\n3. You rely on Deno\u0027s permission model \u2014 specifically `--deny-env`, an\n `--allow-env=\u2026` allowlist, or running without granting `env` \u2014 as a\n security boundary.\n4. The `.env` path passed to `loadEnvFile()` can be controlled or modified by\n a less-trusted party (untrusted input, user-writable directory, third-party\n dependency, etc.) and is covered by your `--allow-read` grant.\n\nIf your program does not use `process.loadEnvFile()` at all, or if it already\ngrants full `env` access, this advisory does not change your risk.",
"id": "GHSA-4c8g-jvcx-v4hv",
"modified": "2026-06-16T19:04:57Z",
"published": "2026-06-16T19:04:57Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/denoland/deno/security/advisories/GHSA-4c8g-jvcx-v4hv"
},
{
"type": "PACKAGE",
"url": "https://github.com/denoland/deno"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N",
"type": "CVSS_V3"
}
],
"summary": "Deno: process.loadEnvFile() bypasses env permission checks and mutates process.env with only read access"
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.