InvisibleJS が実証するステガノグラフィ攻撃:JavaScript を介してゼロ幅フォントを生成

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” を実行すると、表示上は空白であるにもかかわらず、通常の出力が生成される。

FeatureVersion 1 (eval)Version 2 (import)
Invisibility100%100%
CommonJS SupportNativeLimited
ESM SupportNoFull
Top-Level AwaitNoYes
ExecutionSynchronousAsynchronous
Decoder LengthShortLong

2018年まで遡ると、この手法はゼロ幅 JavaScript の PoC と類似している。この手法が、近年ではフィッシング攻撃に悪用されている。攻撃者は、バイナリにハングル文字を用いた同様の Unicode 難読化を利用し、スクリプト内のペイロードを隠蔽することで、アンチ・デバッグ・チェックを備えるスキャナを回避してきた。

今回の InvisibleJS は、こうした脅威をさらに増幅させる可能性がある。Node.js や Web アプリケーションの環境に、高いステルス性を持つマルウェア・ローダーを組み込み、脅威の検出を困難にするためである。

難読化ツールが急増する中、セキュリティ・チームにとって必要なことは、Unicode 対応のスキャンや挙動分析を強化することである。InvisibleJS は実験的な試みではあるが、コーディング技術の革新がもたらす、サイバー・セキュリティにおける二重の利用性を明確に示している。