點過的網頁會變色?沒錯,這玩意把你的瀏覽記錄漏光了_風聞
差评XPIN-差评官方账号-用知识和观点Debug the world!12小时前
提起隱私泄露這事兒,託尼其實早就麻了。。。平時網購、換手機號、註冊各種賬號之類的都會咔咔泄露,根本就防不住。
但託尼真是沒想到,瀏覽器裏會有一個看起來完全人畜無害的功能,也在偷偷泄露我們的個人隱私,而且這一泄露就 23 年。。。
這個功能我保證大家都用過。不知道各位差友們有沒有這種印象,初中上微機課那會兒,當同學們滿懷激動的心情打開 4399 ,一眼就能看出上一波上課的玩了什麼遊戲 —— 就看遊戲的鏈接有沒有變紫,鏈接變紫了,説明這個頁面前不久剛打開過。
不光是 4399 啊,這個貼心的小功能其實廣泛存在於各大網頁裏,就比方説我在搜索引擎裏打開了差評的官網,回退後就能發現鏈接的顏色變成了紫色,本質上是提醒你:“ 你之前打開過這個網頁了哦!” 能讓你瀏覽信息的效率變得更高。

對,別懷疑,泄露隱私的就是這麼個不起眼的小功能。
在聊這玩意為啥能泄露隱私之前,咱們不妨先來扒一扒這個功能是怎麼做到讓瀏覽過的網頁鏈接變色的。
我們知道,一個網頁要想好看,排版必須得合理,這就要用到一個叫 “ CSS 語言 ” 的東西了。它能定義網頁的字體、顏色、間距、對齊方式這些視覺元素,改善用户的視覺體驗。
這個鏈接變紫的操作,就是這個 “ CSS ” 根據瀏覽器歷史文件,把瀏覽過的鏈接標記為 “ :visited ”,然後再把顏色設置為 “ purple ”,代碼大概是這樣。

這樣一來,瀏覽過的網頁鏈接都會被 CSS 打上標籤、變更樣式,跟沒瀏覽過的網頁區分開來。
然後問題就出現了:因為這個 “ :visited ” 是一個全局列表,假設你在 “ 差評 ” 網站上訪問了 “ 火鍋 ” ,那 “ 火鍋 ” 的鏈接會變紫色對吧;但緊接着,如果你訪問了一個名叫 “ 好評 ” 的山寨網站,裏頭也有一個同樣的 “ 火鍋 ” 鏈接,這個鏈接也將會是紫色。
這樣一來好評也知道你擼過火鍋了。

瀏覽器只認歷史記錄裏的鏈接,壓根兒不管你是在哪兒看過的這個鏈接。
那麼如果有一個惡意網站,裏邊內嵌了很多很多鏈接,那麼理論上網站的管理者只需要利用這個漏洞,讀取你頁面上的 CSS 信息,就能知道你之前瀏覽過哪些鏈接。
我知道這會兒肯定有人會説了,不就是個瀏覽歷史嗎,泄露了就泄露了唄,對面難不成還能拿這個賣錢?
還。。。真能賣點錢,對於某些領域來説,這種信息還是挺有價值的。
依靠這個漏洞,老闆能看到自己的員工有沒有偷偷摸魚刷 Boss 直聘、賣車的銷售能看到你都考慮過哪些競品、甚至哪兒不舒服搜過什麼症狀,賣保健品的都能給你精準推送一波。
單説這些其實還好,最多就是煩人一點,但這種信息要是收集的多了,就能跟特定的身份聯繫起來,識別出你是誰。

就比如説最早用來讀取用户網頁上 CSS 信息的辦法,是一個叫做 “ getComputedStyle() ” 的 JavaScript 函數,每分鐘可以測試幾十萬個鏈接。按照這樣的速度,可以快速、大量破解用户的歷史記錄,這種體量的數據一旦暴露,這就真是實名制上網了。
最令託尼擔憂的是託尼在刷相關事例的時候還發現了一個已經掛了很久的網站,宣稱讓你的兄弟打開這個頁面上的鏈接,就能看到你兄弟曾經看過什麼淘氣頁面。
還好已經掛了。

不知道屏幕前多少差友捏了一把冷汗,反正我是沒有。
而這麼危險淺顯的一個漏洞,最早在 2002 年就被一個名叫 David Baron 的開發者發現並上傳,迄今已經過去 23 年之久了。。。

它為啥能活這麼久呢?中間就沒有人想去解決這個問題嗎?
有的朋友,有的,但效果都不理想。
就比如説針對上面提到的那個 “ getComputedStyle() ” 函數,有些瀏覽器就進化了,會對網站 “ 撒謊 ” ,將所有鏈接都看作是未訪問過的。

後來也有一些對網站可用樣式做限制的方案,直接把紫色鏈接的顯示禁止掉了。
但這些要麼影響性能和兼容性,要麼總是被黑客找辦法繞了過去。。。大家就這樣縫縫補補了好多年,也只能對這個漏洞起一些緩解的作用,沒法徹底解決。
最後 Chrome 團隊都擺爛了,直接把用户反饋上來的相關問題標為 “ 無法解決 ” 。

不過這場鬧劇也許終於要結束了。根據 Google 軟件工程師 Kyra Seevers 的説法,這個漏洞已經在今年4月份 Chrome 136 版本中得到解決了。

那這回 Google 是怎麼解決掉這個陳年積案的呢?託尼研究了一下 Kyra Seevers 發的這篇博客文章,發現他們給瀏覽記錄整了個分區。
這個分區分為三個部分:鏈接網址,頂級網站和框架源,瀏覽器在記錄瀏覽歷史的時候會同時記錄下這三個部分的信息。我們先不討論這個 “ 框架源 ” ,還是用之前差評和火鍋的例子給大家捋捋。
大家在 “ 差評 ” ( 頂級網站 ) 上打開 “ 火鍋 ” ( 連接網址 ),火鍋的鏈接會變紫;而這回山寨 “ 好評 ” 上的 “ 火鍋 ” 鏈接就不會跟着變紫了,因為它們有不一樣的頂級網站。

而這個 “ 框架源 ” 則是為了兼顧更多的場景,因為有的時候網站會內嵌一個其他網站的頁面,裏邊也可能會有鏈接,這就也得做一個區分。
比如我們在 “ 差評 ” 內嵌的 “ 高德地圖 ” 頁面( 框架源 )裏點擊了 “ 火鍋 ” 鏈接,它會變紫;但 “ 差評 ” 內嵌的 “ 百度地圖 ” 頁面上同一個 “ 火鍋 ” 鏈接就不會變紫,因為它們的框架源不同。

當這個分區啓用了之後,這個 “ :visited ” 歷史記錄就不再是所有網站都能查詢的全局列表了,而會根據這三個分區去判斷你到底是不是頭一回兒訪問這個鏈接,中間只要有一個分區對不上,CSS 就不會給鏈接標記 “ :visited ”,顏色樣式也不會有變化。

好兄弟再不會知道你看了什麼淘氣頁面了!如果一切順利,等到月底 Chrome 瀏覽器更新 136 版本,這個長達 23 年,通過鏈接變色泄露隱私的抓馬漏洞終於要落下帷幕了。
所以託尼的朋友們從此可以高枕無憂了嗎?還不行,相關隱私泄露的風險依舊存在,而且歲數這麼大的漏洞也屢見不鮮。。。
這次託尼在查相關資料的時候,發現了一篇 2000 年的論文,論文中討論了一種針對網絡隱私的時序攻擊方式,大概的原理是網站通過你頁面加載的時間,判斷你之前有沒有對頁面內容進行緩存,進而推測你之前是否訪問過這個頁面。

不得不説,人類為了達成某種目的,真的是什麼歪門邪道都能想得出來。。。。
而現如今,這個 25 歲高齡的漏洞也沒有被徹底解決,時序攻擊的依據也從緩存加載時間進化到渲染矢量圖的時間,道高一尺魔高一丈。
這事兒去年還被拿出來討論過

除了這些攻擊, Google 在這次還在 Github 關於瀏覽器歷史分區技術的解釋頁面,貼心為我們總結了一批專門攻擊瀏覽器歷史記錄的漏洞,看着長長這一條,託尼説不焦慮是假的。

聊了這麼多,託尼知道很多人仍然對於 “ 瀏覽器歷史記錄 ” 這種程度的隱私泄露不以為然。
可託尼想説,現在的情況跟 20 幾年前已經完全不同了,互聯網已經成了大家生活中不可或缺的一部分,網上的信息也承載着越來越重的意義,而且任何隱私都本不該被泄露。
見微知著,都 2025 年了,如果連一個瀏覽器歷史記錄都管不好的話,怎麼能讓大家放心在網上衝浪呢?
圖片、資料來源:
mdn web docs:面向開發者的Web技術
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
