⚠️

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

に公開

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