[警報] systeminformationライブラリにOSコマンドインジェクションの脆弱性 (GHSA-5xpp-75jx-m839)
はじめに:重要な脆弱性情報
Node.jsアプリケーションでシステムの詳細情報を収集する際に広く利用されているライブラリ「<a href="https://www.npmjs.com/package/systeminformation" target="_blank" rel="noopener noreferrer">systeminformation</a>」に、深刻度の高いOSコマンドインジェクションの脆弱性(GHSA-5xpp-75jx-m839 / CVE-2026-50289)が報告されました。この脆弱性は、特にLinux環境でNode.jsがサーバーサイドアプリケーションやCLIツールとして稼働している場合に、攻撃者による任意のコマンド実行を許してしまう可能性があります。
フロントエンドエンジニアの皆さんにとって、直接ブラウザで動作するコードへの影響は少ないかもしれませんが、皆さんが開発に関わるバックエンドAPI、サーバーサイドレンダリング(SSR)環境、CI/CDツール、またはローカル開発環境で利用されるCLIツールなどが、このライブラリを間接的に使用している可能性もあります。依存ライブラリのサプライチェーンリスクとして、ぜひ理解を深めていきましょう。
脆弱性の概要:なぜ危険なのか?
この脆弱性は、<code>systeminformation</code>ライブラリの<code>networkInterfaces()</code>関数がLinux上でネットワークインターフェース情報を収集する際に発生します。具体的には、Debian/Ubuntu系のシステムで利用される<code>/etc/network/interfaces</code>ファイル、およびそれに<code>source</code>ディレクティブで指定された他の設定ファイルを解析する処理に問題があります。
ライブラリは、これらのファイルから<code>source <path></code>の行を見つけると、<code><path></code>部分を抽出し、それを引用符なしでシェルコマンド文字列に挿入して<code>execSync()</code>で実行します。もし攻撃者がこの<code><path></code>部分に<code>;</code>、<code>$( )</code>、バッククォート、<code>|</code>、<code>&</code>などのシェルメタ文字を含めることができた場合、意図しない任意のコマンドが実行されてしまいます。
技術的な詳細:脆弱なコードと実行フロー
脆弱性が存在するコードは、<code>lib/network.js</code>内の<code>checkLinuxDCHPInterfaces()</code>関数にあります(バージョン<code>5.31.6</code>時点)。
問題の行は以下の通りです。
<code>const cmd = `cat ${file} 2> /dev/null | grep 'iface\\|source'`;</code>
ここで、<code>${file}</code>変数が外部から読み込まれたパス情報として引用符なしで<code>cat</code>コマンドに挿入されます。さらに、この関数は<code>source</code>ディレクティブで指定されたファイルパスを再帰的に処理するため、攻撃者は<code>/etc/network/interfaces</code>から連鎖的に読み込まれる任意のファイルに悪意のあるパスを仕込むことが可能になります。
この脆弱性のインプットは、関数の引数ではなく、ローカルのシステム設定ファイル(<code>/etc/network/interfaces</code>など)の内容から読み込まれます。そのため、攻撃者が直接Node.jsプロセスに引数を渡す必要はありません。攻撃者が以下のいずれかの方法で<code>source</code>されるファイルパスに影響を与えられれば、コマンドインジェクションが成立します。
<code>systeminformation</code>は、以下のようなシナリオで利用されることが想定されます。
これらのシステムがNode.jsで動作しており、かつ<code>networkInterfaces()</code>関数(または<code>getStaticData()</code>、<code>getAllData()</code>などの間接的にそれを呼び出す関数)を利用している場合、脆弱性の影響を受ける可能性があります。特に、当該Node.jsプロセスが特権昇格された状態で実行されている場合、攻撃者はその特権でコマンドを実行できてしまいます。
再現方法 (PoCの概要)
PoC(概念実証)では、以下の手順で脆弱性を再現できます。
対策:ライブラリのアップデートとコード修正
最も重要な対策は、<code>systeminformation</code>ライブラリを速やかに最新バージョンにアップデートすることです。最新バージョンでは、この脆弱性に対する修正が適用されています。
もし、直ちにアップデートができない場合、あるいは同様のコードパターンを持つ他の箇所がないか確認するためには、以下の点に留意してください。
まとめ
今回の<code>systeminformation</code>の脆弱性は、一見するとフロントエンドとは直接関係ないように見えますが、Node.jsエコシステム全体の健全性を保つ上で非常に重要な問題です。バックエンドAPIやCLIツールなど、Node.jsで稼働するアプリケーションが間接的にこのライブラリを利用している可能性を常に意識し、依存関係の定期的なチェックと速やかなアップデートを心がけましょう。
特に、ユーザーからの入力だけでなく、ローカルシステムファイルの内容であっても、シェルコマンドに渡す際には常に「信頼できない入力」として扱い、適切なサニタイズや安全なAPIの利用を徹底することが重要です。