Snyk、npmレジストリでオープンソースのサプライチェーンセキュリティを脅かす悪意あるコードの活動を発見
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の悪意あるペイロードは、ホストからの情報窃取を狙っていました。package.jsonファイル内で見つかった、元の悪意あるパッケージのpostinstallスクリプトを紹介します。
では、この攻撃をどうすれば防げたでしょうか。(私のnpmのセキュリティに関するベストプラクティスの記事をすでに読んだ方なら、きっとご存じですね。)
パッケージを安全にインストールするためのベストプラクティスの一つは、npmパッケージのインストール時に任意のコマンドが実行されないようにすることです。次にnpmパッケージをインストールするときは、任意のコマンドを実行するパッケージから身を守るため、次のコマンドライン引数を使うことを検討してください。
yarnを使っている場合は、次のようにします。
次に、paychex-*という名前のnpmパッケージ群が見つかりました。これらのパッケージは、今回はpreinstallスクリプトフックを使って、インストール時に環境変数からデータを盗み、リモートサーバーに送信するよう設計されていました。Snykのデータベースでは、すべて悪意あるパッケージとしてフラグが付けられています。

最後に、悪意あるパッケージrcenodejsにも同様のpreinstallスクリプトがあり、リモートの攻撃者が接続するためのリバースシェルを作成していました。
いずれの場合も、次のコマンドを使うだけで、パッケージのインストール中に任意のコードが実行されるのを防げます。
npmのソフトウェアサプライチェーンセキュリティを守るには?
まず、npmパッケージが悪意あるものかどうかを特定できるとよいでしょう。npmjsのパッケージページを見ただけでは判断できないことがあり、インストールしてからでは手遅れです。
その判断に役立つのがSnyk Advisorです。悪意あるパッケージとして確認され、インストールすべきでないものを明確に示します。たとえば、rcenodejs npmパッケージのAdvisorページでは、悪意あるCWE-506のセキュリティ脆弱性が示されています。

ソフトウェアの開発が進むほど、私たちが負うソフトウェアセキュリティのリスクも高まります。ベストプラクティスを取り入れ、リスクの低減やセキュリティインシデントの完全な防止に役立つツールを活用するため、以下をおすすめします。
オープンソースソフトウェアを安全に扱うため、npmのセキュリティに関する10のベストプラクティスを確認しましょう。npmjsでの二要素認証の有効化、信頼できないサードパーティ製オープンソースソフトウェアによる任意のコマンド実行の無効化などが含まれます。
Node.jsのDockerコンテナを構築する場合は、ブログ記事Node.jsベースのコンテナを構築するための本番環境向けセキュリティのベストプラクティスで紹介している手順に従ってください。



