打開(kāi)網(wǎng)易新聞 查看精彩圖片

提起隱私泄露這事兒,托尼其實(shí)早就麻了。。。平時(shí)網(wǎng)購(gòu)、換手機(jī)號(hào)、注冊(cè)各種賬號(hào)之類的都會(huì)咔咔泄露,根本就防不住。

但托尼真是沒(méi)想到,瀏覽器里會(huì)有一個(gè)看起來(lái)完全人畜無(wú)害的功能,也在偷偷泄露我們的個(gè)人隱私,而且這一泄露就 23 年。。。

這個(gè)功能我保證大家都用過(guò)。不知道各位差友們有沒(méi)有這種印象,初中上微機(jī)課那會(huì)兒,當(dāng)同學(xué)們滿懷激動(dòng)的心情打開(kāi) 4399 ,一眼就能看出上一波上課的玩了什么游戲 —— 就看游戲的鏈接有沒(méi)有變紫,鏈接變紫了,說(shuō)明這個(gè)頁(yè)面前不久剛打開(kāi)過(guò)

不光是 4399 啊,這個(gè)貼心的小功能其實(shí)廣泛存在于各大網(wǎng)頁(yè)里,就比方說(shuō)我在搜索引擎里打開(kāi)了差評(píng)的官網(wǎng),回退后就能發(fā)現(xiàn)鏈接的顏色變成了紫色,本質(zhì)上是提醒你:“ 你之前打開(kāi)過(guò)這個(gè)網(wǎng)頁(yè)了哦!” 能讓你瀏覽信息的效率變得更高。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

對(duì),別懷疑,泄露隱私的就是這么個(gè)不起眼的小功能。

在聊這玩意為啥能泄露隱私之前,咱們不妨先來(lái)扒一扒這個(gè)功能是怎么做到讓瀏覽過(guò)的網(wǎng)頁(yè)鏈接變色的。

我們知道,一個(gè)網(wǎng)頁(yè)要想好看,排版必須得合理,這就要用到一個(gè)叫 “ CSS 語(yǔ)言 ” 的東西了。它能定義網(wǎng)頁(yè)的字體、顏色、間距、對(duì)齊方式這些視覺(jué)元素,改善用戶的視覺(jué)體驗(yàn)。

這個(gè)鏈接變紫的操作,就是這個(gè) “ CSS ” 根據(jù)瀏覽器歷史文件,把瀏覽過(guò)的鏈接標(biāo)記為 “ :visited ”,然后再把顏色設(shè)置為 “ purple ”,代碼大概是這樣。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

這樣一來(lái),瀏覽過(guò)的網(wǎng)頁(yè)鏈接都會(huì)被 CSS 打上標(biāo)簽、變更樣式,跟沒(méi)瀏覽過(guò)的網(wǎng)頁(yè)區(qū)分開(kāi)來(lái)。

然后問(wèn)題就出現(xiàn)了:因?yàn)檫@個(gè) “ :visited ” 是一個(gè)全局列表,假設(shè)你在 “ 差評(píng) ” 網(wǎng)站上訪問(wèn)了 “ 火鍋 ” ,那 “ 火鍋 ” 的鏈接會(huì)變紫色對(duì)吧;但緊接著,如果你訪問(wèn)了一個(gè)名叫 “ 好評(píng) ” 的山寨網(wǎng)站,里頭也有一個(gè)同樣的 “ 火鍋 ” 鏈接,這個(gè)鏈接也將會(huì)是紫色。

這樣一來(lái)好評(píng)也知道你擼過(guò)火鍋了。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

瀏覽器只認(rèn)歷史記錄里的鏈接,壓根兒不管你是在哪兒看過(guò)的這個(gè)鏈接。

那么如果有一個(gè)惡意網(wǎng)站,里邊內(nèi)嵌了很多很多鏈接,那么理論上網(wǎng)站的管理者只需要利用這個(gè)漏洞,讀取你頁(yè)面上的 CSS 信息,就能知道你之前瀏覽過(guò)哪些鏈接。

我知道這會(huì)兒肯定有人會(huì)說(shuō)了,不就是個(gè)瀏覽歷史嗎,泄露了就泄露了唄,對(duì)面難不成還能拿這個(gè)賣錢?

還。。。真能賣點(diǎn)錢,對(duì)于某些領(lǐng)域來(lái)說(shuō),這種信息還是挺有價(jià)值的。

依靠這個(gè)漏洞,老板能看到自己的員工有沒(méi)有偷偷摸魚刷 Boss 直聘、賣車的銷售能看到你都考慮過(guò)哪些競(jìng)品、甚至哪兒不舒服搜過(guò)什么癥狀,賣保健品的都能給你精準(zhǔn)推送一波。

單說(shuō)這些其實(shí)還好,最多就是煩人一點(diǎn),但這種信息要是收集的多了,就能跟特定的身份聯(lián)系起來(lái),識(shí)別出你是誰(shuí)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

就比如說(shuō)最早用來(lái)讀取用戶網(wǎng)頁(yè)上 CSS 信息的辦法,是一個(gè)叫做 “ getComputedStyle() ” 的 JavaScript 函數(shù),每分鐘可以測(cè)試幾十萬(wàn)個(gè)鏈接。按照這樣的速度,可以快速、大量破解用戶的歷史記錄,這種體量的數(shù)據(jù)一旦暴露,這就真是實(shí)名制上網(wǎng)了。

最令托尼擔(dān)憂的是托尼在刷相關(guān)事例的時(shí)候還發(fā)現(xiàn)了一個(gè)已經(jīng)掛了很久的網(wǎng)站,宣稱讓你的兄弟打開(kāi)這個(gè)頁(yè)面上的鏈接,就能看到你兄弟曾經(jīng)看過(guò)什么淘氣頁(yè)面。

還好已經(jīng)掛了。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

不知道屏幕前多少差友捏了一把冷汗,反正我是沒(méi)有。

而這么危險(xiǎn)淺顯的一個(gè)漏洞,最早在 2002 年就被一個(gè)名叫 David Baron 的開(kāi)發(fā)者發(fā)現(xiàn)并上傳,迄今已經(jīng)過(guò)去 23 年之久了。。。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

它為啥能活這么久呢?中間就沒(méi)有人想去解決這個(gè)問(wèn)題嗎?

有的朋友,有的,但效果都不理想。

就比如說(shuō)針對(duì)上面提到的那個(gè) “ getComputedStyle() ” 函數(shù),有些瀏覽器就進(jìn)化了,會(huì)對(duì)網(wǎng)站 “ 撒謊 ” ,將所有鏈接都看作是未訪問(wèn)過(guò)的。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

后來(lái)也有一些對(duì)網(wǎng)站可用樣式做限制的方案,直接把紫色鏈接的顯示禁止掉了。

但這些要么影響性能和兼容性,要么總是被黑客找辦法繞了過(guò)去。。。大家就這樣縫縫補(bǔ)補(bǔ)了好多年,也只能對(duì)這個(gè)漏洞起一些緩解的作用,沒(méi)法徹底解決。

最后 Chrome 團(tuán)隊(duì)都擺爛了,直接把用戶反饋上來(lái)的相關(guān)問(wèn)題標(biāo)為 “ 無(wú)法解決 ” 。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

不過(guò)這場(chǎng)鬧劇也許終于要結(jié)束了。根據(jù) Google 軟件工程師 Kyra Seevers 的說(shuō)法,這個(gè)漏洞已經(jīng)在今年4月份 Chrome 136 版本中得到解決了。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

那這回 Google 是怎么解決掉這個(gè)陳年積案的呢?托尼研究了一下 Kyra Seevers 發(fā)的這篇博客文章,發(fā)現(xiàn)他們給瀏覽記錄整了個(gè)分區(qū)。

這個(gè)分區(qū)分為三個(gè)部分:鏈接網(wǎng)址,頂級(jí)網(wǎng)站和框架源,瀏覽器在記錄瀏覽歷史的時(shí)候會(huì)同時(shí)記錄下這三個(gè)部分的信息。我們先不討論這個(gè) “ 框架源 ” ,還是用之前差評(píng)和火鍋的例子給大家捋捋。

大家在 “ 差評(píng) ” ( 頂級(jí)網(wǎng)站 ) 上打開(kāi) “ 火鍋 ” ( 連接網(wǎng)址 ),火鍋的鏈接會(huì)變紫;而這回山寨 “ 好評(píng) ” 上的 “ 火鍋 ” 鏈接就不會(huì)跟著變紫了,因?yàn)樗鼈冇胁灰粯拥捻敿?jí)網(wǎng)站。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

而這個(gè) “ 框架源 ” 則是為了兼顧更多的場(chǎng)景,因?yàn)橛械臅r(shí)候網(wǎng)站會(huì)內(nèi)嵌一個(gè)其他網(wǎng)站的頁(yè)面,里邊也可能會(huì)有鏈接,這就也得做一個(gè)區(qū)分。

比如我們?cè)?“ 差評(píng) ” 內(nèi)嵌的 “ 高德地圖 ” 頁(yè)面( 框架源 )里點(diǎn)擊了 “ 火鍋 ” 鏈接,它會(huì)變紫;但 “ 差評(píng) ” 內(nèi)嵌的 “ 百度地圖 ” 頁(yè)面上同一個(gè) “ 火鍋 ” 鏈接就不會(huì)變紫,因?yàn)樗鼈兊目蚣茉床煌?/p>

打開(kāi)網(wǎng)易新聞 查看精彩圖片

當(dāng)這個(gè)分區(qū)啟用了之后,這個(gè) “ :visited ” 歷史記錄就不再是所有網(wǎng)站都能查詢的全局列表了,而會(huì)根據(jù)這三個(gè)分區(qū)去判斷你到底是不是頭一回兒訪問(wèn)這個(gè)鏈接,中間只要有一個(gè)分區(qū)對(duì)不上,CSS 就不會(huì)給鏈接標(biāo)記 “ :visited ”,顏色樣式也不會(huì)有變化。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

好兄弟再不會(huì)知道你看了什么淘氣頁(yè)面了!如果一切順利,等到月底 Chrome 瀏覽器更新 136 版本,這個(gè)長(zhǎng)達(dá) 23 年,通過(guò)鏈接變色泄露隱私的抓馬漏洞終于要落下帷幕了。

所以托尼的朋友們從此可以高枕無(wú)憂了嗎?還不行,相關(guān)隱私泄露的風(fēng)險(xiǎn)依舊存在,而且歲數(shù)這么大的漏洞也屢見(jiàn)不鮮。。。

這次托尼在查相關(guān)資料的時(shí)候,發(fā)現(xiàn)了一篇 2000 年的論文,論文中討論了一種針對(duì)網(wǎng)絡(luò)隱私的時(shí)序攻擊方式,大概的原理是網(wǎng)站通過(guò)你頁(yè)面加載的時(shí)間,判斷你之前有沒(méi)有對(duì)頁(yè)面內(nèi)容進(jìn)行緩存,進(jìn)而推測(cè)你之前是否訪問(wèn)過(guò)這個(gè)頁(yè)面。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

不得不說(shuō),人類為了達(dá)成某種目的,真的是什么歪門邪道都能想得出來(lái)。。。。

而現(xiàn)如今,這個(gè) 25 歲高齡的漏洞也沒(méi)有被徹底解決,時(shí)序攻擊的依據(jù)也從緩存加載時(shí)間進(jìn)化到渲染矢量圖的時(shí)間,道高一尺魔高一丈。

這事兒去年還被拿出來(lái)討論過(guò)

打開(kāi)網(wǎng)易新聞 查看精彩圖片

除了這些攻擊, Google 在這次還在 Github 關(guān)于瀏覽器歷史分區(qū)技術(shù)的解釋頁(yè)面,貼心為我們總結(jié)了一批專門攻擊瀏覽器歷史記錄的漏洞,看著長(zhǎng)長(zhǎng)這一條,托尼說(shuō)不焦慮是假的。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

聊了這么多,托尼知道很多人仍然對(duì)于 “ 瀏覽器歷史記錄 ” 這種程度的隱私泄露不以為然。

可托尼想說(shuō),現(xiàn)在的情況跟 20 幾年前已經(jīng)完全不同了,互聯(lián)網(wǎng)已經(jīng)成了大家生活中不可或缺的一部分,網(wǎng)上的信息也承載著越來(lái)越重的意義,而且任何隱私都本不該被泄露。

見(jiàn)微知著,都 2025 年了,如果連一個(gè)瀏覽器歷史記錄都管不好的話,怎么能讓大家放心在網(wǎng)上沖浪呢?

撰文:小柳

編輯:米羅 & 面線

美編:煥妍

圖片、資料來(lái)源

mdn web docs:面向開(kāi)發(fā)者的Web技術(shù)

chrome for developers:提高:visited的隱私性

The Register:Chrome to patch decades-old flaw that let sites peek at your history

Edward W. Felten and Michael A. Schneider:Timing Attacks on Web Privacy

Mozilla Security Blog:Plugging the CSS History Leak

Chromium:Security: Visited links can be detected via redraw timing

DARKREADING:Timing Attacks On Browsers Leak Sensitive Information

WIRED:Tricky Web Timing Attacks Are Getting Easier to Use—and Abuse

Github:Explainer: Partitioning :visited links history

打開(kāi)網(wǎng)易新聞 查看精彩圖片