CDN快取去匿名化
有一種攻擊手法叫做「deanonymization」,中文翻作:「去匿名化」,在網路世界中,每個人都保有一定的匿名性,但我們也都知道這層匿名性其實滿容易被打破的。
舉例來說,假設我發了我的 server 連結給 Discord 網友,當他點了之後,我的 server 就會直接收到他的設備傳來的網路請求,假設他沒開 VPN,那我就能拿到他的 IP 跟設備資訊等等,足夠辨識出他人大概是在哪個區域(例如說在台北或是東京之類的)。
但這畢竟也要我的網友主動點擊 URL 才行,而今天要介紹的手法不須要點擊也能做到同樣的事。有個 15 歲的高中生 daniel 前陣子就發表了一篇文章《Unique 0-click deanonymization attack targeting Signal, Discord and hundreds of platform》,分享了他是如何做到的。
Discord 在發送好友邀請的時候,會在手機上彈一個通知出來,這個通知會有加你好友的人的大頭貼照片,讓你方便辨識,十分合理。這時候你可能會想說,那我把 Discord 大頭貼設成自己的 URL 不就行了嗎?抱歉,這樣是行不通的,因為大頭貼只能上傳圖片,最後會被放到 Discord 的 server,前面掛 CDN,所有網址都是 Discord 在管的,這也是滿常見的做法。
然而,就是這個 CDN 開啟了去匿名化之路。
以 Cloudflare 為例,它有許多節點,例如說在東京連到的就是 NRT 節點,會從這邊下載資源,如果這個節點沒有,就會去 source 拉取並且存一份到節點中,別的東京使用者下次去 NRT 節點就拉得到資源了,速度會更快,這就是 CDN 運作的原理。
而 daniel 之前在網路上發現有人分享一個方法,可以透過 Cloudflare 自己的服務 Cloudflare Workers,強制把請求發送給某個特定 CDN 節點。
這是什麼意思呢?
對於某個特定資源 huli_avatar.png,我可以用這個方式,發請求給所有 Cloudflare 的 CDN 節點,並且透過 response header,來得知這個節點的快取狀況,我能知道是 HIT 還是 MISS,也能知道快取還多久會過期。
也就是說,當我發送 Discord 好友邀請給小明的時候,小明手機自動跳通知,去最近的 CDN 節點抓取圖片。接著,我利用剛剛講的方法,發送請求給所有節點,只要查看 response header,就能知道小明剛剛訪問的是哪個節點,進而推測出小明大概的位置。
簡單來說就是利用 CDN 快取機制來 leak 出使用者的大概位置,也算是一種 side-channel attack 了。
Signal 跟 Discord 都能用類似手法進行攻擊,不過這兩個聊天軟體都不認為這是個需要修的漏洞(我也不認為就是了),而 Cloudflare 最後修了那個可以透過 worker 發送請求到任意節點的問題。
我的想法是,這個手法有趣歸有趣,但是對那些聊天軟體來說,似乎確實超過了職責所在,畢竟就算不是透過這種方法,發 URL 點擊也還是能達到一樣的效果,而且更精準。況且這就是 CDN 的運作機制,要修的話也不知從何修起,成本滿高的。
分享這篇是因為故事很有趣,而且很完整,原文裡面有附各種圖片還有完整的 exploit 影片,推薦有興趣的人去看看原文。
影片:https://gist.github.com/hackermondev/45a3cdfa52246f1d1201c1e8cdef6117
評論