Node.js圧縮ライブラリに再度の脆弱性——CVE-2026-24884のパッチ回避が判明

広く使用されているNode.jsのcompressing npmライブラリに存在していたシンリンクトラバーサルの脆弱性CVE-2026-24884について、以前適用された修正パッチを完全に回避できることが公開情報により明らかになりました。

新たに発見されたこの脆弱性はCVE-2026-40931として正式に追跡されており、深刻度は「高(High)」に分類されます。システムへの事前アクセス権なしに、意図された展開ディレクトリ外へ任意のファイルを書き込める可能性があります。

元のCVE-2026-24884は、細工されたTARアーカイブに埋め込まれた悪意あるシンボリックリンクに対処したものでした。ライブラリがアーカイブを展開する際、それらのシンボリックリンクが意図した展開ディレクトリの外へと解決され、ホストファイルシステム上の任意の場所への書き込みが可能になるというものでした。

問題の核心はこうです。path.resolve()はあくまで文字列操作関数であり、ディスクへの問い合わせは一切行わないため、ディレクトリの構成要素が実はシンボリックリンクであるかどうかを検出できない、とInfosecwriteupsは指摘しています。

例えば展開先が/app/outで、エントリが/app/out/config/passwdに解決される場合、たとえ/app/out/config/etcを指すシンボリックリンクであっても、文字列チェックはTRUEとして通過してしまいます。

そしてOSカーネルがシンボリックリンクを忠実に辿り、fs.writeFile()の呼び出しを/etc/passwdへと誘導します。セキュリティチェックが検証したパスと、ファイルシステムが実際に実行したパスとの間に乖離が生じるわけです。

node-tarのような安全な実装では、すべてのパス構成要素をfs.lstatSync()で一つひとつ確認し、いずれかの要素がシンボリックリンクに解決された時点で展開を中止することで、まさにこのシナリオを防いでいます。

研究者たちが発見した重大なポイントは、攻撃者がアーカイブ内に何かを埋め込む必要すらないという点です。代わりに、シンボリックリンクをgit cloneによって被害者のマシンに事前に仕込む手法が使えます。

Gitはシンボリックリンクをファーストクラスオブジェクトとして扱い、クローン時に忠実に復元します。攻撃者はシンボリックリンク(例: config_file → /etc/passwd)を含むリポジトリを公開し、開発者やCI/CDパイプラインがそれをクローンするのを待つだけです。

その後、アプリケーションがconfig_fileという名前のファイルエントリを含むtarballを展開する際、ライブラリは文字列チェックを通過し、事前に仕込まれたシンボリックリンクを通じて機密ファイルを直接上書きします。攻撃者による追加操作は一切不要です。

Infosecwriteupsによると、この攻撃手法は特に現代のCI/CDパイプラインにおいて危険性が高いとされています。自動化されたジョブが外部リポジトリを定常的にクローンし、人間のレビューなしにアーカイブを処理するためです。

メンテナーたちは責任ある開示を受けてから数時間以内に対応し、概念実証コードを検証したうえで、パッチ済みバージョンのv2.1.1およびv1.10.5をほぼ即座にリリースしました。

この修正では、文字列のみによるパス検証を、再帰的なディスク状態の検証に置き換えています。展開ルートから対象ファイルまでの各パス構成要素に対してfs.lstatSync()が呼び出され、いずれかの要素がシンボリックリンクと判定された時点で展開が即座に停止されます。これにより、書き込みを試みる前に論理パスと物理的なファイルシステムのレイアウトが一致していることを保証しています。

compressing npmライブラリのすべてのユーザーは、直ちにアップグレードを実施してください。

翻訳元: https://cyberpress.org/cve-2026-24884-patch/

ソース: cyberpress.org