An Empirical Analysis of Single Sign on Account Hijacking and Session Management on the Web
出處:USENIX Security’18
簡介
這篇文章研究了SSO賬號劫持和相關會話管理的情況,區別於以往的研究,本文主要聚焦在IdP賬號被劫持對SSO的安全性帶來的一系列影響。
同時,作者基於OpenID Connect提出了一種Single Sign-Off擴充套件方案以降低這類賬號劫持的危害。
本文的主要貢獻點:
- 首次對SSO生態系統現狀進行了大規模分析,調查了Alexa top 1M 的網站使用IdP的情況。
- 對SSO中IdP賬號被劫持的後果進行了深入分析,以95個流行的web和mobile RP為樣本,分析了IdP賬號被劫持對後續授權、RP賬號建立等過程的影響。
- 作者的分析發現當前的SSO系統無法阻止攻擊者在RP授權被撤銷後仍能訪問受害人RP賬號,針對這種情況他們提出了一種基於OpenID Connect協議的single sign-off擴充套件;
本文涉及的SSO協議主要是OAuth 2.0和OpenID Connect.
威脅模型
由於本文主要研究IdP賬號被劫持產生的影響,這裡首先介紹兩種IdP認證使用者的情況。
- 如果使用者沒有在當前user agent登入到IdP,那麼需要在一個IdP頁面輸入賬號密碼以登入,隨後IdP會生成一個cookie供後續使用。
- 如果使用者在當前的user agent已經登入過IdP了,或者說,之前登入的cookie還有效,那麼當用戶要在某個RP使用IdP賬號登入時,IdP可能就不會再要求使用者輸入賬號密碼,而是使用之前的cookie.
因此,這裡作者主要考慮了兩種威脅模型:
- Phishing:這種途徑主要是獲取使用者賬號密碼。是一種較為常見的攻擊方式。
- Sniff Wifi (Cookie hijacking):劫持HTTP cookie以劫持使用者賬號。
網路流量分析
作者以Facebook為例,來闡述cookie劫持的可行性。
作者審計了所有流行Facebook應用(Facebook, Messenger, Instagram) 在iOS, Android, Window mobile的流量,發現瀏覽iOS上Facebook的應用內瀏覽器以及訪問提供Facebook靜態內容的網站時會暴露cookie,因為對域名staticxx.facebook.com上靜態內容的請求沒有受HSTS保護,同時cookie沒有設定Secure標記或該標記沒有強制使用。
作者在實驗環境中通過重放了捕獲cookie中的三個關鍵值(c_user, datr, xs)成功劫持了一個賬號。同時,作者發現,在另外的裝置上重用這些cookie並不會產生安全提醒。
作者在2017年1月-5月期間監控了他們所在大學的無線網路的流量,以分析cookie劫持問題的普遍性。
作者最終發現了5,729個不同的有問題的cookie,被使用在對11個不同的Facebook域名的請求中,staticxx.facebook.com是最常見的。在監控期間,這個問題影響了28個版本的iOS Facebook應用,以及14個iOS Messenger應用。
SSO的使用普遍性
作者根據Wikipedia上的一個OAuth provider的列表,形成了一個包含65個支援OAuth 2.0 和/或 OpenID Connect協議的IdP的列表。然後作者開發了一個工具來自動化分析Alexa上的網站是否支援這些IdP的SSO服務,這個工具使用了Puppeteer瀏覽器自動化庫。
作者用這個工具分析了 Alexa top 1M 的網站,其中912,206個網站能被成功訪問,57,555(6.3%)的網站支援SSO. 其中,Facebook是使用最廣泛的IdP,被4.62% (42,232)個網站支援,Google為 2.75% (25,142),Twitter第三 1.34% (12,294). 作者的分析表明,流行的網站中對SSO的支援率比較高。
另外,作者的分析中發現,有個IdP既是IdP,又是RP,所以就會出現一個IdP被攻破了,會影響它的RP中那些扮演IdP角色的網站,進而影響更多的RP。下圖展示了這種級聯影響,紅色的點表示那些受害者的Facebook賬號被攻破不會直接影響但會間接影響的RP.
RP賬號接管
這個攻擊的前提條件是,使用者使用IdP賬號在RP建立了一個賬號,之後的某個時間點攻擊者劫持了使用者的IdP賬戶,進一步劫持該使用者的RP賬戶。
分析方法
作者人工分析了Alexa top 500網站中的29個網站以及66個流行的iOS應用,它們都支援Facebook SSO. 這些RP的選擇是來自不同的類別或功能,作者也選擇了一些Android 應用進行了分析。
作者給每個網站和移動應用都使用SSO建立了一個新的賬號,同時添加了必要的資訊。建立賬號後,作者按照正常使用者行為進行了一些操作,比如發信息,購物等,然後登出。
然後作者使用劫持的cookie登入使用者的IdP,然後檢視這樣的攻擊者在RP的訪問級別是什麼樣的(比如檢視使用者資訊、訂單記錄、發信息等)。
大部分情況下,這類劫持cookie攻擊者的訪問級別和被攻擊使用者是一樣的,這也很合理,有3個案例攻擊者在訪問某些服務的時候需要重新進行IdP身份驗證。其中(1)Hookup應用,它每次都要求IdP賬號重新認證,但是作者發現不選擇登入介面而是註冊介面可以繞過賬號認證;(2)Guardian應用,只能獲得部分許可權,進行“設定”操作的時候需要重新輸入使用者的Facebook密碼。作者發現建立RP賬號的密碼不需要重新IdP認證,因此可以建立RP密碼,然後再登入獲得全部的訪問許可權;(3)Kayak應用,支付資訊、郵件設定、增加新旅客資訊需要用Facebook的密碼重新認證;
攻擊可見性
作者進一步分析了這類攻擊是否會留下“足跡”導致攻擊被發現。
作者發現這95個RP沒有一個通知使用者關於其它裝置登入或活躍會話的情況。僅10個RP提供選項可以檢視當前使用者賬戶的活躍會話,但一般使用者不會設定這些選項。在作者的劫持cookie的實驗中,也沒有發現Facebook會給使用者傳送警告,攻擊者的會話除非超過一個小時否則不會出現在登入list上,這樣受害者將沒有辦法知道自己別攻擊了。
永續性訪問
攻擊者可能會失去對受害者IdP賬戶的控制,當受害者修改IdP密碼後,有9個RP會阻止攻擊者訪問它們的賬戶,其中2個每次會話都要求重新進行SSO認證,7個會將使用者登入。
密碼重置
作者設計了一種新的攻擊方式可以讓攻擊者能持久訪問受害者的RP賬戶,其核心思想是攻擊者登入到受害者的RP賬戶,把關聯到RP賬戶的郵箱設定成自己的,然後進行RP賬戶密碼重置。這樣攻擊者可以通過郵箱密碼登入受害者的RP賬戶,而受害者還可以正常用SSO登入RP.
作者用這種攻擊測試了29個web RP,15個允許攻擊者不輸入密碼的情況下更改email,其中6個更改密碼時不需要輸入舊密碼,剩下9個則傳送一個連結到郵箱以重置密碼。29個RP中共有22個可以讓攻擊者在U幣知道密碼的情況下實現對受害者RP賬戶的永續性訪問。
賬號連結
作者提出的另一種攻擊方式也能實現永續性訪問。其核心思想是攻擊者用受害者的IdP賬號登入RP後,取消RP賬號與IdP賬號的關聯,然後使用自己的賬號登入IdP,將自己的IdP賬號與受害者的RP賬號關聯。然後攻擊者再用受害者的賬號登入受害者RP,這樣就相當於受害者的RP關聯到了兩個不同的IdP賬號。
這種攻擊主要是由於RP實現有邏輯錯誤,任何時候一個RP賬戶都不能關聯到同一個IdP的兩個賬戶。
作者分析發現5個web RP(Pinterest, booking.com, Quora, 9gag, 4shared)受這種攻擊影響。
IMDB在被攻擊時,會導致攻擊者的IdP賬號連線到受害者的RP賬號,而用受害者的IdP賬號登入RP時,會重新建立一個新的賬號,這種情況就會把受害者以前的賬號擠掉,也是一種攻擊型別。
IdP access escalation
作者還發現一種巧妙的攻擊方式,可以擴大攻擊者在IdP的訪問許可權。
攻擊者通過劫持cookie登入受害者的IdP賬號後,可以給受害者賬戶增加一個新的手機號碼,而不需要重新輸入密碼,然後攻擊者利用這個手機號來重置受害者的IdP密碼,這樣攻擊者就能利用賬號密碼登入受害者的IdP賬號了,攻擊者還可以移除受害者的郵箱手機號等,避免IdP給使用者傳送密碼被更改的提醒。
Preemptive Account Hijacking
這部分作者說他們提出了一種新的攻擊,即受害者還沒有用IdP建立一個RP賬戶,攻擊者提前建立了,並填充了一些資訊等,然後受害者在後面的某個時間點使用IdP在相應的RP建立賬戶時,會受到一些危害。
但總的來說這部分內容並不新穎,這種攻擊行為在之前SSO協議相關的研究論文中也有提及,對這部分感興趣的可以看論文的詳細描述。
賬號被劫持後的補救方案
這部分主要探討使用者在受攻擊後,在IdP端或者RP端是否有辦法能夠阻止攻擊者在未來繼續訪問它們的賬戶。
在目前的SSO協議中,並沒有這樣的機制進行補救。理論上SSO協議中,認證一個使用者分兩層,第一層使用者在IdP進行身份認證,第二層RP根據IdP的斷言在RP認證使用者。在第二層中,RP會生成一個永續性的cookie儲存在瀏覽器中,然後依賴這個cookie值認證使用者身份。
所以當攻擊者成功攻擊後得到了RP的這個cookie,那麼只要這個cookie不過期,他就能訪問受害者的RP賬戶。作者的分析中發現,大部分的RP都不支援吊銷攻擊者的訪問許可權。同時,即便每個RP支援這樣的吊銷,IdP賬戶被攻破也會要求受害者在每個關聯的RP都進行這樣的操作,非常繁瑣不方便。
作者嘗試了幾種方法檢視是否能補救:(1)從IdP登出;(2)從RP登出;(3)修改IdP賬戶的密碼;(4)增加或修改RP賬戶密碼;(5)吊銷RP對IdP賬戶的訪問許可權;(6)使RP賬號的活躍會話失效。然而,分析發現95個RP中,僅10個RP提供某種形式的會話管理,有71個RP沒有任何措施可以阻止攻擊者對受害人RP賬戶的訪問。
Single Sign-Off
由於當前的SSO方案普遍不能讓IdP撤銷所有RP賬戶對它的訪問,作者提供了一個解決方案。
這種方案是基於OpenID Connect協議,對它進行了一些擴充套件。其核心思想是IdP維護一個已授權RP的列表,當用戶發現自己被攻擊時,首先在IdP端發起single sign-off,IdP要求使用者修改密碼並進行通過雙因子認證(簡訊等方式)來確認使用者身份。使用者身份確認成功後,IdP使該IdP賬號在所有裝置上的會話失效,同時吊銷所有關聯RP的訪問許可權;同時,IdP會向列表中的RP傳送認證撤銷請求,RP收到一個合法的認證撤銷請求後,會將該使用者賬號的所有活躍會話都失效,同時使相關的access token失效。進而實現阻止攻擊者對受害者賬戶的訪問。
這個方案的實現方式就是在當前的OpenID Connect方案裡增加認證撤銷的流程,對協議的改動很小,實現並不複雜,詳細參考原文。
總結
SSO中的賬號劫持本不是一個新鮮的話題,同時,在之前針對OAuth及Google等企業部署的OpenID Connect協議的研究中,研究者們一般較少考慮IdP賬戶被攻破的情況,因為IdP一般是比較大的網際網路公司,賬戶安全防護方案比較成熟,同時大量部署HTTPS,較少出現使用者的IdP賬戶被大規模攻破的情況。本文的作者就很聰明,一開始就強調本文關注的是IdP賬戶被攻破對SSO過程產生的威脅,以區別於以往相關的研究。同時,用一個實際的案例:Facebook的cookie可被劫持以劫持使用者的Facebook賬號,來證明作者發現的問題的普遍性和嚴重性。由此展開的後續的攻擊主要是一些典型的邏輯漏洞,在這個場景下也很有趣,作者考慮地非常細緻,也有一些有意思的新發現,比如一些知名的RP如Quora等支援一個RP賬號關聯同一個IdP的兩個不同賬戶的情況等。
此外,作者針對發現的問題,提出了切實可行也非常有效的補救方案,區別於以前相關研究的加固防護或修復方案要麼太偏理論化現有技術不支援無法應用,要麼成本代價太高不實用,本文的方案相容OpenID Connect,新增的改動很小,實用性高。
總的來說,這是一個很好的工作,值得企業開發人員和安全研究人員細讀。