Skip to main content

お探しのnpmパッケージはこれではありません

著者
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

feature may base

2022年5月4日

0 分で読めます

開発者として、これまでデジタルエージェンシーの案件や個人プロジェクト、スタートアップ、フリーランスの仕事を通じて、多くのアプリケーションを構築し、デプロイしてきました。期限の厳しいスケジュールやクライアントの期待、納期を考えると、npmでオープンソースパッケージをインストールする際、セキュリティが最優先事項になることはあまりありませんでした。その結果、既知の脆弱性が入り込んだデプロイをやり直したり、後処理したりすることになり、スケジュールがさらに延び、クライアントを失望させることも少なくありませんでした。

今年の初め、500を超える悪意あるパッケージが、アプリケーション内で依存関係の混乱を引き起こすためにnpmエコシステムへ公開されました。これらのパッケージは、望ましくないコードや機能を直接注入するか、直接または依存関係にあるオープンソースライブラリを介して悪意あるコードを持ち込みました。

初期の『スター・ウォーズ』映画のように、これらの悪意あるパッケージはジェダイのマインド・トリックでアプリケーションに侵入しようとしていました。こうした事例が増加するなか、デプロイを保護するために必要な時間を確保し、適切な予防措置を講じることが重要です。

依存関係へのコード注入からアプリケーションを守る方法をいくつか見ていきましょう。

事前の入念な確認

開発のあらゆる段階で、アプリケーションが何を使用しているのかを把握することが重要です。npmエコシステムの脆弱性の約80%は、依存関係に含まれる脆弱な経路から発生しています。だからこそ、事前の入念な確認が欠かせません。セキュリティを維持するには、選択したオープンソースパッケージがどのように作られ、どのようなサポート体制があるのかを理解する必要があります。

その方法の一つは、npmのパッケージページやGitリポジトリを使って、ライブラリの機能を確認することです。リリース数やサポート状況、パッケージが必要とする依存関係の種類を把握できます。

Electron npmパッケージのページ。Electronのロゴ、インストールコマンド「npm i electron」、週間ダウンロード数、バージョン、ライセンス、プロジェクトの詳細が表示されている。

もう一つ便利な方法は、Snyk Advisorを利用することです。パッケージの健全性や、その履歴のなかで見つかった脆弱性について、有用な情報を得られます。

Snyk Advisorのページの優れた点の一つは、プロジェクト全体を包括的に把握できることです。コミュニティ、人気度、セキュリティ、メンテナンス状況に基づく健全性スコアも確認できます。

Electron npmパッケージのSnyk Advisorページ。健全性スコア92/100、セキュリティ状況、類似パッケージを表示。

このページでは、週ごとのダウンロード数などの人気度統計、コミュニティによるコミット数、未解決の課題数を示す便利な時系列グラフも確認できます。エコシステムでの採用状況に加え、コミュニティの活動度を把握するのに役立ちます。

正常と表示されたメンテナンスダッシュボード。2021年4月から2022年4月までの月ごとのコミット頻度と、リポジトリのアクティビティ指標が表示されています。

これらのグラフを見ると、プロジェクトでセキュリティ上の問題が発生した際、コミュニティがどれほど迅速に連携して修正に取り組めるかがわかります。

依存関係ツリーの作成

たった一度のnpm installで、Nodeアプリケーションに何百ものライブラリが追加されることがあります。たとえばElectronには主な依存関係が3つあり、その一部には独自の依存関係があるため、Electronベースのアプリに自動的に追加されます。

依存関係ツリーを使えば、ライブラリや依存関係を通じて追加されたパッケージを見つけられます。さらに重要なのは、アプリケーションで使用しているコンポーネントを特定し、SBOM(ソフトウェア部品表)の作成を容易にできることです。

依存関係ツリーを作成する方法はいくつかあります。たとえば、次のような方法です。

ビジュアルマッピングツールを使う

ビジュアルマッピングツールは、アプリケーションが使用しているすべてのオープンソースコンポーネントを視覚的に表示できるため、依存関係マップの作成に便利です。

私が使ったことのあるビジュアルマッピングツールの一つがnpmgraph.anです。単一のnpmライブラリから2Dの依存関係ツリーを作成できます。生成後、依存関係を表すツリーのノードをクリックすると、左側のパネルに詳細情報が表示されます。

npmパッケージ fs-extra@8.1.0 の依存関係グラフ。サイドバーにパッケージの詳細とメンテナーのアバターを表示

コマンドラインでnpmを使う

グローバルライブラリのSnyk CLIのインストールから、ライブラリや依存関係の一覧の生成まで、npmの柔軟性には感心します。

ツリーを表示するには、package manifestがあるプロジェクトのルートディレクトリに移動し、npm listと入力します。npmベースのアプリケーションが使用している最上位のライブラリが、グラフではなくテキストで表示されます。npm list [package]と入力すれば、特定のパッケージについてさらに詳しい情報を確認することもできます。

npmパッケージの依存関係ツリーを、パッケージ名とバージョン番号とともに表示したターミナル出力。

ただし、先ほどのコマンドではネストされた依存関係は表示されません。表示するには--depthタグを使います。たとえば、npmプロジェクトのルートディレクトリでnpm list --depth=5を実行すると、より詳細なツリーが表示されます。

npm list --depth=5コマンドの実行結果を表示するターミナル画面。インストール済みのJavaScriptパッケージの依存関係がツリー形式で示されています。

npm list [package] --depth=5を使えば、特定のパッケージの深さを指定することもできます。この方法の難点は、ツリー内をたどるのが難しいことです。特に依存関係マップが大規模な場合、どこを見ているのかわからなくなりがちです。

Snyk Open Sourceを使う

この方法では、コマンドラインのツリー表示とビジュアルマッピングを組み合わせ、さらに脆弱性検出も行えます。

まずSnykの無料アカウントに登録してサインインします。次に、アプリが保存されているリポジトリをSnykに接続し、スキャンを実行します。Add Projectボタンをクリックし、接続するリポジトリを選択してください。

GitHub、Cloud Foundry、Bitbucket Cloud、CLI、GitHubの公開リポジトリの監視、その他のソースに対応するリポジトリ連携オプション

リポジトリの接続手順に従い、Snykにリポジトリへのアクセスを許可します。

便利なヒント:ほとんどのプラットフォームでは、リポジトリがパブリックでもプライベートでもスキャンできます。

接続したら、ツリーを作成するアプリのリポジトリを検索して選択します。次に、右上のAdd selected repositoriesボタンをクリックして、スキャンを開始します。

「nodejs-goof」で検索し、snyk-labsリポジトリを選択したSnykのGitHubリポジトリ選択画面。

スキャンが完了すると、検出結果の概要が表示されます。ドロップダウン矢印をクリックして最上位の項目を展開すると、スキャンで検出された各項目の内訳を確認できます。

developersteve/nodejs-goofのセキュリティスキャンダッシュボード。コード分析、Dockerfile、package.jsonの結果、重要度別の件数、テスト時間を表示。

今回確認するのは、npmのパッケージマニフェストpackage.json内にあるいくつかの項目です。package.jsonの行をクリックして一覧を展開すると、特定のライブラリで検出された脆弱な経路や、推奨される修正に関する追加情報などを確認できます。

93件の問題を表示するセキュリティダッシュボード。CVE-2018-1002204、CVSS 9.4の重大なadm-zipの脆弱性を含む

ここからジェダイの魔法が本格的に始まります。Dependenciesタブをクリックすると、プロジェクトの依存関係一覧が表示されます。右上のツリー構造アイコンをクリックすると、ライブラリ間の関係や脆弱性が検出された場所などの詳細を確認できます。

goof@1.0.1とネストされたnpmパッケージを示すSnykの依存関係ツリー。セキュリティ問題のバッジと、565件の依存関係が表示されています

これで、脆弱な経路がどこから始まっているのかを確認できる、インタラクティブなライブラリと依存関係のツリーが完成です。

Snykで依存関係ツリーを作成する最大のメリットは、継続的にスキャンできることです。新たな脆弱性が見つかると通知され、バージョンアップやカスタムパッチなどの修正方法も提案されます。脆弱性を検出した際に、より迅速に修正できるよう、リポジトリへのプルリクエストを自動で作成する設定も可能です。

オープンソースとともにあらんことを

オープンソースコンポーネントを定期的に確認することは、アプリケーションのセキュリティを維持するうえで重要です。依存関係ツリーは、使用しているものを理解するための優れた出発点ですが、Snyk Open Sourceのようなソフトウェア構成分析(SCA)ツールでアプリケーションを継続的にスキャンすることも欠かせません。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。

続きを読む

AI Background min crop
Blog

AIが、あなたが受け入れてきたあらゆるリスクを一気に顕在化させる:AI Security Panel: Unfilteredから得た7つの洞察

AIによって攻撃はより安価かつ高速になり、組織がすでに抱えているリスクが露呈しています。4人のセキュリティリーダーが、機械の速度に対応する防御と迅速な修復が今不可欠である理由を語ります。

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpでは、実際の依存関係のアップグレード307件をAIエージェントで検証します。脆弱性が解消され、ビルドとテストが正常に通った場合にのみ、修正成功と判定します。

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに追随するセキュリティ

AIを活用した開発は、従来のセキュリティワークフローを上回るスピードで進んでいます。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。