InvisibleJS Tool Hides Executable ES Modules in Empty Files Using Zero-Width Steganography
2026/01/12 CyberSecurityNews — 目に見えないゼロ幅 Unicode 文字を用いて JavaScript コードを隠蔽するオープンソース・ツール InvisibleJS は、マルウェア攻撃における悪用のリスクを明らかにし、警鐘を鳴らすものである。GitHub 上で開発者 oscarmine がホストする InvisibleJS は、ファイル内の空白に見える場所に、ステガノグラフィを用いてソースコードを埋め込む仕組みである。このプロセスでは、JavaScript がバイナリ文字列へ変換され、”0” がゼロ幅スペース (U+200B) に、”1” がゼロ幅非結合文字 (U+200C) にマッピングされる。

その後に、小さなブート・ストラップ・ローダーが、隠蔽されたペイロードをデコードして実行する。つまり、VS Code などのエディタでは、コードを肉眼で確認できないという状況に陥る。
異なる環境向けの2つのバージョン:
リポジトリで用意されているバージョン1 (Classic with eval) は、CommonJS および従来の Node.js 環境に適している。このバージョンは require と module.exports をネイティブにサポートする。
バージョン2 (インポート機能付きのモダン) は ES (ECMAScript) モジュールを対象としている。最上位レベルのエクスポートに dynamic await import() を使用するが、”.mjs ファイル” または “type:モジュール” 設定が必要となる。
コードの非表示は CLI 経由で容易に実行できる:
- バージョン1:node hideV1.mjs -i input.js -o Hidden.js
- バージョン2:node hideV2.mjs -i input.js -o Hidden.js
“node hideV2.mjs” を実行すると、表示上は空白であるにもかかわらず、通常の出力が生成される。
| Feature | Version 1 (eval) | Version 2 (import) |
|---|---|---|
| Invisibility | 100% | 100% |
| CommonJS Support | Native | Limited |
| ESM Support | No | Full |
| Top-Level Await | No | Yes |
| Execution | Synchronous | Asynchronous |
| Decoder Length | Short | Long |
2018年まで遡ると、この手法はゼロ幅 JavaScript の PoC と類似している。この手法が、近年ではフィッシング攻撃に悪用されている。攻撃者は、バイナリにハングル文字を用いた同様の Unicode 難読化を利用し、スクリプト内のペイロードを隠蔽することで、アンチ・デバッグ・チェックを備えるスキャナを回避してきた。
今回の InvisibleJS は、こうした脅威をさらに増幅させる可能性がある。Node.js や Web アプリケーションの環境に、高いステルス性を持つマルウェア・ローダーを組み込み、脅威の検出を困難にするためである。
難読化ツールが急増する中、セキュリティ・チームにとって必要なことは、Unicode 対応のスキャンや挙動分析を強化することである。InvisibleJS は実験的な試みではあるが、コーディング技術の革新がもたらす、サイバー・セキュリティにおける二重の利用性を明確に示している。
JavaScript のコードを目に見えない文字の中に隠してしまうという、InvisibleJS が実証する攻撃手法を紹介する記事です。この問題の原因は、 Unicode が持つゼロ幅文字を、 JavaScript の実行環境やエディタがデータや識別子として処理できてしまう点にあります。具体的には、コードをバイナリに変換し、それぞれをゼロ幅スペースなどの不可視文字に置き換えることで、人間には空白に見えるファイルの中に、コンピュータだけが読み取れる隠し命令を埋め込む仕組みが成立します。よろしければ、Steganography での検索結果も、ご参照ください。

You must be logged in to post a comment.