⚠️

npm パッケージの脆弱性報告対応をした

2023/03/07に公開

utilities という npm パッケージの脆弱性報告の対応を、ここ1週間くらい断続的にやってました。

2022年末に、npm などオープンソースのパッケージのセキュリティアップデートを自動通知してくれるツール (Dependabot や Renovate の類) を提供する会社である Snyk から、utilities パッケージの脆弱性の報告を受けたから対応してくれとのメールが、私を含む何名かに届きました。

このパッケージのオーナーである mde こと Matthew Eernisse 氏とは、以前同氏の開発していた Node.js のバックエンドフレームワーク Geddy にコントリビュートしたことがあり、交流がありましたが、utilities パッケージについては特に心当たりがありませんでした。
何故私にもメールが来ているのかと思って確認してみたら、utilities には8年以上前に1コミットだけコントリビュートしたことがあって、そのため npmjs.com におけるオーナー権限を与えられていたからでした。

この脆弱性は mde 氏が対応するだろうと思って放置していたのですが、2月末になっても音沙汰はなく、Snyk から催促のメールが来てしまいましたので、私の方で対応することにしました。

Step 1. 方針策定

GitHub のコミットログを見る限り、utilities は最近はほとんどメンテされておらず、また依存しているパッケージも14個とそれほど多くはありません
基本的にこれは mde 氏の個人用パッケージの性格が強く、現在であれば @mde/utilities などとして、scoped パッケージになっているべきものとも言えます。(このパッケージが作成された当時は、npm には scoped パッケージは導入されていませんでした。)

そのため、脆弱性は修正せず、パッケージを deprecate させる方針で考えました。

Step 2. Deprecation

mde 氏に許可を得て、パッケージを deprecate させました。
普通に npm deprecate コマンドで deprecate させます。

$ npm deprecate utilities "This package is no longer maintained and vulnerability exists."

参考:
https://docs.npmjs.com/cli/v9/commands/npm-deprecate

今思うとちょっと deprecation message の英語がおかしいような…

Step 3. CVE の登録

パッケージを deprecated にしたことを Snyk に報告すると、Snyk の方で CVE を登録してくれました。

CVE-2023-26105

Step 4. npm audit や Dependabot でアラートが出るようにする

npm の CLI には npm audit というコマンドがあり、使用しているパッケージに脆弱性のあるものがないかチェックしてくれます。今回の脆弱性も、npm audit で表示されるようにしたいところです。
また、Dependabot でも脆弱性がある旨、アラートを出してほしいところです。

CVE を登録しただけでは npm audit には反映されないとのことでしたので、npm サポートに問い合わせました。

まず案内されたのは、GitHub リポジトリーの Security タブから、セキュリティアドバイザリーを登録する方法です。

https://docs.github.com/en/code-security/security-advisories/repository-security-advisories/creating-a-repository-security-advisory

しかし、私は GitHub リポジトリーの方はオーナー権限がないので、私の方では登録できませんでした。
mde 氏に登録を依頼したのですが、また1週間ほど音沙汰がなく…

そうこうしているうちに、自分が GitHub Issue に投稿したメッセージに書いた CVE-2023-26105 という文字列にリンクが付いていることに気が付きました。
リンク先は下記のページで、GitHub のセキュリティアドバイザリーのページのようです。

https://github.com/advisories/GHSA-wxfj-84xf-7gxv

現在はパッケージ名が指定されているのですが、最初は Unreviewed という状態になっており、npm パッケージ名も登録されていませんでした。そしてパッケージ名が表記される部分のところには、Suggest a Package というリンクがあり、私の方でパッケージ名を登録することができました。

下記は別の脆弱性のページですが、元々は下記のスクリーンショットのような状態でした。

(参考までに、Unreviewed のセキュリティアドバイザリーページはこちらの一覧から見ることができます。)

パッケージ名等の登録フォームを埋めていくと、下記のような Pull Request が作成されました。

https://github.com/github/advisory-database/pull/1751

半日ほど経つとマージされたので、npm audit の結果を確認してみたところ、正常に utilities パッケージの脆弱性が報告されるようになっていました。

$ cat package.json 
{
  "name": "test",
  "version": "1.0.0",
  "license": "UNLICENSED",
  "dependencies": {
    "utilities": "latest"
  }
}
$ npm install
npm WARN deprecated utilities@1.0.6: This package is no longer maintained and vulnerability exists.

added 1 package, and audited 2 packages in 394ms

1 high severity vulnerability

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.
$ npm audit
# npm audit report

utilities  *
Severity: high
mde utilities contains Prototype Pollution - https://github.com/advisories/GHSA-wxfj-84xf-7gxv
No fix available
node_modules/utilities

1 high severity vulnerability

Some issues need review, and may require choosing
a different dependency.

Dependabot のアラートも出ました。
1つだけ古いリポジトリーで、この utilities パッケージを使っていたものがあり、GitHub から脆弱性がある旨通知メールが届いていました。

Step 5. README に deprecated である旨書く

取り敢えず Pull Request 出してマージされました。

https://github.com/mde/utilities/pull/30

これにて対応完了のはず。

Discussion