Browse Source

chore(deps): pyasn1 0.6.5 and minimatch 11.0.4 (pip-audit, npm audit)

- pyasn1 (via ldap3, ships in the image): floor >=0.6.5 in
  requirements.txt, both locks regenerated for pyasn1 only. Fixes four
  quadratic time/memory issues in the BER decoders.
- minimatch (eslint/typescript-eslint, dev only): overrides pin
  ^10.2.1 -> ^11.0.4, no 10.x fix exists. eslint uses only match(),
  minimatch() and .pattern, none removed in 11; same 809 files linted.
- pip-audit and npm audit report zero vulnerabilities.
maziggy 4 days ago
parent
commit
f52dbb8fa2
6 changed files with 24 additions and 9 deletions
  1. 1 0
      CHANGELOG.md
  2. 14 5
      frontend/package-lock.json
  3. 1 1
      frontend/package.json
  4. 1 1
      requirements-typecheck.lock
  5. 4 2
      requirements.lock
  6. 3 0
      requirements.txt

+ 1 - 0
CHANGELOG.md

@@ -873,6 +873,7 @@ All notable changes to Bambuddy will be documented in this file.
 - **Bumped `brace-expansion` to 5.0.12 for three denial-of-service advisories** — Two high-severity issues, fixed in 5.0.10 and 5.0.11, let deeply nested brace groups exhaust the native stack. Roughly 3,100 levels of `{{{...a,b...}}}`, about 6 KB of input, crashed the process: once through the recursive comma splitter and once through the expander itself. The medium-severity third, fixed in 5.0.12, is the bash `{a},b}` quirk. The parser handles it by rewriting the string and rescanning once per trailing `}`, so the cost grows quadratically, and 128 KB of input blocked the event loop for 27 seconds. 5.0.12 makes the comma splitter iterative and caps nesting depth and rewrite passes at 1,000 each. Input past either cap is kept as plain text rather than throwing, the same way the existing `max` and `maxLength` limits work. **No running Bambuddy install was exposed, and none of the issues was reachable at build time either.** `brace-expansion` is a development-only transitive dependency, pulled in by `eslint` through `minimatch`, and it is not in the shipped image. The only patterns it ever expands are the fixed globs in `frontend/eslint.config.js`. Before the bump, the output of 5.0.9 and 5.0.12 was compared on every glob in that file plus ranges, nested sets, escaped braces and the `{a},b}` quirk, and it was identical. The same comparison confirmed the fixes: 5,000 levels of nesting overflow the stack on 5.0.9 and expand cleanly on 5.0.12, and a 20,000-brace rewrite input drops from 3 seconds to 13 ms. The existing `overrides` pin in `frontend/package.json` moves from `^5.0.9` to `^5.0.12`, because `minimatch` still asks for only `^5.0.2`. The lockfile changes in one entry only, `balanced-match` is untouched, nothing is added or removed, and the shipped bundle does not change. Verified with eslint, typecheck, the production build and the full frontend suite (4022 tests across 297 files). `npm audit` reports zero vulnerabilities with and without dev dependencies.
 - **Bumped `dompurify` to 3.4.17, `zod` to 4.6.7 and Vitest to 4.1.12 for npm audit advisories** — DOMPurify 3.4.17 fixes three bypasses: `SAFE_FOR_TEMPLATES` with shadow roots, `IN_PLACE` with hooks that remove nodes, and the SMIL `attributeName` guard in XHTML mode. Bambuddy sanitizes project notes, project pages and MakerWorld descriptions with a plain `sanitize()` call and none of those options or hooks, so it was not exposed; the bump keeps the one runtime dependency of the three clean, and its floor in `frontend/package.json` moves to `^3.4.17`. zod 4.6.6 checks array, set and map size limits before parsing their elements, so an oversized collection can no longer exhaust memory; it is a development-only dependency, pulled in by `eslint-plugin-react-hooks` and `knip`, and is not in the shipped image. Vitest 4.1.12 hardens `@vitest/mocker`'s manual and redirect mocks; the test suite uses neither `__mocks__` folders nor redirect mocks, and the mocker runs only during tests. Vitest and `@vitest/coverage-v8` pin each other exactly, so `npm audit fix` alone left them on 4.1.11; both floors move to `^4.1.12`, and Vitest's own `chai`, `std-env` and `tinyrainbow` move with it. Verified with eslint, knip, typecheck, the production build and its Safari 16 baseline check, i18n parity and the full frontend suite (5207 tests across 394 files). `npm audit` reports zero vulnerabilities.
 - **Bumped the development tools' `virtualenv` to 21.14.9, `filelock` to 4.2.1 and `setuptools` to 84.1.0 for pip-audit advisories** — All three are development-only and none is in the shipped image or `requirements.lock`: `virtualenv` and `filelock` arrive through `pre-commit`, `setuptools` through `bandit[sarif]` and `pbr`. `requirements-dev.txt` now sets them as minimums, the way it already does for `msgpack`, so a development install audits clean. `filelock` 4 is a new major version; its breaking change is the on-disk format of `SoftReadWriteLock`, which `virtualenv` does not use, and `virtualenv` 21.14.9 accepts it. Verified with the pre-commit hooks, a bandit SARIF run, ruff, typecheck and the full backend suite. `pip-audit` reports zero vulnerabilities.
+- **Bumped `pyasn1` to 0.6.5 and `minimatch` to 11.0.4 for pip-audit and npm audit advisories** — pyasn1 0.6.5 fixes four decoder issues where crafted BER input could take quadratic time or memory (binary REAL mantissas, constructed BIT STRING and OCTET STRING fragments, and schemaless tag tracking); it ships in the image as a dependency of `ldap3`, which uses it for LDAP sign-in, so `requirements.txt` now sets `pyasn1>=0.6.5` as a minimum and both locks move to 0.6.5. minimatch 11.0.1 fixes a denial of service where a crafted glob made pattern preprocessing grow without bound; it is a development-only dependency of `eslint` and `typescript-eslint` and is not in the shipped image. There is no 10.x fix, so the `overrides` pin in `frontend/package.json` moves from `^10.2.1` to `^11.0.4`. Version 11 removes `makeRe()`, `.regexp` and the `AST` class, none of which eslint or typescript-eslint call; they only use `match()`, `minimatch()` and `.pattern`, and eslint still lints the same 809 files with no findings. Verified with the LDAP tests, ruff, typecheck, the full backend suite on SQLite and Postgres, eslint, knip, the production build and the full frontend suite. `pip-audit` and `npm audit` report zero vulnerabilities.
 
 
 ## [1.2.5.4] - 2026-08-29

+ 14 - 5
frontend/package-lock.json

@@ -949,6 +949,13 @@
         }
       }
     },
+    "node_modules/@isaacs/nonrecursive-glob-match": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@isaacs/nonrecursive-glob-match/-/nonrecursive-glob-match-1.0.3.tgz",
+      "integrity": "sha512-SI7kyKHq4XXDRozw+r9GlRZkia1ZkFrpLW98r2IC2Bpr8YkFGE3fvjzmxCG0x78A++69HmDNrDvSMYBZmHGpKA==",
+      "dev": true,
+      "license": "BlueOak-1.0.0"
+    },
     "node_modules/@jridgewell/gen-mapping": {
       "version": "0.3.13",
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -7071,15 +7078,17 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "10.2.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
-      "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
+      "version": "11.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-11.0.4.tgz",
+      "integrity": "sha512-/UJ1dEoVQTjPNDh6SGlUo+ueLMmoHTas4q+8yaAR/5t6nLAIiBDJtoYUh20IYleix7ehiQkgczb84PE3uzHkxg==",
       "dev": true,
+      "license": "BlueOak-1.0.0",
       "dependencies": {
-        "brace-expansion": "^5.0.2"
+        "@isaacs/nonrecursive-glob-match": "^1.0.3",
+        "brace-expansion": "^5.0.12"
       },
       "engines": {
-        "node": "18 || 20 || >=22"
+        "node": "20 || >=22"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"

+ 1 - 1
frontend/package.json

@@ -60,7 +60,7 @@
     "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
   },
   "overrides": {
-    "minimatch": "^10.2.1",
+    "minimatch": "^11.0.4",
     "brace-expansion": "^5.0.12",
     "js-yaml": "^5.4.1",
     "nanoid": "^3.3.18",

+ 1 - 1
requirements-typecheck.lock

@@ -176,7 +176,7 @@ propcache==0.5.4
     #   yarl
 psutil==7.2.2
     # via -r requirements.lock
-pyasn1==0.6.4
+pyasn1==0.6.5
     # via
     #   -r requirements.lock
     #   ldap3

+ 4 - 2
requirements.lock

@@ -153,8 +153,10 @@ propcache==0.5.4
     #   yarl
 psutil==7.2.2
     # via -r requirements.txt
-pyasn1==0.6.4
-    # via ldap3
+pyasn1==0.6.5
+    # via
+    #   -r requirements.txt
+    #   ldap3
 pyasynchat==1.0.5 ; python_full_version >= '3.12'
     # via pyftpdlib
 pyasyncore==1.0.5 ; python_full_version >= '3.12'

+ 3 - 0
requirements.txt

@@ -109,6 +109,9 @@ tzdata>=2024.1; sys_platform == "win32"
 PyJWT>=2.15.1
 passlib[bcrypt]>=1.7.4
 ldap3>=2.9.0
+# Transitive dep pin (ldap3): the floor clears four pip-audit findings in
+# pyasn1's BER decoders (quadratic time/memory on crafted input) in 0.6.4.
+pyasn1>=0.6.5
 pyotp>=2.9.0
 
 # Transitive dep pin: idna<3.15 has CVE-2026-45409 (ReDoS on encode() with