Skip to content

fix(security): Node実行環境と依存を更新しcritical/highを解消 - #68

Merged
azumag merged 2 commits into
mainfrom
codex/security-node-deps-20261021
Oct 21, 2026
Merged

azumag merged 2 commits into
mainfrom
codex/security-node-deps-20261021

Conversation

@azumag

@azumag azumag commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

目的

Node.jsのeMudhra対応を含む2026-10-21のセキュリティ版へCI・開発・controller実行環境を揃え、npm依存の全advisoryを解消します。

Base: 5bd511ed3d74c339e4c81379a91a9b037517dc14

変更

  • .node-version、devcontainer、controller imageをNode 22.23.4へ固定。CIは22.23.4/24.22.1。enginesは ^22.23.4 || ^24.22.1 || ^26.12.1。
  • Alpine側のNode package任せの導入を公式Node imageへ変更し、controller独立lockのnpm ci --omit=dev --ignore-scriptsで再現。.dockerignoreでホストのnode_modules混入を防止。
  • 新規ホストbootstrapは.node-versionの公式配布物をSHA-256照合して導入。
  • workspace/controller両lockを修正。Express 4.22.3、proxy-addr 2.0.8、form-data 4.0.6、protobufjs 7.6.6等へ更新。
  • Jest 30.5.2に明示更新してbraces依存を除去、直接UUIDはCommonJS互換の11.1.1へ更新。
  • CIで検出した推移依存のUUIDと、開発依存のsprintf-js経路も4件の親限定overrideで除去。workspace/controller両manifestへ反映し、実SDK/adapterとYAML設定読み込みの契約テストを追加。npm audit fix --forceは不使用。
  • CIにhigh以上のaudit gateとcontroller imageのbuildのみを追加。

監査

2026-10-21のnpm audit。依存ノード数であり独立advisory数ではありません。

対象 before after
workspace lock critical 3 / high 39 / moderate 11 / low 1 全severity 0
controller独立lock 変更前別集計は未採取 全severity 0
workspace本番依存のみ 未採取 全severity 0
controller単独の本番依存のみ 未採取 全severity 0

初回PRで残った2 advisoryも、無視設定を使わず追補で解消しました。

  • uuid(CVE-2026-41907 / GHSA-w5hq-g745-h8pq): dockerode@4.0.6 → uuid@10、googleapis@128 → googleapis-common@7 / gaxios@6.7.1 → uuid@9をTrivyも検出。修正版は11.1.1 / 12.0.1 / 13.0.1。親の同major更新では解消しないため、dockerode@^4.0.2 / googleapis-common@7 / gaxios@6の直下だけUUID 11.1.1に固定しました。実コードはCommonJSで引数なしv4()のみ。実Dockerode session生成、Google Drive SDKとGaxiosのmultipart生成を通信なしで検証しています。
  • sprintf-js(GHSA-hp3w-g68c-fv3c): 旧経路はJest → transform → babel-plugin-istanbul → load-nyc-config → js-yaml@3 → argparse@1。sprintf-js自体には修正版がないため、@istanbuljs/load-nyc-config@1直下のjs-yamlだけ4.3.2へ固定し、argparse 2を使う経路へ移しました。実loadNycConfig()でYAMLのextends/配列/booleanを確認し、coverageも通過しています。両lockからsprintf-jsは消えました。

上流が修正版依存を採用した時点で、該当overrideを個別に外して同じ契約テストと監査を再実行します。

WizのKeyv関連IoC(blob 9f165191323ff74a6d06ed6115363f0cdc912d2e)と両lockのbefore/afterをpackage名+versionで照合、一致0。過去インストール・グローバルCLI・既存imageの侵害調査ではありません。

検証

Node 22.23.4 / npm 10.9.9。

  • root/workspaceとcontroller独立lockのnpm ci --ignore-scripts: 成功
  • controller / operator-bridge lint: 成功
  • controller coverage: 16 suites / 115 tests成功、既存閾値達成。独立controller lockでも115件成功。追加4件は実SDK/adapter/YAMLの契約テスト
  • operator-bridge: 5 suites / 19 tests成功
  • BLMF Windows PoC fixture: 30 tests成功(Linux)
  • workspace/controller単独、全依存/本番依存のauditは4通りすべて0
  • UUID 9/10とsprintf-jsは両lockから除去。NODE_PATHを空にして各親がrepo内の修正版を解決することも確認
  • workflow YAML、bootstrap bash -n、git diff --check: 成功
  • enginesが修正版を許可し、その直前patchを拒否することを確認
  • 自己レビューと独立レビュー実施。IoC出典修正を反映済み

最初のsandbox実行ではlocalhost listenがEPERMとなり、許可済みローカルfixture環境で再検証しました。Docker実行環境がないためローカルbuildは未実施ですが、初回PR CIのcontroller image build、Node 22/24 matrix、integration、Windows PoCは成功しています。依存override追補後のCIも下記の通り成功しました。Windows実機、Google Drive実アカウント、OBS、配信先には接続していません。

適用条件

このPRではmerge/deploy/常駐プロセス再起動/配信操作は行いません。現行の本番deploy定義は .github/workflows/deploy.yml.disable で無効化されています。main pushだけでは本番配備されないため、運用手順で別途配備してください。既存containerは新base/lockから再buildし、既存host/開発containerも更新して、再起動後の実効Node versionを確認する必要があります。

詳しい根拠・残件・手順: docs/security/node-security-2026-10.md。

公式: Node 22.23.4、SPKI blocklist、証明書ストア更新。

最新HEADのPR CI

d8cac889d9f06a644300fc8f0033c7803dd7966b の全13 checksが成功(2026-10-21)。

  • Trivy: success、annotations 0件。初回で検出したUUID 9/10を解消しました。
  • Controller image build: node:22.23.4-alpine と独立lockの npm ci --omit=dev --ignore-scripts によるbuild成功。
  • Controller Node 24.22.1: 115テスト、audit 0件。Node 22.23.4側、Operator両matrix、統合・性能、Windows PoCも成功。
  • 追補の独立レビューで阻害事項なし。追加4契約テストの独立実行も成功。

マージ後の確認と配備についての訂正

main a719a606ea7ee95b0804f146da5c4565c3b30391 に統合済み。4 workflows・10 checksが成功し、Node 22.23.4/24.22.1、115 Controller tests、audit 0件、公式Nodeイメージのbuild成功を確認しました。

以前記載した『main pushで本番deployが起動する』という説明を訂正します。現行のdeploy定義は deploy.yml.disable で無効、controllerのDocker jobも push: false です。今回は本番deployは起動していません。報告文書も同じ内容に訂正します。

@azumag
azumag merged commit a719a60 into main Oct 21, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant