Account Takeover Vulnerability in Microsoft Teams
約一年ぶりの記事ですね。
みなさん、三密避けて OAuth の勉強に勤しんでおられますでしょうか?
さて、今朝こんな記事が上がってました。
「Microsoft Teams」にアカウント乗っ取りの脆弱性、画像表示だけで不正侵入 – ITmedia エンタープライズ
今回の脆弱性は Teams のデスクトップ版と Web ブラウザ版の両方に影響する。攻撃者は狙った相手に GIF などの画像を送り付けて表示させ、画像が Web ブラウザに読み込まれる過程で認証トークンを盗み出す。被害者の画面には画像が表示されるだけなので、自分が攻撃されたことに気付かない。
攻撃者がこのユーザーになりすまして組織内の他の従業員に不正なGIFを送信すれば、ワームのような形で侵入を広げ、組織全体の Teams アカウントを乗っ取る可能性もある。そうなれば、社外秘情報や会議、カレンダー、パスワードといった重要情報が流出しかねない。
GIF 画像貼り付けるだけで Teams アカウント乗っ取れるとか、こんなの読んだら恐ろしくて Teams なんて使えないですね。
この脆弱性が報告されたのが2020年3月20日ということなんですが、Teams の中の人はどんな気持ちで以下の記事を読んでいたのでしょうか。
マイクロソフト、「Teams」のセキュリティをアピール—「Zoom」に批判集まる中 – ZDNet Japan
で、ここから本題、今回の Teams の脆弱性の詳細についてです。英語ですが、こちらの記事に詳細が載ってます。
Beware of the GIF: Account Takeover Vulnerability in Microsoft Teams | CyberArk
まず大前提として、Teams では以下のようなアクセスコントロールがなされていました。
- Teams は内部的に以下の2つの JWT Token を利用する。
- OAuth2 Access Token
- Issuer: “https://sts.windows.net/<tenant-id>/”
- Audience: “https://api.spaces.skype.com”
- Scope: “user_impersonation”
- Skype Token
- Skype ID (= End-user’s Object ID) を含んだ独自 JWT Token
- Teams API にアクセスするためにはこちらの Token が必要
- この Token は上記 Access Token を使って取得可能
- OAuth2 Access Token
- Teams にアップロードされた画像はMSが管理するサーバーに置かれ、Teams にログイン中の状態でしか見れない。
- この画像へのアクセスには “skypetoken_asm” という Cookie にセットされた “Skype Token” を利用
これだけ見ると、「GIF をアップロードしただけでアカウント乗っ取り可能」というほどクリティカルではなさそうに見えます。
でも、よくよく英語記事の方を読んでみると、以下の3つが組み合わさって、アカウント乗っ取りが可能になっていたようです。
- OAuth2 Access Token 自体が Cookie に以下の状態でセットされていた。
- Key : “authtoken”
- Domain : “*.teams.microsoft.com”
- 以下2ドメインが Subdomain Takeover 可能であった。
- aadsync-test.teams.microsoft.com
- data-dev.teams.microsoft.com
- Giphy 投稿時の API Request に (Developer Console とか使えば) 任意の画像 URL を指定可能であった。
うん、そりゃ Access Token ダダ漏れしますね。
画像ファイルのアップロード機能が問題だったわけではなく、GiphyコンテンツとしてPOSTされたコンテンツが問題だったのですね。
で、MS側は以下の対応を施した、と。
- Subdomain Takeover の脆弱性を修正
- “authtoken” Cookie を “teams.microsoft.com” ドメインに限定
これでひとまず脆弱性自体は修正されました。
でもそもそも、
- “user_impersonation” Scope さえ持ってれば全 API にアクセス可能可能で
- そのトークンをいろんなサブドメインに投げまくる
前提の設計って、どうなんでしょうね。。
Skype Token はいまだにいろんなドメインのいろんな API に以下のように統一感ない形で送られていて
- Authorization: skypetoken XXX
- Authorization: skype_token XXX
- x-skypetoken: XXX
挙句には Cookie に
- “skypetoken_asm” という Key で
- “*.asm.skype.com” ドメイン指定で
セットされてますし
- この Token にも Scope という概念がない (“scp=780” 固定)
ようですし。。
やはり僕らは
- Google Wave だか
- Google Duo だか
- Google Allo だか
- Google Hangouts だか
- Hangouts Meet だか
- Google Meet だか
とかいうコロコロ名前とかブランド変わってるのか別プロダクトなのかすらようわからんアレを使うしかないのでしょうか?
ps.
2020年4月現在、世界中コロナで大変な時期ですが、次の記事を書く頃には世の中落ち着いているでしょうか?
そしてそのころ Google のアレはなんていう名前になっているのでしょうか?