colorsなどのnpmパッケージに悪意あるコードが含まれている問題について
追記: 2022年1月11日 2:29 JSTにDoS脆弱性としてセキュリティアドバイザーが出されて、悪意あるバージョン(1.4.1や1.4.2)はnpmからunpublishされ、npmの最新は安全なバージョンである1.4.0
へと変更されました。
2022-01-08 に colors
というnpmパッケージにDoS攻撃のコードが含まれたバージョンが1.4.44-liberty-2
として公開されました。
- GitHub: https://github.com/Marak/colors.js
- npm: https://www.npmjs.com/package/colors
- 問題についてのIssue: https://github.com/Marak/colors.js/issues/285
- 今後についてのIssue: https://github.com/Marak/colors.js/issues/317
colorsの次のバージョンには、無限ループが発生するDoS攻撃のコードが含まれています。
- 1.4.44-liberty-2
- 1.4.1
- 1.4.2
Semantic Versioningにより ^1.0.0
を指定している場合は、2022-01-10時点での1.x.xの最新である1.4.2が選択される危険な状態となっています。
影響を受けるパッケージ
colorsの次のバージョンを利用している場合は、影響を受けます。
- 1.4.44-liberty-2
- 1.4.1
- 1.4.2
また、colors
はターミナルに出力するログの色付けに広く利用されているため、colors
を使っているライブラリを使ってるケースやツールも影響を受ける可能性があります。
具体的にはwinston, http-server, cypress, karma, aws-cdk, promptなどが影響を受け、直接的/間接的な依存を含めると最大5万以上のパッケージがこの問題の影響を受けます。
- https://github.com/winstonjs/winston/issues/2010
- https://github.com/http-party/http-server/pull/783
- https://github.com/cypress-io/cypress/pull/19622
- https://github.com/karma-runner/karma/issues/3738
- https://github.com/aws/aws-cdk/issues/18322
- https://github.com/flatiron/prompt/issues/220
確認方法
colors
を利用しているかは、次のコマンドで確認できます。
npmの場合
npm ls colors
yarnの場合
yarn why colors
それぞれの出力結果に、影響を受けているcolors
のバージョンがある場合は、対応が必要になります。
また、colors
への依存があるが、バージョンが1.4.0
以下のバージョンの場合は、yarn.lock
やpackage-lock.json
などのロックファイルがあるかを確認してください。
ロックファイルがない場合は、npm install
などをした際にインストールされるバージョンが変わる可能性があるため、ロックファイルまたは後述する対応が必要です。
対応方法
colorsのAuthorであるMarakのアカウントでpublishされており、またcolorsの他のAuthorはこのDoS攻撃のコードが含まれたバージョンの公開と同時にアクセス権が削除されています。
そのため、この問題の根本的な対応ができるのは、Marak本人かnpmの管理者となります。
2022-01-10時点では、公式に修正されたcolors
の新しいバージョンはありません。~
~そのため、アップデートではなく安全なバージョンへ固定するなどといった回避策で修正が必要です。
追記(2022-01-11): 問題のあるバージョンがnpmから非公開となりました。
問題のあった 1.4.1, 1.4.2, 1.4.44-liberty-2 がnpm上で非公開となり、安全であった 1.4.0 がnpmの最新のバージョンとなるように修正されました。
そのため、緊急的な対応は不要となりました。
また、GitHubによりこの問題のセキュリティアドバイザリーが公開されています。
一時的な対応方法
colors@1.4.0
は問題ないコードであることが確認されています。
- 1.4.0と1.4.1のDiff: https://diff.intrinsic.com/colors/1.4.0/1.4.1
また、npmでは2016年の通称leftpadという問題をきっかけに、publishしてから24時間以上経過したパッケージのunpublishは基本的にできません。
そのため、colors.jsの1.4.0の内容が基本的に変わることはありません。
そのため、この問題への一時的な対応方法としては、colors
を1.4.0
のバージョンに固定する方法があります。
直接colors
パッケージを利用している場合は、依存するバージョンをcolors@1.4.0
へ固定する必要があります。
{
"dependencies": {
"colors": "1.4.0"
}
}
ライブラリがcolors
に依存(間接的な依存)している場合は、この方法では固定できません。
たとえば、アプリケーションがwinston
を使っていて、winston
がcolors
へ依存しているようなケースなど。
これらの間接的な依存も、Yarnやnpmなどのパッケージマネージャの機能を利用してバージョンを固定する方法があります。
resolutions
を使った固定方法
YarnでのYarnにはresolutionsという間接的な依存を含めた特定のライブラリのバージョンを固定する機能があります。
package.json
にresolutions
フィールドを追加し、次のようにcolors
のバージョンを固定することでこの問題を回避できます。
{
"resolutions": {
"colors": "1.4.0"
}
}
Example:
Documentations:
- yarn v1: Selective dependency resolutions | Yarn
- yarn v2+:
yarn set resolution
| Yarn - Package Manager - package.json の resolutions を使って依存パッケージのバージョンを指定する - 30歳からのプログラミング
overrides
を使った固定方法
npm 8.3+でのnpm 8.3.0でoverrides
というYarnのresolutionsと類似する機能が実装されています。
package.json
にoverrides
フィールドを追加し、次のようにcolors
のバージョンを1.4.0へ固定することでこの問題を回避できます。
{
"overrides": {
"colors@1": "1.4.0"
}
}
Example:
Documentations:
npm 8.3未満での固定方法
残念ながら公式な方法はないと思います。(あったらコメントください)
package-lock.jsonを直接編集するかnpm-force-resolutions - npmなどで編集する必要があります。
その他の代替ライブラリへ移行する
@DABHによる1.4.0相当のライブラリが@dabh/colors
として公開されています。
@DABHはcolors
のメンテナーで、この問題が起きた際に誰かによってcolors
へのアクセス権限が削除されています
類似する問題
colors.jsと同様の作者(Marak)によって公開されていた、faker.jsも空の内容が6.6.6
として公開され、リポジトリも空になっています
Marakがアクセス権(Owner または Maintainer)を持っているパッケージの一覧は次のとおりです。
Discussion