Skip to content

Commit d8b06e9

Browse files
authored
chore(deps): bump dompurify to 3.4.13; re-verify the image-size allowlist (#1769)
* chore(deps): bump dompurify to 3.4.13 for GHSA-55q2-fjhq-7xh7 DOMPurify <=3.4.12 leaves a detached subtree executable after IN_PLACE hook removal, which allows XSS. 3.4.13 is the patched release. dompurify is a direct dependency of geolibre-desktop at ^3.4.12, and the three transitive consumers (@cesium/engine, @geoman-io/maplibre-geoman-free, maplibre-gl-geoagent) all declare ranges that accept 3.4.13, so this is an in-range `npm update` of the single deduped copy -- lockfile only, no package.json change and no breaking upgrade. This clears the only actionable advisory in `npm audit`. The remaining 16 high findings are all the image-size DoS pair (GHSA-w3rx-r6r6-pgpr, GHSA-5p2g-fcmc-qvqq), which are already allowlisted in scripts/audit-check.mjs; both halves of that rationale still hold -- image-size@2.0.2 is still the latest publish and the advisory covers <=2.0.2, and it reaches us only through texture-compressor, which @loaders.gl/textures shells out to via npx from a Node-only encoder GeoLibre never calls. * docs(audit): record the re-verified image-size allowlist rationale Both image-size advisories were re-checked against the GitHub advisory API, which reports first_patched_version: null for each — there is no version to upgrade to, and 2.0.2 remains the newest release ever published. Upgrading higher in the chain does not help either: the latest @loaders.gl/textures (4.4.4) still depends on texture-compressor@^1.0.2, which pins image-size@^0.7.4. Unreachability was re-confirmed by grepping the production build, which contains no reference to image-size or texture-compressor — consistent with @loaders.gl/textures reaching the encoder by spawning it as a child process (`command: 'npx'`) rather than importing it. Also notes why the raw `npm audit` count is alarming and misleading: it inflates these two advisories into ~16 high findings by counting them once per package in the dependency chain, when the tree only ever holds a single copy of image-size. No behavior change — comments only.
1 parent ef1cd24 commit d8b06e9

2 files changed

Lines changed: 16 additions & 6 deletions

File tree

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/audit-check.mjs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,27 @@ const ALLOWLIST = new Map([
1919
[
2020
"GHSA-w3rx-r6r6-pgpr",
2121
"image-size DoS (ICNS parser infinite loop). No patched version exists — " +
22-
"the advisory covers <=2.0.2 and 2.0.2 is the latest release. It reaches " +
22+
"the advisory covers <=2.0.2, 2.0.2 is the latest release, and the GitHub " +
23+
"advisory API reports first_patched_version: null. Nor can we upgrade past " +
24+
"it: the latest @loaders.gl/textures (4.4.4) still depends on " +
25+
"texture-compressor@^1.0.2, which pins image-size@^0.7.4. It reaches " +
2326
"us only as a dependency of texture-compressor, which @loaders.gl/textures " +
2427
"spawns via `npx` from encodeImageURLToCompressedTextureURL (a Node-only " +
2528
"encoder). GeoLibre never calls that encoder and it cannot bundle into the " +
26-
"browser build, so no attacker-supplied image is ever parsed by it.",
29+
"browser build, so no attacker-supplied image is ever parsed by it — " +
30+
"confirmed by grepping the production build, which contains no reference " +
31+
"to image-size or texture-compressor. Re-verified 2026-08-07.",
2732
],
2833
[
2934
"GHSA-5p2g-fcmc-qvqq",
3035
"image-size DoS (JXL/HEIF parser infinite loops). Same package, same lack of " +
3136
"a patched version, and the same unreachable texture-compressor path as " +
32-
"GHSA-w3rx-r6r6-pgpr above.",
37+
"GHSA-w3rx-r6r6-pgpr above. Note that plain `npm audit` inflates these two " +
38+
"advisories into ~16 high findings by counting them once per package in the " +
39+
"chain (texture-compressor → @loaders.gl/textures → gltf/3d-tiles/i3s → " +
40+
"deck.gl → the maplibre-gl-* wrappers). There is only ever one copy of " +
41+
"image-size in the tree; `npm ls image-size` is the honest count. " +
42+
"Re-verified 2026-08-07.",
3343
],
3444
]);
3545

0 commit comments

Comments
 (0)