In this article
SnykがNode.jsプロジェクトのlibuv CVE-2024-24806 SSRF脆弱性を検出する方法
Node.jsは、JavaScriptを使ってスケーラブルで高性能なアプリケーションを構築できる、強力で広く利用されているランタイムです。しかし、Node.jsが効果的に機能するために、複数のサードパーティ製オープンソースコンポーネントに大きく依存していることを知らない開発者も少なくありません。主要なコンポーネントには、libuv、OpenSSL、V8があります。これらのライブラリはいずれも、Node.jsエコシステムで重要な役割を果たしています。
libuv:Node.jsで知られるイベント駆動型のノンブロッキングI/Oモデルを提供します。
OpenSSL:暗号プロトコルを実装し、安全な通信を実現します。
V8:JavaScriptコードをコンパイルして実行するJavaScriptエンジンです。
これらのサードパーティ製コンポーネントによってNode.jsは強力な機能を実現できますが、悪意のある攻撃者に悪用される可能性のある脆弱性も持ち込まれます。たとえば、libuvやOpenSSLのライブラリに脆弱性があると、Node.jsランタイム全体が侵害され、深刻なセキュリティ侵害につながるおそれがあります。アプリケーションとデータを守るため、これらのコンポーネントを安全に保つことが不可欠です。
Snykは、サードパーティ製コンポーネントに起因するものも含め、プロジェクトの脆弱性を開発者が特定し、修正できるよう支援する強力なセキュリティプラットフォームを提供します。特長の一つは、Snykのアンマネージドオープンソーススキャン機能です。この機能は、Node.jsランタイムに組み込まれたlibuv、OpenSSL、V8などのコンポーネントの脆弱性検出に特に役立ちます。
Snykは管理対象外の依存関係に含まれる脆弱性をどのように特定しますか?
Snykはファイルをハッシュ値に変換し、既知の脆弱性データベースと照合して、検出された問題を表示します。
Node.jsにおけるlibuvの役割
オープンソースコンポーネントのlibuvは、非同期I/Oに特化したマルチプラットフォーム対応ライブラリです。イベントループを提供し、Node.jsランタイムにおけるファイルシステムへのアクセス、ネットワーク通信、タイマーなどの非同期処理を支えています。つまり、libuvはNode.jsのノンブロッキングI/Oモデルの中核を担い、メインの実行スレッドをブロックすることなく複数の処理を同時に実行できます(たとえば、効率の悪い正規表現を記述すれば、処理をブロックしてしまうことがあります)。
同様に、OpenSSLもサードパーティ製のオープンソースコンポーネントであり、Secure Sockets Layer(SSL)およびTransport Layer Security(TLS)プロトコルを実装するための、堅牢で高機能なツールキットを提供します。Node.jsでは、OpenSSLが暗号機能を担い、ネットワーク上の安全な通信を実現します。
通常のnpmライブラリと同様に、Node.jsランタイムに組み込まれたlibuvやOpenSSLなどのC/C++ライブラリにも、セキュリティ上のリスクが潜んでいる可能性があります。
libuvのCVE-2024-24806 SSRF脆弱性
サーバーサイドリクエストフォージェリ(SSRF)脆弱性を悪用すると、攻撃者はサーバーから本来意図されていない宛先にリクエストを送信できます。libuvのCVE-2024-24806 SSRF脆弱性は、サーバーへのリクエストを操作される可能性がある重大な問題です。内部システムや機密データへの不正アクセスにつながるおそれがあります。この脆弱性は、libuvライブラリ、特にバージョン1.47.0に存在します。
SSRFとは何ですか?
SSRFは、攻撃者がサーバーから細工したリクエストを送信できる脆弱性です。これにより、内部サービスや機密データにアクセスされるおそれがあります。
CVE-2024-24806に伴うセキュリティリスクは深刻です。この脆弱性を悪用されると、攻撃者は次のことが可能になります。
一般公開を意図していない内部ネットワークリソースへのアクセス。
認証情報、トークン、内部APIキーなどの機密情報の窃取。
内部サービスへの攻撃。サーバーやネットワークが完全に侵害されるおそれがあります。
Node.jsプロジェクトでは、サードパーティ製コンポーネントに複数の脆弱性が見つかっています。たとえばlibuvには、CVE-2024-24806を含む複数の脆弱性が存在しました。もう一つの重要なコンポーネントであるOpenSSLにも、悪名高いHeartbleedバグ(CVE-2014-0160)など、さまざまなセキュリティ問題がありました。
以下のNode.jsプロジェクトのディレクトリツリー構造から、サードパーティ製オープンソース依存関係がランタイムにどのように含まれているかがわかります。
node
|── doc
|── lib
|── src
|── test
|── deps
|── ada
|── uv
|── docs
|── include
|── m4
|── src
|── test
|── autogen.sh
|── common.gpyi
|── libuv.pc.in
|── Makefile.am
|── uv.gyp
|── v8
|── zlib
|── configure
|── configure.py
|── MakefilelibuvのCVE-2024-24806脆弱性を検出する
SnykでNode.jsプロジェクトのCVE-2024-24806 SSRF脆弱性を検出する手順は次のとおりです。
Node.jsリポジトリをクローンします。
git clone https://github.com/nodejs/node脆弱なlibuvライブラリを含む特定のバージョンに切り替えます。
git checkout v21.6.0Snykのアンマネージドオープンソーススキャンを実行します。
snyk test --unmanaged
スキャン結果にlibuvのSSRF脆弱性が検出されます。
Testing /Users/lirantal/projects/repos/node...
Issues:
[High] Server-Side Request Forgery (SSRF)
Introduced through: https://github.com|libuv/libuv@1.47.0
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-LIBUVLIBUV-6234013
Tested 9 dependencies for known issues, found 21 issues.この出力は、libuvライブラリのバージョン1.47.0に高深刻度のSSRF脆弱性(CVE-2024-24806)が存在することを示しています。攻撃者がサーバーから不正なリクエストを送信できる可能性があるため、重大なセキュリティリスクとなります。
セキュリティ研究者が提供した以下の概念実証コードは、libuvライブラリの脆弱なuv_getaddrinfo関数がホスト名を誤って処理する様子を示しています。
1function attack() {
2 for (let i = 0; i < 128; i++) {
3 const payload = '0x' + '0'.repeat(246) + '7f000001'
4 fetch(`http://localhost?url=http://${payload}.example.com:3000/secret`)
5 .then((x) => x.text())
6 .then(console.log)
7 }
8}
9Snykのアンマネージドオープンソーススキャンは、パッケージマネージャーで明示的に管理されていないサードパーティ製コンポーネントの脆弱性を特定する強力なツールです。libuv、OpenSSL、V8などのオープンソースライブラリに依存するNode.jsのようなプロジェクトで特に役立ちます。
--unmanaged commandラインフラグは、コンポーネントを定義する適切なパッケージマニフェストを使って管理されていないC/C++プロジェクトに特に有効です。すべてのファイルをスキャンし、既知のオープンソース依存関係を検出します。
snyk test --unmanagedコマンドを実行すると、Snykは次の手順で処理を行います。
スキャン:現在のディレクトリ内のすべてのファイルをスキャンします。
ハッシュ化:ファイルをハッシュのリストに変換します。
照合:ハッシュをSnykのスキャンサーバーに送信します。サーバーはデータベースを照会して依存関係の一覧を作成します。
関連付け:サーバーが特定した依存関係を既知の脆弱性に関連付けます。
表示:最後に、検出された脆弱性を強調表示して結果を表示します。
このスキャンにより、開発チームと運用チームは開発の早い段階やCIで脆弱性を見つけられます。カスタムビルドしたNode.jsランタイムの各バージョンを既知の脅威から守ることができます。
実際、Snykのスキャン結果が示すように、Node.js v21.6.0にはV8とOpenSSLに起因する脆弱性が他にも十数件あります。
snyk test --unmanaged
Testing /Users/lirantal/projects/repos/node...
Issues:
✗ [Low] Uncontrolled Resource Consumption ('Resource Exhaustion')
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6592764
✗ [Low] Uncontrolled Resource Consumption
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6913421
✗ [Medium] Uncontrolled Resource Consumption ('Resource Exhaustion')
Introduced through: https://github.com|nodejs/node@21.6.0
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-NODEJSNODE-6478265
✗ [Medium] Denial of Service (DoS)
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6050293
✗ [Medium] Use of a Broken or Risky Cryptographic Algorithm
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6149450
✗ [Medium] Resource Exhaustion
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6157247
✗ [Medium] NULL Pointer Dereference
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6210213
✗ [Medium] Observable Timing Discrepancy
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6277384
✗ [Medium] Improper Input Validation
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365614
✗ [Medium] Improper Input Validation
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365619
✗ [High] Server-Side Request Forgery (SSRF)
Introduced through: https://github.com|libuv/libuv@1.47.0
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-LIBUVLIBUV-6234013
✗ [High] Security Features
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365596
✗ [High] Out-of-Bounds
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365620
✗ [High] Out-of-Bounds
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672126
✗ [High] Improper Restriction of Operations within the Bounds of a Memory Buffer
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672127
✗ [High] NULL Pointer Dereference
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672131
✗ [High] Denial of Service (DoS)
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672137
✗ [High] Heap-based Buffer Overflow
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672138
✗ [High] Type Confusion
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-7015516
✗ [High] Access of Resource Using Incompatible Type ('Type Confusion')
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-7086414
✗ [Critical] Type Confusion
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672130
Tested 9 dependencies for known issues, found 21 issues.管理対象外のC/C++ライブラリを見つけることは第一歩です。Snykでは、snyk monitorコマンドや、プロジェクトのインポート時の自動処理によって、継続的な監視も行えます。
Snykのアンマネージドスキャンには、次のようなメリットがあります。
早期検出:開発プロセスやCIの早い段階で脆弱性を見つけられます。
幅広いカバレッジ:パッケージマネージャーで明示的に管理されていない可能性のある、サードパーティ製コンポーネントの脆弱性を特定できます。
セキュリティの強化:ソースコードから独自のNode.jsランタイムをコンパイル・ビルドする開発チームや運用チームが、ビルドを安全に保てるよう支援します。
堅牢で安全なアプリケーション環境を維持するには、Node.jsとその依存関係を保護することが重要です。libuvのCVE-2024-24806 SSRF脆弱性の発見は、Node.jsランタイムに組み込まれたサードパーティ製オープンソースコンポーネントを精査することの重要性を示しています。libuv、OpenSSL、V8などのコンポーネントは、悪意のある攻撃者に悪用される可能性のある大きな攻撃対象領域となります。
開発ワークフローにSnykを組み込むことで、サードパーティ製オープンソースコンポーネントに伴うセキュリティリスクを先回りして管理・軽減できます。Snykを始めるには、こちらから登録してください。