Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ JLSEC-2026-655 — deno-jll

⚪ Unknown ✅ No Known Exploit OSV
N/A
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Deno: Permission Bypass via Unicode Normalization Mismatch on macOS (APFS)

Summary

Deno's permission system enforces filesystem and execution restrictions by

comparing the requested path against the path supplied to --deny-read,

--deny-write, --deny-run, or --deny-ffi. On macOS, that comparison was

done at the raw-byte level while the APFS filesystem treats different Unicode

spellings of the same name as the same file.

That means a program could reach a denied path by spelling it differently than

the deny rule. For example, with --deny-read=/secrets/passwörter.txt, a

script could still read the file by opening /secrets/passwo\u0308rter.txt

(NFD instead of NFC), or /SECRETS/PASSWÖRTER.txt (different case, since

default APFS volumes are case-insensitive). Other forms include ligature

characters (fi vs fi, ff vs ff, …) and German ß vs ss.

The denied path and the requested path differed at the byte level, so Deno's

permission check passed; the kernel then resolved them to the same inode and

served the file anyway. The same flaw affected --deny-write, --deny-run,

and --deny-ffi, which share the same path-comparison code.

Am I affected?

You are potentially affected if all of the following are true:

1. You run Deno on macOS (the issue is specific to APFS path-equivalence

rules; Linux and Windows are not affected by this variant).

2. You rely on --deny-read, --deny-write, --deny-run, or --deny-ffi

as a security boundary against less-trusted code — a dependency, plugin,

or attacker-controlled input.

3. The protected path contains characters that have alternate Unicode

spellings — most commonly accented characters (é, ñ, ö, …), German

ß, or Latin ligatures — or you rely on case-sensitivity on a default

APFS volume.

If you only run fully trusted code, or your deny rules cover paths that are

pure ASCII with no case-sensitive aliases, you are not exposed to this

specific bypass.

Impact

A program running with broad --allow-read (or --allow-write /

--allow-run / --allow-ffi) but with --deny-* carve-outs for specific

paths could read, write, execute, or load via FFI those denied paths by

referring to them through a Unicode- or case-equivalent spelling. The sandbox

model on macOS was weaker than the flags suggested.

Workaround

If you cannot upgrade immediately:

  • Prefer --allow-* allowlists over --deny-* denylists. Allow rules match

against the original specifier, so an attacker-supplied alternate spelling

will not match a path you didn't explicitly grant.

  • Do not rely on case-sensitivity of paths on macOS for security boundaries;

default APFS volumes are case-insensitive.

Fix

On macOS, Deno now normalizes both the deny-rule path and the requested path

to NFC and applies Unicode case folding before comparing them. This matches

how APFS resolves paths at the inode level, so byte-different but equivalent

spellings are now rejected by the same deny rule.

How this vulnerability can be exploited

This issue can be reached with local access to the system, attack complexity is low, an attacker needs low-level privileges on the target. No user interaction is required. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality high, integrity high, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N

  • Attack vector: Local — a local account, shell or session on the host is needed.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: Low — an ordinary user account is enough.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Changed — a successful attack reaches components beyond the vulnerable one.
  • Confidentiality impact: High — total loss, or loss the attacker controls.
  • Integrity impact: High — total loss, or loss the attacker controls.
  • Availability impact: None.

Affected software

JLSEC-2026-655 is recorded against 1 package.

  • deno-jll

Timeline and source

Published on 7 July 2026 and last revised on 18 July 2026. No public exploit is currently recorded for this entry. Record sourced from OSV.

References

github.com (Web)
github.com (Web)

Other advisories for this package

deno-jll has other advisories on record. If you are patching this one, these are worth checking on the same host:

Details

Severity Unknown
CVSS Score N/A
CVSS Vector CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N
CWE N/A
Public Exploit ✅ No
Source OSV
Published 2026-07-07
Updated 2026-08-20
Modified 2026-07-18
Fix URL N/A

Affected Packages

Software From version Fixed in
deno-jll — —

Similar Threats

Free Vulnerability Check

Is your site affected by JLSEC-2026-655?

BotEraser helps you identify potentially vulnerable plugins and themes by checking your installation against JLSEC-2026-655 and other known CVE records.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesJlsecJlsec 2026
✓