2022年8月、VectraProtectチームは、Microsoft Teamsの認証情報を盗み出す攻撃手法を特定しました。攻撃者が、サインインした状態にあるMicrosoft Teamsユーザーの認証情報を入手できてしまうという脆弱性で、これらのファイルを盗むには高い権限を必要としないため、攻撃者はローカルまたはリモートシステムを攻撃の対象とする可能性が生じます。さらに、この脆弱性は、Windows、Mac、Linux用の一般および GCCデスクトップTeamsクライアントすべてに影響を与えることが判明しています。
Vectraの調査にて、Microsoft Teams Appは、認証トークンを平文で保存していることがわかりました。このトークンを使用すると、攻撃者はトークン所有者のIDを推測し、Microsoft Teamsクライアントを通じて可能なあらゆるアクションを実行することができます。さらに悪いことに、これらの盗まれたトークンによって、攻撃者は多要素認証(MFA)を必要とするアカウントに対しても操作を行うことができ、MFAをバイパスしてしまうのです。
Microsoftはこの問題を認識しているものの、直ちに修正が必要な問題としての条件は満たしていないとしています。Vectraとしては、MicrosoftがTeamsデスクトップアプリの更新に着手するまでは、ブラウザ版のTeamsのみの使用を検討すべきだと考えています。インストールしたデスクトップアプリを使用する必要があるお客様は、主要なアプリケーションファイルへのアクセスに対してプロセスを監視することが重要です。
この調査は、Vectra Protectのお客様から、Microsoft Teamsの無効なIDに対する管理方法について苦情があったことが発端となっています。Teamsアプリでは、アカウントを削除するためにクライアントからサインインする必要があるため、エンドユーザーはUIから無効化されたアカウントを削除することができません。もちろん、ユーザーアカウントが無効になっている場合、ユーザーはこの操作を行うことはできません。この問題を解決するために、私たちはTeamsクライアント内のローカル構成データを調べ、その仕組みの解明を始めました。
Microsoft TeamsはElectronベースのアプリです。Electronは、カスタマイズされたブラウザで動作するウェブアプリを作成することで動作します。これは非常に便利で、開発を迅速かつ簡単に行うことができます。ただし、アプリのコンテキスト内でWebブラウザを実行するには、Cookie、セッション文字列、ログなどの従来のブラウザデータが必要です。これが、今回の脆弱性をめぐる問題の根底にあるものです。
Electronの仕組みを十分に理解していない開発者は、過度に透過的なアプリを作成する可能性があります。Electronはアプリを作成する複雑さをわかりにくくするので、開発者が、自らの設計上の決定が予期せぬ影響を与えることを認識してないとしても不思議ではありません。Electronは暗号化などの標準的なブラウザ制御をサポートしておらず、システムで保護されたファイルロケーションは、そのままの状態のElectronではサポートされないため、安全性を保つためには効果的な管理が必要です。重大なセキュリティの見落としがあるために、アプリケーションセキュリティの研究者が、このフレームワークの使用を嘆いているという話はよく耳にします。
私たちはまず、ログインしているアカウントへの参照をすべて削除する方法を模索しました。目標は、古いアカウントを削除し、その古いアカウントが存在していないとしてTeamsを動作させることでした。設定ファイルや初回実行ファイルを修正するために何度も試行錯誤を繰り返しましたが、何も効果がありませんでした。そこで推測をもとに、既知のユーザープリンシパル名を検索したところ、2つの重要なファイルが返ってきました。
最初の重要なファイルは、アクセストークンが平文で記述されたldbファイルでした。検証の結果、これらのアクセストークンは有効であり、以前起こったエラーによる偶然のダンプではないことが判明しました。これらのアクセストークンによって、OutlookとSkypeのAPIにアクセスが可能になりました。Microsoft Teamsのアーキテクチャは、Skype、SharePoint、Outlookなどの様々なM365サービスの集合体であることを知っておくことは重要です。アクセストークンが有効である限り、各サービスへのアクセスを保持し続けてしまいます。
次のファイルは、GDPRによって、すべてのウェブサイトで、その使用に同意が必要となっている「Cookie」のようなブラウザCookieデータベースです。Cookieには、セッション情報、マーケティングタグ、アカウント情報、場合によってはアクセストークンなどのデータが保存されます。Teamsのデスクトップアプリは、ここにトークンも保存しているのです。
Cookieデータベースを読み取るのに最適な方法は、sqlite3データベースクライアントを使用することです。このクライアントを使えば、必要な値だけを抽出することができます。次のクエリは、トークンの名前とトークンの値を返します。
各トークンをMicrosoftのjwt検証サービス(https://jwt.ms)に照らして評価しました。その結果、どのトークンも有効であり、追加の認証を必要とせずに動作することがわかりました。ここで、Teamsを再インストールする必要があるという最初の問題は、MicrosoftTeamsクライアントに潜在するIDの乱用に比べれば、はるかに小さな問題であることに気がつきました。
この事象をもとに、保護されていない認証情報を利用したエクスプロイトの作成に取り掛かりました。複数の選択肢を検討した結果、アクセストークンを使ってTeams経由で認証情報保有者のアカウントにメッセージを送信することが最適であると判断しました。このゴールを念頭に置き、メッセージを送信する際のAPIコールを追跡するためにブラウザでTeamsクライアントを起動したところ、次の事象を発見しました。
https://amer.ng.msg.teams.microsoft.com/v1/users/ME/conversations/48:notes/messages
このAPIエンドポイントを使用すると、自分自身にメッセージを送ることができ、アカウントの列挙に煩わされることはありません。次に、アクセストークンが必要なため、SQLiteエンジンを使用しました。SQLiteはインストール不要なので、SQLiteをローカルフォルダにダウンロードして実行し、Cookieデータベースを読み込んで、メッセージ送信に必要なSkypeAccessトークンを抽出します。
トークンを手に入れたので、最後にメッセージをつなぎ合わせる必要があります。リクエスト本体をカスタマイズするために少し時間を要しましたが、最終的には成功しました。メッセージの重要度フラグを設定し、件名を「You've Been PWND」として送信するようにしました。メッセージ自体は、SkypeAccess Tokenになります。
この時点でツールがメッセージを送信し、アクセストークンが個人チャットに保管されていることを確認できます。
およそ午前中でここまで確認がとれました。
Microsoftは、デスクトップアプリ内でシームレスなシングルサインオンを実現するために、これらの認証情報を保存しています。しかし、現在のセキュリティ実装では、攻撃者がトークンにアクセスすることが可能です。デスクトップアプリケーションでは、最新のブラウザのようにCookie データを保護するための追加のセキュリティ制御がないため、攻撃者が認証情報を悪用する機会が生まれてしまいます。
この状態でMicrosoft Teamsクライアントをインストールして使用する人は、Teamsがシャットダウンされている場合でも、Teams UIを介して可能なあらゆるアクションを実行するために必要な認証情報を保存していることになります。これにより、攻撃者は、SharePointファイル、Outlookのメールとカレンダー、およびTeamsのチャットファイルを変更できるようになります。さらに、攻撃者は、破壊、情報流出、または標的型フィッシング攻撃を行うことで、組織内の正当なコミュニケーションを改ざんすることができます。この時点で、攻撃者は企業内のあらゆるリソースへのアクセスが可能になります。
この攻撃は、重大なインシデントに発展する可能性があります。それは、組織内部に大きな損害を与えるために、特別な権限や高度なマルウェアを必要としないことです。本脆弱性のあるマシンが複数台あれば、攻撃者はアカウントを乗っ取り、組織内のコミュニケーションを手中に収めることができます。企業の技術責任者、CEO、CFOなどの重要な役職のアカウントを完全にコントロールできたのならば、攻撃者は、組織に損害を与えるような作業を行うよう指示ができてしまいます。このようなフィッシング攻撃に対して、社内でどのような対策やトレーニングを実施していますか?
機密ファイルにアクセスするプロセスを特定するために、システム監視ルールを作成します。具体的なファイル/フォルダの推奨事項は2つあります。
- [Windows] %AppData%Microsoft³³Teams³³Cookies
- Windows] %AppData%Microsoft³³Local Storage³³leveldb
- macOS] ~/Library/Application Support/Microsoft/Teams/Cookies
- macOS] ~/Library/Application Support/Microsoft/Teams/LocalStorage/leveldb
- Linux] ~/.config/Microsoft/Microsoft Teams/Cookies
- Linux] ~/.config/Microsoft/Microsoft Teams/Local Storage/leveldb
Teams.exe以外のプロセスがこれらのファイルにアクセスした場合、保存されたデータがTeamsアプリケーションのコンテキスト外でアクセスされていることを示します。
Microsoftがこの問題に効果的なパッチを適用するまで、MicrosoftTeamsのクライアントを使用することはお勧めしません。トークンの漏洩を防ぐためにOSレベルで複数の制御が可能であるMicrosoft Edgeを使い、ウェブ版のTeamsを使用してください。幸いなことに、Teamsのウェブアプリは堅牢で、デスクトップクライアントで有効なほとんどの機能をサポートしているため、生産性への影響を最小限に抑えることができます。
MicrosoftがElectron Teamsアプリをアップデートした後も、未承認のTeamsアプリ、ボット、コネクタなどのインストールを防ぐために、制限の高いモデルへの移行が重要です。
Microsoftは2022年12月までにTeams for Linuxを終了することを発表しているため、Linuxユーザーはいずれにせよウェブ版を使うことになります。
アプリケーションでElectronを使用する必要がある場合は、OAuthトークンを安全に保管してください。秘密の保管をするには、KeyTarパッケージを使用する方法があります。これは、秘密管理のためにローカルOSのセキュリティメカニズムを活用するものです。
How to securely store sensitive information in Electron with node-keytar(node-keytarを使用してElectronで機密情報を安全に保存する方法) | by Cameron Nokes | Cameron Nokes | Medium
トークンを保存する必要がある場合は、暗号化された方法で保存してください。これにより、攻撃者にTeams実行プロセスをホストするメモリスタックへの侵入を強制することで、トークンにダメージを与えるために必要な労力が大幅に増加します。理想的には、OSのネイティブツールでCookieのコンテンツを暗号化する最新のデスクトップブラウザと同様の保護機能を利用することです。
さらに、Teamsアプリで無効にしたアカウントを、完全なアンインストールや再インストールをせずに削除できるようにしてください。
このタイプの攻撃を阻止するために、脅威を確実に検知し、攻撃前後の振る舞いを追跡できる対応ソリューションが必要になります。Vectra の脅威検知およびレスポンスプラットフォームは、C&C攻撃の兆候を捉え、その後の攻撃手順として発生するネットワーク偵察、横移動、情報流出の振る舞いを検知します。クラウドでは、Vectraは、Azure ADの特権を含むAzureADの侵害された認証情報を使用した攻撃者の活動、AWSのような接続されたクラウドサービスプロバイダーに対する本格的な攻撃、およびExchange、SharePoint、PowerAutomateを含む他のMicrosoft 365アプリに対する攻撃について振る舞い検知を行うことが可能です。
Vectraがどのように脅威を察知し、阻止するかについては、当社ウェブサイト(https://www.vectra.ai/attack-surface/azure-ad)でご確認ください。
本ブログ記事は「UnderminingMicrosoft Teams Security by Mining Tokens」の翻訳版です。投稿された時点(2022年9月13日)での原文に基づいています。英語版との相違がある場合は、英語版を優先させてください。