|
| 1 | +# Security Overrides |
| 2 | + |
| 3 | +The `overrides` block in `package.json` pins 18 transitive dependencies to versions that clear known CVEs. Each entry is debt — when the underlying ecosystem moves on, the corresponding entry should be removed. |
| 4 | + |
| 5 | +This file documents the provenance and exit condition for each override. **When adding or removing an override, update this file in the same commit.** |
| 6 | + |
| 7 | +## Conventions |
| 8 | + |
| 9 | +- **Class**: `runtime` if the package ends up in the published `dist/` runtime path; `dev` if it's used only by tooling (eslint, mocha, nyc, babel, prettier, etc.). The `.npmignore` excludes everything except `dist/`, `thrift/`, `LICENSE`, `NOTICE`, `package.json`, `README.md` — so dev-tooling overrides do not ship to consumers but DO surface in customer-side scanners (Dependabot, Snyk, OSV) that scan our lockfile. |
| 10 | +- **Exit condition**: the smallest change that would let us drop the override entry. Usually "upstream bump", sometimes "upstream takes the patched version as a dep range". |
| 11 | + |
| 12 | +--- |
| 13 | + |
| 14 | +## Entries |
| 15 | + |
| 16 | +### `basic-ftp: ^5.3.1` |
| 17 | + |
| 18 | +- **Class**: runtime |
| 19 | +- **Path**: `proxy-agent → pac-proxy-agent → get-uri → basic-ftp` |
| 20 | +- **CVEs cleared**: GHSA-5rq4-664w-9x2c (HIGH 9.1), GHSA-6v7q-wjvx-w8wg (HIGH 8.2), GHSA-rp42-5vxx-qpwr (HIGH 7.5), GHSA-rpmf-866q-6p89 (HIGH 7.5) |
| 21 | +- **Exit**: `get-uri` bumps its `basic-ftp` dep range to include `^5.3.1`. Currently declares `^5.0.2`. |
| 22 | + |
| 23 | +### `@75lb/deep-merge: ^1.1.2` |
| 24 | + |
| 25 | +- **Class**: dev (transitive of apache-arrow's CLI tooling — not in runtime path) |
| 26 | +- **Path**: `apache-arrow → command-line-usage → table-layout → @75lb/deep-merge` |
| 27 | +- **CVEs cleared**: GHSA-28mc-g557-92m7 (HIGH 8.7) |
| 28 | +- **Exit**: `table-layout` bumps its dep. Note `apache-arrow@13` itself ships unused CLI tooling — bumping arrow to `15.x+` drops this dep entirely. |
| 29 | + |
| 30 | +### `braces: ^3.0.3` |
| 31 | + |
| 32 | +- **Class**: dev (via mocha's chokidar + eslint's micromatch) |
| 33 | +- **Path**: `mocha → chokidar → braces` AND `@typescript-eslint/parser → ... → micromatch → braces` |
| 34 | +- **CVEs cleared**: GHSA-grv7-fg5c-xmjg (HIGH 7.5) |
| 35 | +- **Exit**: `chokidar` bumps its `braces` dep range. Currently declares `~3.0.2`. |
| 36 | + |
| 37 | +### `picomatch: ^2.3.2` |
| 38 | + |
| 39 | +- **Class**: dev (chokidar + micromatch transitive) |
| 40 | +- **Path**: `mocha → chokidar → readdirp → picomatch` AND `... → micromatch → picomatch` |
| 41 | +- **CVEs cleared**: GHSA-c2c7-rcm5-vvqj (HIGH 7.5) |
| 42 | +- **Exit**: `chokidar` and `micromatch` bump their `picomatch` dep ranges. |
| 43 | + |
| 44 | +### `flatted: ^3.4.2` |
| 45 | + |
| 46 | +- **Class**: dev (eslint's file-entry-cache) |
| 47 | +- **Path**: `eslint → file-entry-cache → flat-cache → flatted` |
| 48 | +- **CVEs cleared**: GHSA-rf6f-7fwh-wjgh (HIGH 8.9), GHSA-25h7-pfq9-p65f (HIGH 7.5) |
| 49 | +- **Exit**: `flat-cache` bumps. Or move to eslint 9 (drops file-entry-cache dep tree shape). |
| 50 | + |
| 51 | +### `minimatch: ^3.1.3` |
| 52 | + |
| 53 | +- **Class**: dev (eslint plugins) |
| 54 | +- **Path**: `eslint-plugin-import / -jsx-a11y / -react → minimatch` |
| 55 | +- **CVEs cleared**: GHSA-3ppc-4f35-3m26 (HIGH 8.7), GHSA-23c5-xmqv-rm74 (HIGH 7.5), GHSA-7r86-cg39-jmmj (HIGH 7.5) |
| 56 | +- **Exit**: eslint plugins bump to use minimatch 9.x+ (most have done so on newer majors). |
| 57 | + |
| 58 | +### `ws: ^8.18.0` |
| 59 | + |
| 60 | +- **Class**: runtime (thrift's WebSocket transport) |
| 61 | +- **Path**: `thrift → ws` AND `thrift → isomorphic-ws → ws` |
| 62 | +- **CVEs cleared**: GHSA-3h5v-q93c-6h6q (HIGH 8.7 — ws@5.x DoS) |
| 63 | +- **Exit**: `thrift` bumps its declared `ws: ^5.2.3` to `^8.x`. Without the override, `thrift@0.23.0` would pull the vulnerable `ws@5.x`. |
| 64 | + |
| 65 | +### `cross-spawn: ^7.0.6` |
| 66 | + |
| 67 | +- **Class**: dev (eslint + nyc) |
| 68 | +- **Path**: `eslint → cross-spawn`, `nyc → foreground-child → cross-spawn`, `nyc → istanbul-lib-processinfo → cross-spawn` |
| 69 | +- **CVEs cleared**: GHSA-3xgq-45jj-v275 (HIGH 7.7 — ReDoS) |
| 70 | +- **Exit**: eslint and nyc bump. Currently declare `^7.0.2`. |
| 71 | + |
| 72 | +### `serialize-javascript: ^7.0.5` |
| 73 | + |
| 74 | +- **Class**: dev (mocha) |
| 75 | +- **Path**: `mocha → serialize-javascript` |
| 76 | +- **CVEs cleared**: GHSA-5c6j-r48x-rmvq (HIGH 8.1 — XSS via prototype pollution) |
| 77 | +- **Exit**: mocha bumps. Currently declares `^6.0.2`. |
| 78 | + |
| 79 | +### `follow-redirects: ^1.16.0` |
| 80 | + |
| 81 | +- **Class**: dev (http-proxy testing util) |
| 82 | +- **Path**: `http-proxy → follow-redirects` |
| 83 | +- **CVEs cleared**: GHSA-r4q5-vmmm-2653 (MED 6.9) |
| 84 | +- **Exit**: `http-proxy` bumps. Currently declares `^1.15.0`. |
| 85 | + |
| 86 | +### `brace-expansion: ^1.1.13` |
| 87 | + |
| 88 | +- **Class**: dev (transitive of overridden minimatch) |
| 89 | +- **Path**: `eslint-plugin-import → minimatch → brace-expansion` |
| 90 | +- **CVEs cleared**: GHSA-v6h2-p8h4-qcjw (LOW) |
| 91 | +- **Exit**: same as `minimatch` — when eslint plugins bump to minimatch 9+, this resolves transitively too. |
| 92 | + |
| 93 | +### `@babel/helpers: ^7.26.10` |
| 94 | + |
| 95 | +- **Class**: dev (nyc instrumentation) |
| 96 | +- **Path**: `nyc → istanbul-lib-instrument → @babel/core → @babel/helpers` |
| 97 | +- **CVEs cleared**: GHSA-968p-4wvh-cqc8 (MED 6.2 — ReDoS) |
| 98 | +- **Exit**: `@babel/core` bumps the `@babel/helpers` range. Currently the bundled version was below the patched. |
| 99 | + |
| 100 | +### `@babel/runtime: ^7.26.10` |
| 101 | + |
| 102 | +- **Class**: dev (eslint-config-airbnb-typescript transitive) |
| 103 | +- **Path**: eslint plugins (via core-js-pure → @babel/runtime) |
| 104 | +- **CVEs cleared**: GHSA-968p-4wvh-cqc8 (MED 6.2 — same as @babel/helpers) |
| 105 | +- **Exit**: same as `@babel/helpers`. |
| 106 | + |
| 107 | +### `@babel/runtime-corejs3: ^7.26.10` |
| 108 | + |
| 109 | +- **Class**: dev (eslint-config-airbnb) |
| 110 | +- **Path**: same as `@babel/runtime` |
| 111 | +- **CVEs cleared**: GHSA-968p-4wvh-cqc8 (MED 6.2) |
| 112 | +- **Exit**: same as `@babel/runtime`. |
| 113 | + |
| 114 | +### `ip-address: ^10.1.1` |
| 115 | + |
| 116 | +- **Class**: runtime (proxy-agent → socks → ip-address) |
| 117 | +- **Path**: `proxy-agent → socks-proxy-agent → socks → ip-address` |
| 118 | +- **CVEs cleared**: GHSA-v2v4-37r5-5v8g (MED 5.3 — IPv6 parsing DoS) |
| 119 | +- **Exit**: `socks` bumps to `ip-address@^10.x`. Note: `ip-address@10` is published as CommonJS with conditional exports — verify any future bump retains CJS compat for our `dist/`. |
| 120 | + |
| 121 | +### `js-yaml: ^4.1.1` |
| 122 | + |
| 123 | +- **Class**: dev (eslint / mocha / nyc config loaders) |
| 124 | +- **Path**: `eslint → @eslint/eslintrc → js-yaml`, `mocha → js-yaml`, `nyc → @istanbuljs/load-nyc-config → js-yaml` |
| 125 | +- **CVEs cleared**: GHSA-mh29-5h37-fv8m (MED 5.3 — DoS on malformed YAML) |
| 126 | +- **Exit**: each consumer bumps. All three are already on the 4.x line; the override forces a patch within 4.x. |
| 127 | + |
| 128 | +### `micromatch: ^4.0.8` |
| 129 | + |
| 130 | +- **Class**: dev (typescript-eslint glob) |
| 131 | +- **Path**: `@typescript-eslint/parser → @typescript-eslint/typescript-estree → globby → fast-glob → micromatch` |
| 132 | +- **CVEs cleared**: GHSA-952p-6rrq-rcjv (MED 5.3 — ReDoS) |
| 133 | +- **Exit**: `fast-glob` bumps. Currently declares `^4.0.4`. |
| 134 | + |
| 135 | +### `uuid: ^11.1.1` |
| 136 | + |
| 137 | +- **Class**: **runtime** — this one matters most |
| 138 | +- **Path**: declared as a top-level runtime dep AND `thrift → uuid` |
| 139 | +- **CVEs cleared**: GHSA-w5hq-g745-h8pq (HIGH 7.5 — buffer-bounds in v3/v5/v6; driver only uses v4 but consumer scanners flag against our lockfile) |
| 140 | +- **Why an override is needed**: `thrift@0.23.0` declares `uuid: ^13.0.0`, but `uuid@13` is **ESM-only**. Our driver is compiled to CJS (`dist/*.js`), so a top-level `uuid: ^11.1.1` plus this matching override forces `thrift`'s transitive uuid down to v11 (which dual-publishes ESM + CJS via conditional exports). |
| 141 | +- **Exit**: any of (a) we migrate `dist/` to ESM, (b) `thrift` drops the uuid dep, (c) `thrift` widens its range to `^11 || ^13` and we go through whichever export shape `thrift` decides on. Today, removing this override would cause `require('uuid')` from `dist/` to crash on Node ≤22.11 (which don't support `require(esm)`). |
| 142 | + |
| 143 | +--- |
| 144 | + |
| 145 | +## How to audit |
| 146 | + |
| 147 | +```bash |
| 148 | +# Show what depends on a specific override target: |
| 149 | +npm ls <package-name> |
| 150 | + |
| 151 | +# Re-run the lockfile against OSV-Scanner to verify findings are still cleared: |
| 152 | +osv-scanner scan source --lockfile=package-lock.json |
| 153 | +``` |
| 154 | + |
| 155 | +When all entries' exit conditions are met, this file should be deleted along with the corresponding `overrides` block. |
0 commit comments