悪意のあるTwitch拡張機能が30,000人のユーザーからOAuthトークンを窃取
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
悪意のあるブラウザ拡張機能で呼ばれる Twitch Enhanced Viewer | JeetBot は、ChromeとFirefoxのユーザーを標的にしてTwitchのOAuthセッショントークンを盗みます。この拡張機能は、ネットワークリクエストを攻撃者が制御するプロキシサーバー経由でルートし、被害者の認証トークンを平文のクエリパラメータとして追加します。これにより、攻撃者はTwitchアカウントをハイジャックし、チャット、ウィスパー、およびアカウント設定にアクセスできる可能性があります。
調査
Socketの研究者は、主要なブラウザのマーケットプレイスでこの拡張機能を特定し、そのJavaScriptソースコードを調べました。分析により、コンテンツスクリプトが Authorization ヘッダーをキャプチャし、バックグラウンドワーカーがそれを攻撃者制御のプロキシインフラストラクチャに転送することが判明しました。研究者はまた、トークンの流出から除外されたロシアのストリーマーチャンネルのハードコードされた許可リストを発見しました。これは、特定の標的や運用上の好みを示している可能性があります。
緩和策
ユーザーは直ちに Twitch Enhanced Viewer | JeetBot 拡張機能を削除し、すべてのアクティブなTwitchセッションを終了して、盗まれた可能性のあるトークンを無効化する必要があります。セキュリティチームは、確認された悪意のあるインフラストラクチャをブロックし、未承認のブラウザ拡張機能をエンドポイントで監視する必要があります。開発者はまた、認証済みトラフィックを第三者プロキシ経由でルーティングする前に、認証情報を削除することを避けるべきです。
対応
悪意のある拡張機能が検出された場合、管理者はその拡張機能IDを含むすべてのエンドポイントを特定し、影響を受けたユーザーセッションを隔離するべきです。侵害されたTwitchアカウントと関連するOAuthトークンは直ちに取り消すべきです。また、組織は未承認または高リスクのサードパーティアドオンのインストールを防ぐために厳格なブラウザ拡張機能ポリシーの施行が必要です。
攻撃の流れ
この部分はまだ更新中です。
検出
異常なトップレベルドメイン(TLD)DNSリクエストによる疑わしいコマンドと制御(dns経由)
第三者サービス/ツール経由でのデータ侵入/流出/制御(プロキシ経由)
第三者サービス/ツール経由でのデータ侵入/流出/制御(dns経由)
検出するためのIOC(HashSha256):悪意のあるTwitchブラウザ拡張機能が30,000ユーザーのOAuthトークンをロシアのボットサービスに露出
検出するためのIOC(SourceIP):悪意のあるTwitchブラウザ拡張機能が30,000ユーザーのOAuthトークンをロシアのボットサービスに露出
検出するためのIOC(DestinationIP):悪意のあるTwitchブラウザ拡張機能が30,000ユーザーのOAuthトークンをロシアのボットサービスに露出
悪意のあるTwitchブラウザ拡張機能がOAuthトークンを露出する [ウェブサーバー]
シミュレーション実行
-
攻撃の流れとコマンド: 攻撃者は被害者のマシンに悪意のあるブラウザ拡張機能をインストールすることに成功しました。この拡張機能の主な目的は、Twitchセッションをハイジャックしてプレミアム機能やユーザーデータにアクセスすることです。これを行うために、拡張機能はブラウザのローカルストレージからユーザーのOAuthトークンをスクレイプします。このトークンを流出させるか、プロキシを通して検証するために、拡張機能はGETリクエストを
usher.ttvnw.netに構築します。それは盗んだトークンを&auth=パラメータを使用して追加します。このシミュレーションは、必要なEventID(5678)と悪意のあるURLと共にモックのイベントログをトリガーして、検出ルールの条件(selection_url AND selection_browser_events)が満たされるようにします。 -
回帰テストスクリプト:
import requests import json import datetime # シミュレーションパラメータ target_url = "https://usher.ttvnw.net/api/get_playlist?user_id=12345&auth=STOLEN_OAUTH_TOKEN_XYZ_789" mock_event_id = 5678 print(f"[*] シミュレーション開始: 悪意のあるTwitch拡張機能の流出") print(f"[*] 対象URL: {target_url}") print(f"[*] モックイベントID: {mock_event_id}") # 実際のシナリオでは、プロキシログはネットワークトラフィックによって生成されます。 # このテストのためにSIEMにログエントリが表示されることをシミュレート: simulation_log = { "timestamp": datetime.datetime.utcnow().isoformat(), "url": target_url, "EventID": mock_event_id, "category": "proxy", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "action": "allowed" } print(f"[+] SIEM情報収集のためのシミュレーションログエントリ生成中...") print(json.dumps(simulation_log, indent=4)) # 実際のリクエストを実施してネットワークレベルのテレメトリが生成されるようにします try: response = requests.get(target_url) print(f"[+] リクエスト送信済み。ステータスコード: {response.status_code}") except Exception as e: print(f"[-] リクエスト失敗(URLが無効であればこれは予期されます ): {e}") print("[*] シミュレーション完了。") -
クリーンアップコマンド:
# このシミュレーション中にシステムに永続的な変更は行っていません。 # ブラウザ履歴を手動で変更した場合は、ブラウザのキャッシュ/履歴をクリアしてください。 echo "[*] クリーンアップ完了。ホストにはアーティファクトは残っていません。"