AgreeToStealが暴く初の悪性Outlookアドイン、4,000件超の認証情報を窃取

これは野生で検出された初の悪性Microsoft Outlookアドインです。しかし、これを開発した人物が攻撃者というわけではありません。

2022年、あるデベロッパーが会議日程調整ツール「AgreeTo」を開発し、Microsoft Office Add-in Storeに公開しました。ツールは機能し、ユーザーからも好評を得ていました。ところがその後、開発者はプロジェクトから離れ、開発は止まってしまいます。

アドインはMicrosoftのストアに登録されたままでした。そしてアドインが指し示すURL(Vercelでホストされていたもの)は、誰でも取得可能な状態になりました。攻撃者がこのURLを取得し、フィッシングキットを配置すると、Microsoft自身のインフラがOutlookのサイドバー内でそれを配信し始めたのです。私たちは攻撃者の情報窃取チャネルへのアクセスを得たことで、攻撃活動の全容を明らかにすることができました。判明したのは、Microsoftアカウントの認証情報4,000件超、クレジットカード番号、銀行口座のセキュリティ質問の回答が窃取されていたという事実です。攻撃者は昨日も盗んだ認証情報のテストを行っており、この記事を読んでいる今この瞬間もインフラは稼働しています。

これは、放棄されたサイドプロジェクトがどのようにしてフィッシングの武器へと変貌したかという物語です。まずはOffice アドインの仕組みから見ていきましょう。

Image

Office アドインの仕組み(そしてなぜそれが問題なのか)

Office アドインは、インストールされるコードではありません。実体はURLです。

デベロッパーはMicrosoftにマニフェストを提出します。これは「このURLをOutlook内のiframeで読み込む」ということを示すXMLファイルです。Microsoftはこのマニフェストを審査し、署名を付け、ストアにアドインを掲載します。しかし実際のコンテンツ、つまりUIやロジックなど、ユーザーが操作するすべての要素は、アドインが開かれるたびにデベロッパーのサーバーからその場で取得されるのです。

具体的に見てみましょう。以下は2022年12月にMicrosoftが署名したAgreeToのマニフェストです。

Image

ここで注目すべきはReadWriteItem権限です。これはアドインにユーザーのメールを読み書きする権限を与えるものです。会議日程調整ツールとしては妥当な権限ですが、そのURLを現在管理している人物にとっては、必ずしも適切とは言えません。

監査すべき静的なバンドルは存在せず、検証すべきハッシュ値もありません。outlook-one.vercel.appが現時点で配信しているものが、そのままOutlook内で実行されます。デベロッパーが不正な更新をプッシュすれば、それは即座に反映されます。もし別の誰かがそのURLの管理権を奪い取れば、そのアドインを利用するすべてのユーザーが目にする内容を、その人物が支配下に置くことになります。しかもそれは、Outlookの信頼されたサイドバー内で、メールへの完全な読み書き権限を伴って行われるのです。

Microsoftがこのマニフェストを承認したのは2022年12月の一度きりでした。それ以降、そのURLが何を配信しているかを再確認することは一切ありませんでした。

開発され、愛用され、そして放棄された

AgreeToは実在する製品でした。オープンソースの会議日程調整ツールで、Chrome拡張機能(利用者1,000人、評価4.71つ星、レビュー21件)と、2022年12月にMicrosoftストアに公開されたOutlookアドインを備えていました。デベロッパーはGitHubリポジトリを活発に維持しており、Microsoft Graph API連携、Googleカレンダー対応、Stripe課金機能を備えた本格的なTypeScriptモノレポでした。これは明らかに、事業として育てようとしていた人物によるものです。

しかしその後、開発は止まりました。Chrome拡張機能の最終更新は2023年5月でした。デベロッパーのドメインagreeto.appは期限切れとなりました。2024年7月までには、Chrome拡張機能に次のようなレビューが投稿されるようになっていました。

「今朝までは星5つの評価だった。ログインしようとしたら、agreeto.appのウェブサイトが期限切れになっていた。このアプリはもう死んでしまったのだろうか。そうでないことを願う」

「このアプリは死んでしまったのか?もう動かない。ログインを促されて、GoDaddyの保留ページに飛ばされる。いつもこのアプリを使っていて、必要なことは何でもできていたのに」

Googleは最終的に2025年2月、機能停止したこのChrome拡張機能を削除しました。しかしOutlookアドインの方は、Microsoft Office Storeに掲載されたままで、もはや誰のものでもなくなったVercelのURLを指し続けていたのです。

Image

乗っ取り

デベロッパーがプロジェクトを放棄した後のある時点で、Vercel上のデプロイメントが削除されました。サブドメインoutlook-one.vercel.appは誰でも取得できる状態になり、攻撃者がこれを奪い取りました。

攻撃者は4ページ構成のフィッシングキットを配置しました。偽のMicrosoftサインインページ、パスワード収集ページ、情報窃取用スクリプト、そしてリダイレクト機能です。必要だったのはそれだけでした。

攻撃者はMicrosoftに何かを提出したわけではありません。審査を通過する必要もありませんでした。ストアの掲載情報を新たに作成する必要すらありませんでした。掲載情報はすでに存在していたからです。Microsoftによって審査され、署名され、配信されていたものです。攻撃者はただ、持ち主のいなくなったURLを取得しただけで、あとはMicrosoftのインフラがすべてをやってくれたのです。

このインフラには、2人の異なる作成者の痕跡が見て取れます。元のデベロッパーが用意していたアイコン、OAuthハンドラー、Microsoftのデザインファイルなどのアセットは、すべて404エラーになっています。攻撃者はそれらを再現しませんでした。ソースコードを持っていなかったからです。攻撃者が配置したのは、フィッシングの流れに必要な部分だけでした。

攻撃の手口

被害者がOutlookでAgreeToアドインを開くと、そこに現れるのは会議日程調整ツールではありません。Microsoftのサインインページです。

Image

被害者がメールアドレスを入力し、続いてパスワードを入力すると、単一のJavaScript関数が被害者のIPアドレスとともに認証情報を収集し、Telegram のBot API経由で攻撃者へすべて送信します。コマンド&コントロールサーバーは不要で、複雑なインフラも必要ありません。TelegramへのfetchAPI呼び出し一つで完結するのです。

その後、数秒間のローディングスピナーが表示され、そのままシームレスに本物のlogin.microsoftonline.comへリダイレクトされます。被害者は「もう一度サインインが必要なのだろう」と思い込み、そのまま日常の作業に戻ります。自分のパスワードがたった今盗まれたことに、気づくすべはありません。

Image

フィッシングの手口自体は基本的なものです。これを効果的なものにしているのは、その文脈です。Outlook内部で動作し、Microsoft自身のアドインインフラによって配信され、信頼された権限プロンプトの背後に隠れているという点にあります。

被害の規模

Microsoft Office Add-in Storeにはインストール件数の表示機能がないため、ストアの掲載情報だけからは影響範囲を評価する手立てがありませんでした。

しかし攻撃者は重大なミスを犯していました。情報窃取用のインフラのセキュリティ対策が不十分だったため、私たちはその内部に入り込むことができたのです。まず、攻撃の規模を確認したところ、4,000人を超える被害者がいることが判明しました。そこで私たちはさらに踏み込みました。攻撃者が収集していた盗難認証情報のすべての内容を復元するスクリプトを作成し、一晩かけて実行したのです。翌朝には、完全なデータセットが手元にありました。すべてのメールアドレス、すべてのパスワード、すべてのクレジットカード番号、そして傍受されたすべてのセキュリティ質問の回答です。被害の全容が、私たちの目の前に広がっていました。

被害者データを保有していたことで、私たちは具体的な対応を取ることができました。被害に遭ったユーザーへの通知と、インフラのテイクダウン申請です。

このキャンペーンは現在も活動を続けています。新たな被害者が今この瞬間にも生まれ続けているのです。

私たちが発見したのは、Outlookアドインにとどまりませんでした。同一の攻撃者は、少なくとも12種類の異なるフィッシングキットを運用しており、それぞれが異なるブランドになりすましています。カナダのISP、銀行、ウェブメールプロバイダーなどです。窃取されたデータには、メールの認証情報だけでなく、クレジットカード番号、CVV、PIN、そしてInterac(Eトランスファー)決済を傍受するために使われる銀行のセキュリティ質問の回答も含まれていました。これは複数ブランドにまたがるプロフェッショナルなフィッシング活動であり、Outlookアドインはその配信経路の一つに過ぎなかったのです。

構造的な問題

この事案が重要である理由は、フィッシングの手口そのものにあるわけではありません。偽のログインページとTelegramボットは、フィッシングとしては極めて基本的な部類です。重要なのは、配信の仕組みと、それを可能にしてしまった構造的な欠陥です。

攻撃者はフィッシングメールを送信したわけではありません。誰かをだまして怪しいリンクをクリックさせる必要もありませんでした。攻撃者は、Microsoft自身のインフラがユーザーを誘導していた放棄済みのURLを乗っ取っただけです。そしてMicrosoftは、それをOutlook内部で、信頼された権限プロンプトの背後に隠したまま配信し続けたのです。

既存のセキュリティツールにとって、これはほぼ検知不可能な攻撃です。

  • メールセキュリティゲートウェイでは検知できません。フィッシングページはメール経由で届くものではないためです。
  • エンドポイント保護ではフラグが立ちません。これは正規のMicrosoftプロセス内で動作するJavaScriptだからです。
  • URLフィルタリングもすり抜けます。フィッシングページはvercel.app上でホストされており、そこには何百万もの正規アプリケーションが同居しているためです。

しかしより根本的な問題はアーキテクチャにあります。OfficeアドインはリモートかつダイナミックなDependencyであり、iframe内でURLを読み込む仕組みです。そのコンテンツは可変です。月曜日には無害だったアドインが、火曜日にはフィッシングページを配信するようになる、あるいは今回のケースのように、何年も経ってからそうなることもあり得ます。Microsoftはマニフェスト提出時にのみ審査を行いますが、実際のコンテンツはその後いつでも、追加審査なしに変更され得るのです。

そして事態はさらに悪化しかねませんでした。AgreeToのマニフェストはReadWriteItem権限を宣言しており、このアドインはユーザーのメールを読み書きできます。攻撃者は今回、単純なフィッシングページのためにこれを利用しましたが、被害者の受信箱を密かに読み取ったり、機密性の高いメッセージを外部に送信したり、被害者自身のアカウントからフィッシングメールを送信したりするJavaScriptを配置することを妨げるものは何もありません。この権限は、アドインが正規のものだった当時にMicrosoftによって付与されたものです。そしてそれは、アドインが正規でなくなった現在も、そのまま有効なのです。

結びに

これは決して新しい懸念事項ではありません。MDSecのセキュリティ研究者は、すでに2019年の時点でOfficeアドインを攻撃対象領域として指摘しており、被害者のメールボックスへの持続的なアクセスを得るために悪用され得ることを実証していました。その投稿は次のような警告で締めくくられています。「Microsoftはまた、開発者がこうしたアドインをストアにプッシュし、ユーザーがそれをインストールできるようにする仕組みも許可している。そこに潜在的な問題があることは、おそらくお分かりいただけるだろう」。それから7年後、AgreeToはまさに彼らが予見していた事態そのものとなりました。

OfficeアドインはリモートかつダイナミックなDependencyであり、そのコンテンツはいつでも変化し得るため、ある一時点での監査だけでは不十分です。Koiは、ブラウザ拡張機能、IDEプラグイン、Officeアドインなどを含む、あらゆるマーケットプレイス上の自己プロビジョニング型ソフトウェアを継続的に監視・監査しています。これにより、あるアドインが悪性化した際、ユーザーよりも先にそれを把握できるのです。詳しくはデモを予約してご確認ください。

IOC(侵害指標)

  • outlook-one.vercel[.]app – フィッシングドメイン(稼働中)
  • WA200004949 – Office アドインID

私たちはこのアドインについて、Office Add-in Storeからの削除をMicrosoftに報告し、outlook-one.vercel.appについてVercelに悪用報告を提出しました。また、Telegramのボットおよび運営アカウントの双方について悪用報告を提出済みです。ボットのメッセージ履歴から認証情報が発見された被害者については、可能な範囲で通知を行っています。

翻訳元: https://www.koi.ai/blog/agreetosteal-the-first-malicious-outlook-add-in-leads-to-4-000-stolen-credentials

本記事は koi.ai の記事を翻訳・要約したものです。