新しい実験的ツール「 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/