LumaC2やCookieGenesisとしても知られるRilideは、Chromiumベースのブラウザーをターゲットにしてユーザーのアクティビティーを乗っ取り、機密データを盗む高度なマルウェアです。2023年に発見されたRilideは、ブラウザーの拡張機能を利用して攻撃を実行します。Rilideは、ブラウザー拡張コンポーネントを悪用して、悪意のあるスクリプトをWebページに挿入します。データ窃盗に加えて、一般的なウォレットやメール・クライアント向けの二要素認証(2FA)操作による主要な機能も備えています。
2025年初頭以来、Trusteer Research Labでは、感染したユーザー・セッションが50,000件を超えており、脅威アクティビティーの規模を示しています。Rilideは、北米、南米、ヨーロッパ、日本を攻撃するTrusteerラボによって検出された世界規模のキャンペーンを継続中です。
この投稿では、Rilideがブラウザー内でどのように動作するかについてはこちらを参考にして、Rilideが攻撃を実行するために使用する手法、特に金融プラットフォームへの影響を検証します。
Rilideの機能は、脅威の全貌が、単一のページ内JavaScriptコードを使用した従来のWebインジェクションからブラウザー拡張機能へと変化していることを浮き彫りにしています。ブラウザー拡張機能は、それなしでは実現が非常に困難な多くの機能を促進します。次の分析では、拡張機能がいかに強力で、なぜ最新のマルウェアがその拡張機能を使用する傾向があるのかを示しています。
以前、ほとんどの「ブラウザーへの侵入」攻撃は、マルウェアがブラウザーのメモリーをスキャンして特定のHTMLパターンを識別し、ページのメモリー内コンテンツに<script>タグを直接挿入することで実行されていました。悪意があるにもかかわらず、これらのスクリプトは、サンドボックス環境内で動作すること、同じオリジン・ポリシーに準拠すること、挿入されたページのライフサイクルに関連付けられることなど、依然としてブラウザーのセキュリティー・メカニズムの対象となっていました。
例えば、挿入されたスクリプトは他のソースからクッキーや参考情報にアクセスできず、ページが閉じられた後に永続化または実行することもできませんでした。
これとは対照的に、悪意のあるブラウザー拡張機能を使用する最近の攻撃は、これらの制限のほとんどを克服しています。拡張機能は特定のWebページから独立して動作し、バックグラウンドで永続的に実行できます。また、高い権限を持っているため、同じオリジンの制限をバイパスし、クッキーや参考情報などのブラウザー全体のストレージにアクセスし、どのページも開かれていない場合でもアクティブな状態を維持できます。この変化により、ブラウザー拡張機能は攻撃者にとって強力なツールとなり、従来のWebインジェクション方法をはるかに超えるレベルの永続性と制御を提供します。
拡張機能により、JavaScriptの実行コンテキストにも変更が加えられ、それ自体に悪意のあるメリットがあります。従来のWebインジェクションは、セキュリティー・ツールを含むWebアプリケーション・コードと同じコンテキストで実行されました。残された証拠(スクリプト要素、ネットワーク要求、js変数など)があれば、マルウェアを検出できる可能性があります。
現在、ページ・コンテキストに加えて、2つの異なるJavaScript環境があります。
これらのコンテキスト間の通信はすべて、ページやその開発者には見えない定義済みのブラウザー・インターフェースを介して行われます。拡張機能のほとんどの動作と証拠は設計により分離されており、メインのドキュメントに変更がなければ、検知は特に困難です。
最新のブラウザーAPIに提供される広範な組み込み機能とアクセス許可のおかげで、強化された回避機能の提供に加え、ブラウザー拡張機能の開発も簡単です。次の分析では、拡張機能によって複雑な攻撃の開発がどのように容易になるかを示しています。
拡張機能が提供する制御、永続性、回避機能の向上、開発の容易さを考慮すると、ブラウザー・ベースの脅威の進化において、従来の「ブラウザー内行動」の手法から拡張機能ベースの攻撃への移行は、理解可能であるだけでなく、避けられないものであると言えます。
マニフェスト・ファイルは、拡張機能の機能とアクセス・レベルを概説する重要なコンポーネントであり、Riledeの悪意のある能力を理解するための最初の手がかりになります。
分析された亜種の1つは、Googleドライブの拡張機能として存在します。
その後に、必要な権限のリストがあります。このリストには、以下を含むがこれらに限定されない、複数のクリティカルなブラウザー機能が含まれています。
「host_permission」では、拡張機能は<all_ urls>(ブラウザーがサポートするスキーム、ドメイン、パス、ポート)にアクセスして、対話することができます。
また、「コンテンツ・スクリプト」も、Document_startのすべてのURLで実行されるように設定されています。つまり、ブラウザーがページの読み込みを開始するとすぐに、コンテンツが完全にレンダリングされる前に実行されるということです。
main.jsスクリプトには一般的な情報窃取機能が含まれていますが、gmail.jsはGmailメール・クライアント・ページをターゲットとします。それにもかかわらず、すべてのスクリプトがすべてのページに挿入されます。
この拡張機能は「declarative_net_Request」の下で、複数のコンテンツ・セキュリティー・ポリシー(CSP)ヘッダーを削除するルールを構成します。これにより、Rilideはセキュリティー制限を回避し、インライン・コンテンツを挿入することができます。
「バックグラウンド」では、拡張機能のサービス・ワーカーが設定されます。ここで、マルウェアはブラウザー・イベントを監視し、C2サーバーとの通信を確立します。次に、バックグラウンド・スクリプト分析を詳しく掘り下げて、マルウェアがどのようにブラウザー・イベントを監視し、攻撃戦略を実行するかをより深く理解します。
Background.jsには、拡張機能のインストール・イベント時に実行するように構成された初期化コードが含まれています。CPUやストレージの詳細などのデバイス情報はchrome.systemコールを使って取得し、インストールされている拡張機能のデータはchrome.mangementを使って取得します。一意のIDは、npm uuidモジュール(jspm経由でインポート)を使用して生成され、ローカルストレージに保存されます。最後に、空のフィルター・パラメーターを指定してChrome.cookies.getAllを使用してすべてのクッキーが取得されます。
このデータはC2サーバーに送信され、その応答によって拡張機能のプロキシ機能を有効にすることができます。インジェクション、コマンド、マルウェアの設定も、拡張機能の初期化時に取得されます。
初期化の最後の部分は、CSP削除ルールを有効にすることです。その後、マルウェアはブラウザー・イベントを設定および監視する準備が整います。繰り返しますが、従来のWebインジェクション技術と比較して、ブラウザー拡張機能を使用することの利点が明確にわかり、すべての情報を簡単に収集できます。
以前のバージョンのRilideでは、C2ドメインがJavaScriptファイルに直接ハードコードされていました。他の亜種は、指定されたビットコイン・ウォレットからトランザクションの詳細を取得することでドメインを抽出した。
ここで分析された新しい亜種には、Telegramチャットボットからドメインを取得するように設計されたコードが含まれています。Google Chromeアラームを使用してドメインを取得するための定期的な呼び出しは、毎分実行されるように設定されています。
このアプローチにより、マルウェアは、そのうちの1つが検出されてブロックされた場合に、ドメインを簡単に切り替えることができます。
この亜種にはTelegramトークンが含まれていませんでしたが、この方法は将来のバージョンで表示される可能性があります。
コンテンツ・スクリプトは、「new-grabber-info」メッセージ・タイプを持つChrome.runtime.sendMessageを使用して、ページのすべてのインプット要素値を送信します。
次のリスナーは、データをC2サーバーに渡すためにbackground.jsに設定されています。
さらに、バックグラウンドでは「set-screenshot-result」メッセージが待っています。
これらのメッセージは、Chrome.tabs.captureVisibleTabを使用して製品の画面を撮影するトリガーされますそしてデータをC2に送り返します。
これらの方法を採用することで、ユーザーが銀行のサイトにログインすると、さまざまな機密データが盗まれる可能性があります。これには、ユーザー名とパスワード、口座番号、PINコード、クレジット・カードの詳細、セキュリティーに関する質問の回答、送金受信者情報が含まれます。
バックグラウンド・スクリプトの最後の部分では、「Chrome.alarms」を使用してコマンド取得とプロキシ・チェックの定期的な呼び出しが設定されています。コマンド・アラームは、C2からコマンドのリストを取得し、それらを1つずつ実行します。
プロキシ・チェック・アラームは、プロキシ接続ステータスをチェックし、必要に応じて新しい接続ステータスを開始します。リスナーが設定されると、バックグラウンド・スクリプトの同期実行が終了します。
cmds.jsには、C2からのパラメーターとともに(事前定義されたリストから)コマンドの受信と、該当する場合は成果の送り返しを容易にするコードが含まれています。
興味深いコマンドには次のようなものがあります。
他のコマンドを使用すると、拡張機能の設定、デバイス情報の取得、現在のURLなどを変更できます。この一連のコマンドにより、マルウェアのワークフローと実行に動的な変更が可能になり、ユーザーにとってより魅力的な操作が可能になります。これらのコマンドのほとんどは、組み込みのChrome拡張機能を利用するため、マルウェア作成者は開発が容易になります。
main.jsコンテンツ・スクリプトは、匿名関数内で初期化されたjQueryライブラリーから始まり、外部インポートなしで完全にインラインに埋め込まれます。その後、悪意のある機能を実行する難読化されたコードが続きます。
Chromium拡張機能アーキテクチャーを使用すると、拡張機能によってインジェクションの責任を分離し、検知を困難にすることができます。サービス・ワーカーは初期化ステップでインジェクションをダウンロードして保存し、コンテンツ・スクリプトはそれらを読み取って実行します。ページ・コンテキスト内ではWebリクエストが送信されなかったため、マルウェアが検知されない状態を維持できていました。main.jsは取得したすべてのインジェクションを反復し、現在のURLがインジェクションURLと一致する場合は、それをインジェクションします。
Rilideは、巧妙な方法でDOMにスクリプトを挿入します。
イベント・ハンドラーとしてインジェクションを「オンリセット」するドキュメント属性を作成します。次に、カスタムの「リセット」イベントをすぐに送信し、インジェクションを実行し、最終的に属性を削除します。
この属性は、「setAttribute」呼び出しと「removeAttribute」呼び出しの間の特定の時間に設定されるため、セキュリティー・ツールによる検知が困難になります。
最後の関数呼び出しでは、汎用データ・スティーラー・リスナーを設定します。
jQueryセレクターを使用すると、すべてのインプット要素が選択され、「change」イベントリスナーが設定されます。
「change」イベントは、入力フィールドの値が変更され、焦点を失うたびに発生します(ユーザーが別の要素をクリックする)。例えば、被害者が銀行口座にログインした際、パスワード・フィールドをクリックしたときにユーザー名が収集され、ユーザーがフォームを送信したときにパスワード入力が盗まれます。データは、ランタイムを介してchrome.runtime.sendMessage、その後、C2サーバーに転送されます。
このスクリプトの目的は、撤回された2FA認証リクエストを新しいデバイス認証リクエストに置き換えることです。このアプローチにより、顧客は新しいデバイスの承認を撤回よりも疑わしいと認識しない可能性が高いため、不正な引き出しを認識しないようになると推測しています。
スクリプトは、jQueryライブラリのインライン初期化から始まり、現在の場所が「mail.google」を含むかどうかを確認した後、実行を開始します。インジェクションは一般的な暗号通貨ウォレットからのEメールを定期的にチェックし、検出された場合は対応するウォレット機能を呼び出します。
jQueryセレクターは非常にシンプルで、テキストにウォレット名を含む「divs」を使用します。
ここでは、特定のベンダーのカスタム・インジェクションを示しますが、ここではすべて同様に動作します。
このコードは、「撤回要求」というテキストを含む要素を検索し、それを「新しいデバイスの承認」に置き換えます。
また、Eメール・プレビューの内容を置き換えるために、「撤回」というテキストを含むスパン要素も検索します。
インジェクション前。
インジェクション後:
Eメール本文自体は次のようです。
つまり、このスクリプトは、「アドレスを慎重に確認してください」というテキストを含んだ「div」要素の派生要素を持つ、CSSクラス「ii」を持つすべての要素を見つけます。また、承認コード・テキストの要素とスタイルに基づいて承認コードを抽出します。スタイル、テキスト、構造の小さな変更によって要素が壊れる可能性があるため、要素を識別するこの方法は非常に安定しています。
最後に、EメールのHTMLコンテンツがハードコードされたコンテンツで上書きされます。
元のコンテンツ:
新コンテンツ:
このメカニズムにより、脅威アクターはユーザーに引き出しについて警告することなく暗号通貨を引き出すことができます。
拡張機能を通じて簡単に実装できるもう1つの主要な機能は、プロキシ機能です。Rilideは、被害者のブラウザーをHTTPプロキシに変換し、被害者の認証情報とデータを利用しながらすべてのリクエストを転送できるようにします。
攻撃者は追加の認証チェックをトリガーすることなく、銀行ポータル、取引口座、決済プラットフォームにアクセスできるため、この機能は金融詐欺にとって特に危険です。IPアドレス追跡のような従来のセキュリティー対策を回避し、正当なユーザー・アクティビティーを装ってトランザクションを開始したり、口座設定を変更したり、資金を流出させたりすることができます。被害者になりすますことで、攻撃者は信頼に基づくメカニズムをエクスプロイトしてシームレスに不正行為を行うことができます。
この機能は、この種の攻撃の概念実証を示す教育プロジェクト「CursedChrome」から直接コピーされたもので、実装が非常に簡単でした。
プロキシは、拡張機能サービス・ワーカーを使用して、攻撃者のC2サーバーとのWebSocket接続を設定することで機能します。この接続により、サービス・ワーカーは攻撃者から送信されたコマンドを受信できるようになります。これらのコマンドは、要求の作成やWebサイトのナビゲートなどのプロキシのアクションを指示します。被害者が収集したCookieを使用してリクエストが行われ、応答はC2に送り返されます。
CursedChromeのコード例:
Rilideコードの例:
いくつかの命名と関数定義の場所を除いて、コードは同じです。このプロジェクトにはバックエンド・コードと管理ユーザー・インターフェース(UI)も付属しており、攻撃者が作業しやすいものになっています。
Rilideは、ブラウザーの拡張機能がブラウザー内行動攻撃の脅威ランドスケープをどのように変えたかを説明しています。拡張機能の固有の機能を活用することで、攻撃者はブラウザーを前例のない制御できるようになり、従来のページ内Webインジェクションの限界をはるかに超える高度で持続的なエクスプロイトが可能になります。この変化は、拡張機能ベースの攻撃のシンプルさとPowerの強さがサイバー犯罪者にとって魅力的なベクトルであるため、警戒と堅牢な防御の必要性が高まっていることを浮き彫りにしています。
身を守るために、ユーザーはインストールされているブラウザー拡張機能を定期的に確認し、見覚えのない拡張機能や疑わしい拡張機能を迅速に削除する必要があります。
さらに、予期しないログインの試みなどの異常なアクティビティーがないかをEメール・アカウントを監視し、不正な取引や未知のアクションがないか、暗号通貨ウォレットを注意深く監視することが不可欠です。積極的かつ慎重にあることは、この進化する攻撃パラダイムによってもたらされるリスクを軽減するのに役立ちます。
IBM® Trusteerは、不正行為とマルウェアの検知、ユーザーの認証、オムニチャネルのカスタマー・ジャーニー全体でのIDの信頼の確立に役立ちます。500を超える主要組織が、顧客のデジタル・ジャーニーを保護し、ビジネスの成長をサポートするためにTrusteerを利用しています。
historytab.js | 2b72cc2c0c53321a472471c5189fdb56 |
notif.js | 8679a34885a02e94189c8fec5132245a |
config.js | 408d8fa7eade661e9a02b6065b792fca |
ico.png | 40de419c81de274c26c63e0f23d91a3f |
scrrule.js | 9db73e9a3a24070de075da13fdea01ab |
exts.js | 868eb23af363b5790d16103d2dd94178 |
rules.json | 6c1f6ab3492a615404a70161303de746 |
manifest.json | fd7d90a5e31cd19bbc65095d722c1525 |
utils.js | bd14616118af50f6e0b886bd90144845 |
content-scripts-register-polyfill.4.0.0.js | 5bf61a91e003afb1e169e3e3be336cac |
app.html | 08785f3794a7ae9aab6b3fa669646794 |
background.js | 1de94fff2cb80f44d82d69f816139974 |
main.js | 6c19e1bf9a7eac2c9b44f5e5c0b76d39 |
gmail.js | 49c851c025506d0a570d75bc00c7605a |
csp.js | 15606d8d8d6ca797c2c98c20114619b4 |
exchangeSettings.js | 2dcf7f099c08f9d074994a0a4f996720 |
screen.js | 7d0defc1a08d5a58d95f5ca38509c8ef |
domain.js | bb0bc698eb64447a3ab581517273487b |
inj.js | 3d67fa8a26390e8819d6bd36a2c5959f |
set.js | 8049e7bd36a88f7a393b7ff0746a04db |
proxing.js | b4b2510d7ec41711ef29ddddd4cab09a |
cmds.js | 0ebb9b78c38ae45884b85632fe087e49 |
machine.js | c43644bed7d94e3ec880af3195e4c906 |
extFiles.zip | 3113c21eee9704b14437edb5c6f29634 |
ドメイン:
statbrwsr.digital