InvisibleJS:ゼロ幅文字で隠された実行可能なESモジュールが登場、新たな脅威か

はじめに

GitHub上で「InvisibleJS」という新しい実験的なツールが発表され、JavaScriptのソースコードを人間には完全に不可視にしながらも、実行可能状態に保つ技術が実演されました。開発者oscarmine氏によって作成されたこの概念実証の難読化技術は、ゼロ幅Unicode文字を利用して、一見すると空白のファイルに悪意のある実行可能なペイロードを隠すことが可能です。

InvisibleJSの仕組み

InvisibleJSは、ステガノグラフィー技術を用いてJavaScriptコードを不可視文字に変換します。このツールは、ソースコードを8ビットのバイナリ文字列に変換し、各ビットをゼロ幅Unicode文字にマッピングします。具体的には、ゼロにはゼロ幅スペース (U+200B)、1にはゼロ幅非接合子 (U+200C)が使用されます。結果として生成されるファイルは見た目には空ですが、ランタイムで隠されたコードをデコードして実行するブートストラップローダーが含まれています。

二つのバージョン:古典的なevalと最新のimport

リポジトリでは、異なるJavaScript環境向けに二つのバージョンが提供されています。

  • バージョン1(Classic eval):CommonJSおよび従来のスクリプトを対象とし、同期的なeval()実行を使用します。このバージョンは、require__dirnamemodule.exportsなどのNode.js変数をネイティブに処理し、古い環境やレガシーブラウザとの互換性があります。
  • バージョン2(Modern import):ESモジュールおよび最新のアプリケーションをサポートし、データURIスキームを持つ動的なawait import()を介して機能します。このバージョンは、トップレベルのimport文、exportキーワード、トップレベルのawait機能を提供しますが、ESモジュールのサポートが必要です。

どちらのバージョンも100%の不可視性を提供しますが、CommonJSのサポートや実行方法(同期/非同期)、デコーダーの長さなどに違いがあります。

セキュリティ上の懸念と対策

この技術は重大なセキュリティ上の懸念を引き起こします。InvisibleJSでエンコードされたファイルは、目視によるコード検査を回避し、見た目が空のファイルの中に悪意のあるペイロードを隠す可能性があります。ただし、UTF-8エンコードによりファイルのサイズが元の約24倍に膨張するという点は、潜在的な検出指標となります。

セキュリティ研究者たちは、InvisibleJSが巧妙なステガノグラフィーエンコーディングを示す一方で、このような技術がコードインジェクション攻撃サプライチェーン攻撃、または手動によるコードレビューに依存するセキュリティ審査を回避するために悪用される可能性があると警告しています。

このツールは、コード難読化能力の教育的なデモンストレーションとして公開されています。組織は、このような技術の悪用から防御するために、ゼロ幅文字エンコーディングスキームを検出できる自動コード分析ツールおよびセキュリティスキャナーの導入が推奨されます。


元記事: https://gbhackers.com/invisiblejs-executable-es-modules-hidden-in-plain-sight/