InvisibleJS:ゼロ幅文字で、見た目は空のまま実行可能なESモジュールを隠す

新しい実験的ツール「 InvisibleJS 」が GitHub に登場し、JavaScriptのソースコードを人間の目から完全に隠しつつ、完全に実行可能なままにできることを示しています。

開発者 oscarmine によって作成されたこの概念実証の難読化手法は、ゼロ幅のUnicode文字を利用して実行可能なペイロードをエンコードし、肉眼では空のファイルのように見せます。

InvisibleJSの仕組み

InvisibleJSはステガノグラフィ(情報隠蔽)技術を用いて、JavaScriptコードを不可視文字へ変換します。

このツールはソースコードを8ビットのバイナリ文字列に変換し、その後、各ビットをゼロ幅Unicode文字に割り当てます。具体的には、0にはゼロ幅スペース(U+200B)、1にはゼロ幅非接合子(U+200C)を使用します。

生成される出力は空に見えますが、実行時に隠されたコードをデコードして実行する bootstrap ローダーを含んでいます。

リポジトリには、異なるJavaScript環境向けに調整された2つのバージョンが用意されています:

バージョン1(クラシック eval) はCommonJSと従来のスクリプトを対象とし、同期的な eval() 実行を使用します。このバージョンは require、 __dirname、そして module. exports のようなNode.js変数を自然に扱えるため、古い環境やレガシーブラウザとも互換性があります。

バージョン2(モダン import) は、データURIスキームを用いた動的な await import() により、ESモジュールおよびモダンアプリケーションをサポートします。このバージョンではトップレベルのimport文、exportキーワード、トップレベルawait機能が利用できますが、ESモジュールのサポートが必要です。

機能 バージョン1(eval) バージョン2(import)
不可視性 100% 100%
CommonJSサポート ネイティブ 限定的
ESMサポート なし 完全サポート
トップレベルAwait なし あり
実行方法 同期 非同期
デコーダー長 短い 長い

この手法は重大なセキュリティ上の懸念をもたらします。InvisibleJSでエンコードされたファイルは、目視によるコード検査を回避でき、空のファイルに見えるものの中に悪意あるペイロードを隠せる可能性があります。

UTF-8エンコーディングにより、ファイルサイズが元の約24倍に膨張することは、検知の手がかりとなり得ます。

セキュリティ研究者は、InvisibleJSが巧妙なステガノグラフィ的エンコーディングを示している一方で、このような手法が コード注入攻撃、サプライチェーン侵害、または手作業のコード検査に依存するセキュリティレビューの回避に悪用される可能性があると警告しています。

両バージョンとも、JavaScriptファイルをエンコードするために同一のコマンドラインインターフェースを利用します。

このツールはoscarmineのリポジトリとしてGitHub上で公開されており、コード難読化能力の教育的デモンストレーションとして公開されています。

組織には、このような手法の潜在的な悪用に備えるため、ゼロ幅文字のエンコーディング方式を検出できる自動コード解析ツールやセキュリティスキャナーを導入することが推奨されます。

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

ソース: gbhackers.com