這是一個非常經典的開發失誤案例,讓我們用工程師的視角來分析為什麼一個簡單的設定值會導致大規模的安全漏洞。
漏洞背景與核心原因
在開發 Android 應用程式時,工程師經常會設定 Debug Flag(除錯旗標),用來在開發階段開啟額外的日誌或跳過某些繁瑣的驗證流程,方便測試)。然而,在這次的事件中,Microsoft 365 的多款 Android App 在正式發布的版本中,意外地將 setIsDebugMode(true) 這行程式碼留在了生產環境中。
這個旗標被開啟後,導致系統跳過了原本應該執行的安全性檢查。正常情況下,Microsoft 365 的各個 App(如 Word、Excel、PowerPoint)之間會共享登入狀態,這樣使用者只要在其中一個 App 登入,其他 App 就能直接使用。這種機制依賴於一種驗證過程,確保只有受信任的 Microsoft 官方 App 才能請求獲取帳號 Token。但因為 Debug 模式被開啟,這個驗證機制失效了,導致任何安裝在同一台手機上的第三方 App 都能偽裝成受信任應用,直接向系統索要 Token。
什麼是 FOCI Token 以及為什麼它很危險
這次洩漏的關鍵在於 FOCI Token(Family of Client Identities tokens)。簡單來說,這是一種特殊的 Refresh Token(刷新令牌),用於實現單一登入(SSO)功能。
對於初級工程師來說,可以將 Token 理解為一張臨時通行證。一般的 Access Token 有效期很短,而 Refresh Token 則是用來在通行證過期後,不需要使用者重新輸入密碼就能換取新通行證的憑證。FOCI Token 的特點是有效期長且適用範圍廣。
如果攻擊者透過這個漏洞拿到了 FOCI Token,他們不需要知道使用者的密碼,也不會觸發任何登入畫面或權限請求視窗,就能在後台靜默地讀取使用者的電子郵件、開啟雲端檔案、瀏覽行事曆,甚至冒充使用者發送訊息。由於這些請求看起來像正常的 App 行為,伺服器端的日誌很難察覺異常。
受影響範圍與漏洞評級
該漏洞存在於一個共用的 Microsoft SDK 中,因此影響範圍極廣,包括 Word、Excel、PowerPoint、Microsoft 365 Copilot、Loop 以及 OneNote。有趣的是,Teams App 雖然使用了相同的 SDK,但其旗標被正確設定為 false,因此倖免於難。
從安全評級來看,這被歸類為 Local Spoofing(本地欺騙)漏洞。這意味著攻擊者必須先想辦法讓使用者在手機上安裝一個惡意 App,才能利用此漏洞。雖然不需要遠端直接攻擊,但一旦惡意軟體進入設備,就能輕易接管整個 Microsoft 365 帳號。
實務上的修復與後續處理
Microsoft 已經透過 Google Play 發布了更新版本來修復此問題。然而,從工程實務角度來看,單純更新 App 並不能完全消除風險。
因為 FOCI Token 的生命週期比 App 的更新週期長。如果使用者在更新 App 之前,手機裡就已經存在惡意軟體並偷走了 Token,即使現在 App 更新到最新版,攻擊者手中持有的那個 Token 依然有效。
因此,針對高風險帳號或企業設備,最徹底的解決方案是強制撤銷所有現有的 Refresh Tokens(Revoke Tokens),強迫使用者重新登入,從而讓舊的、可能已洩漏的 Token 全部失效。
給開發者的啟示
這個案例提醒我們,環境配置管理(Environment Configuration)至關重要。將測試用的除錯代碼直接寫死在程式碼中(Hard-coded)是非常危險的。正確的做法應該是使用編譯時的條件判斷(例如 Android 的 BuildConfig.DEBUG),確保除錯功能絕對不會被打包進正式發布的 APK 中。
來源:thehackernews.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。