GHSA-r4xh-jqrq-34v2 smol-toml: Quadratic-time parse() from parseKey rescanning to end of document on each key line

Not scored Published

Attackers can cause denial of service in applications using smol-toml by submitting large valid TOML documents that trigger quadratic parsing time.

Exploited in the wild
Not known
Login needed
Not needed
Attackable
Over the internet
Victim action needed
Not needed
Fix
Available

What is GHSA-r4xh-jqrq-34v2?

GHSA-r4xh-jqrq-34v2 is a denial of service vulnerability in smol-toml, published on 5 Oct 2026. An attacker can exploit it over the internet without logging in, with no action from the victim.

Official description

Summary

parse() has a quadratic-time path in parseKey, reachable on default options with ordinary valid input. For every key line and table-header line, parseKey (dist/struct.js, lines 58 and 86) finds the dotted-key separator with ctx.s.indexOf('.', ctx.p), where ctx.s is the whole document. When a key has no . ahead of it, that search runs all the way to the end of the input, and the result is then clamped back to the line terminator endPtr - so everything scanned past the current line is wasted. parseKey runs once per line, so a document of N dot-free keys costs O(n^2).

The most ordinary TOML shape triggers it: a flat list of key = value lines, or a repeated [[a]] table. No dotted keys, no special options, valid input throughout.

Proof of concept

import { parse } from 'smol-toml'

let doc = ''
for (let i = 0; i < 256000; i++) doc += 'k' + i + ' = 1\n'

console.time('parse')
parse(doc) // ~2.8 MB of valid TOML, default options
console.timeEnd('parse')

Doubling the line count roughly quadruples the time:

linessizeparse()
32k0.3 MB0.3 s
64k0.7 MB1.0 s
128k1.4 MB3.5 s
256k2.8 MB14 s

Impact

Any service that runs parse() on attacker-supplied TOML can be stalled. The work is synchronous, so it blocks the whole event loop, and the quadratic is unbounded: a ~7 MB body pins a core for about a minute, larger bodies for several.

Patches

Version 1.9.0 uses a different implementation for parsing keys which is strictly linear.

Workarounds

Limit the maximum document size accepted when parsing arbitrary documents.

Which versions are affected by GHSA-r4xh-jqrq-34v2?

2 open source packages ship an affected version, including smol-toml.

PackageAffectedFixed in
smol-toml npmAll versions1.9.0
smol-toml npmAll versions1.9.0

How do I fix GHSA-r4xh-jqrq-34v2?

Upgrade smol-toml to 1.9.0 or later.

Upgrade, then put limits on request size, rate and nesting depth so one client cannot exhaust the service. More about Denial of service.

Is GHSA-r4xh-jqrq-34v2 being exploited?

There is no known exploitation of GHSA-r4xh-jqrq-34v2 in the wild and no public exploit code.

Sources

Is GHSA-r4xh-jqrq-34v2 in your software?

Upload an SBOM and sbomify checks it against every vulnerability here, every day.

Check your SBOMs for free