PJR-HQKV 本体の実行時の依存 fast-glob 経由で braces の high の脆弱性が残る
1. 課題内容
npm audit --omit=dev で、直接の依存 fast-glob → micromatch → braces のサービス不能攻撃の脆弱性が high 3 件として出る(2026-10-08)。修正版はまだない。CHANGELOG の v0.3.0 は依存の脆弱性に対応したと書いている。fast-glob を別の実装(Node 標準の glob など)に置き換えるか、既知の問題として CHANGELOG に書くかを決める。
2. 影響範囲
| 観点 | 影響 |
|---|---|
| スコープ | 本体の src/register.ts(2 か所)と @specdojo/docs-lint の 5 ファイルの glob、両方の package.json の依存 |
| スケジュール | v0.3.0 の公開の判定基準 5 に関わる |
| コスト | 依存の置き換えと、列挙の結果が変わらないことの確認 |
| 品質 | 利用者の環境に high の脆弱性 3 件が入る |
| 関係者 | SpecDojo と @specdojo/docs-lint の利用者 |
3. 対応方針
| 項目 | 内容 |
|---|---|
| 原因 | fast-glob が micromatch 経由で braces に依存し、braces に修正版がない |
| 対応策 | 2026-10-09 に利用者が置き換えを決めた。本体は依存なしの走査、docs-lint は tinyglobby(依存は fdir と picomatch だけ)へ置き換える。下記の「完了条件の詳細」のとおり |
| 依存事項 | ルートの package.json は保護対象のため、依存の変更は人が develop へ入れる |
| 完了条件 | 下記の「完了条件の詳細」を満たす |
3.1. 完了条件の詳細
src/register.tsのfast-globの 2 か所を、node:fsによる依存なしの再帰的な走査に置き換える。docs/ja/**/*.mdを対象にし、generatedディレクトリを除き、絶対パスを辞書順で返す現在の結果を保つ。Node 標準のfs.globSyncは engines(>=22.13)の古い版で試験的な機能の警告が出るため使わない。packages/docs-lint/src/の 5 ファイルのfast-globをtinyglobbyに置き換える。{yaml,yml}の展開、ignore、onlyFiles、dot: false、重複の排除、結果の辞書順を保つ。- ルートと
packages/docs-lintのpackage.jsonからfast-globを外し、docs-lint にtinyglobbyを加え、package-lock.jsonを更新する。 npm ls braces --omit=devが空になり、npm audit --omit=devにbracesが出ない。- unit test で、置き換えた列挙が対象ファイルと順序を変えないこと(
generatedの除外、ignoreの適用を含む)を確かめる。 - CHANGELOG の v0.3.0 で、既知の問題から PJR-HQKV の項目を外し、不具合修正の依存の脆弱性の項目へ移す。
npm run checkが通る。
4. 対応結果
src/register.tsの参照更新対象の列挙をnode:fsの再帰走査へ置き換え、docs/ja配下の Markdown だけを絶対パスの辞書順で返し、generatedディレクトリと隠し項目を除外するようにした。- docs-lint の 5 つの検証コマンドは、
tinyglobbyを使う共通ヘルパーへ置き換えた。brace 展開、ignore、ファイル限定、隠し項目の除外、重複排除、辞書順をヘルパーと unit test で固定した。 - ルートと docs-lint の依存宣言・lockfile から
fast-globを除き、docs-lint の実行時依存と ルートのテスト用開発依存へtinyglobbyを追加した。fast-globに依存していた既存テストもtinyglobbyへ移行した。 - CHANGELOG の PJR-HQKV を既知の問題から不具合修正へ移し、依存経路を除去したことを記録した。
- 再発防止として、本体の走査では
generatedの除外と返却順、docs-lint の走査では brace・ignore・ファイル限定・隠し項目・重複排除・返却順を unit test で検証する。 npm ls braces --omit=dev --allは空、ルートと docs-lint のnpm audit --omit=dev --offlineは 0 vulnerabilities になった。オンラインのnpm audit --omit=devは sandbox の DNS 制限(EAI_AGAIN registry.npmjs.org)で実行できないため、ネットワークを利用できる 環境での再確認を申し送る。