isolated-vmの重大な脆弱性、ホスト上でのRCEにつながる恐れ

Node.jsライブラリ「isolated-vm」に存在する深刻度が重大(critical)な型混同の脆弱性により、脅威アクターがホストシステム上でリモートコード実行(RCE)を達成できる可能性があります。

isolated-vmを使うことで、開発者はV8 JavaScriptエンジンのIsolateインターフェースにアクセスし、完全に分離されたJavaScript実行環境を構築できます。各Isolateは独立したV8インスタンスであり、それぞれが専用のヒープメモリ、実行状態、ガベージコレクタを持ちます。

V8のIsolateを使えば、コンテナや仮想マシンを用意しなくても、同一マシン上で複数のサンドボックス化されたJavaScriptコードのインスタンスを実行できます。isolated-vmは、信頼できないJavaScriptコードをV8 Isolate内で実行する用途として広く利用されています。

今回新たに確認された型混同のバグは、まだCVE識別子が割り当てられていませんが、Isolate間でデータをコピーする際に使われる関数「ExternalCopy」に影響します。この点についてEndorLabsが解説しています。この関数は、一方のIsolateでデータをシリアライズし、もう一方のインスタンスで再構築する仕組みになっています。

性能を最適化するため、この処理ではtransferListが用いられます。大きなArrayBufferはこのリストに列挙され、元のバッファをソース側から切り離した上で、実体となるメモリを転送先に引き渡す形で受け渡されます。

問題は、データ転送の際に再構築処理がバイト配列のリストを2回走査しており、2回目の走査が1回目の走査結果をそのまま信頼してしまう点にありました。

しかし、transfer_listのJavaScript配列を走査する際、要素がgetterとして定義されていると、走査のたびに同じ値が返るとは限りません。攻撃者はこのTOCTOU(time-of-check/time-of-use)の弱点を悪用し、攻撃者が制御するポインタを参照させることが可能でした。

EndorLabsによると、ExternalCopyコンストラクタ自体はホスト側からしかアクセスできませんが、ゲスト側は、ホストがサンドボックスに何かを公開する際に用いる仕組みである「ivm.Reference」を悪用対象とすることで、悪意あるtransferListを組み立て、この脆弱性を引き起こすことができるとしています。

この脆弱性の悪用に成功すると、ホストプロセスのクラッシュ(サービス拒否)や制御フローの乗っ取りにつながり、ホスト上でのRCEを可能にする恐れがあります。

isolated-vmのアドバイザリには、次のように記されています。「信頼できないコードをIsolate内で実行し、Referenceを1つでもそのIsolateに共有しているエンベッダーはすべて影響を受けます。呼び出し元が操作可能な配列をtransferListとして渡すホスト側のコードは、ゲストの関与がなくても直接影響を受けます」

この脆弱性に対するパッチは、コピー処理中にユーザーのJavaScriptが実行されるのを防ぐため、isolated-vmのバージョン6.2.0および7.0.1に組み込まれました。

EndorLabsは次のように指摘しています。「この脆弱性は、値の受け渡し境界をまたいでシリアライズを行うC++バインディングという、ネイティブのグルーコード部分に存在していました。このレイヤーはメモリ安全性のない言語で書かれており、V8の生のハンドルやバッキングストアのポインタを直接操作するほか、セキュリティ上重要な処理の最中に、攻撃者が制御可能なJavaScriptオブジェクトを再読み込みします。再読み込みした値に対する未検証の型キャストがひとつあるだけで、本来正しく機能していた分離の仕組みが、完全な脱出につながってしまったのです」

翻訳元: https://www.securityweek.com/critical-isolated-vm-vulnerability-leads-to-rce-on-host/

本記事は securityweek.com の記事を翻訳・要約したものです。