打過碼的圖片等於沒打,用Windows的要小心了_風聞
差评-差评官方账号-04-02 07:34
本文原創於微信公眾號:差評作者:世超
上週有外媒爆出了一個和谷歌隱私安全有關的小瓜。
事兒本身不大,但聊一聊還是蠻有意思的。
報道講説,谷歌自家的 Pixel 手機系統內置的 “ Markup ” 截圖工具,存在一個嚴重的隱私漏洞。
只要你通過這個截圖工具來剪輯 PNG 格式的圖片,就有一定概率還原出原圖被截掉的其他信息。。。

發現這個漏洞的程序員 Simon Aarons,還寫了一個可以檢測這個漏洞的程序 Acropalypse。

只要你把 Pixel 手機的機型和用 Markup 裁出的上傳上去,就能得到原圖的其他信息。
世超拿 Pixel 4 試了一下,效果拔羣。。。

一石激起千層浪啊,谷歌這事兒被爆出來之後,被一羣碼農大佬們順藤摸瓜,發現類似的 Bug,微軟似乎也有份。
他們直接使用 Windows 系統重的截圖工具,也重現了和谷歌Pixel 一樣的問題。

這下問題就大條了。
要説 Pixel 手機用的人少和咱們關係也不大,可 Windows 的截圖工具,可是大夥兒經常會摸到的常用工具。
數以十億計的用户,可能在自以為隱私部分已經抹掉了的情況下,把截圖發了出去。
但凡有什麼個人隱私信息,想想都覺得後脊背發涼。
那世超就好奇了,兩家大廠,在兩個毫不相關的系統上,出現了一模一樣的嚴重錯誤。。。
難道是 PNG 的標準實在是太老被鑽了漏洞,或者是什麼基礎軟件有問題?

世超懷着揣揣不安的心情,深入調查了一下這件事兒的來龍去脈。
先説結論啊:並不是圖像處理和儲存的標準出了問題,而是谷歌微軟同時以不同的方式犯了傻。

首先説明一下,這個 Bug 的真正原因,並不是 PNG 透明通道( RGBA中的A )的問題。
這個有歧義的新聞讓世超原地研究半小時,下為原文


簡單來説,這個 Bug 的本質,其實是因為截圖工具沒有刪除舊圖片數據,而是直接把新圖片,覆蓋寫入在了舊圖片的開頭。
所以只要新的圖片文件大小**小於舊文件,沒完全用數據把原圖覆蓋掉,**就留下了可恢復的舊圖像數據。

而標準的 PNG 解碼器,在讀到新 PNG 文件尾的時候,就不會再讀下去了,所以剩餘的舊數據,會被解碼器直接忽略。

這也是用户很難發現舊圖片數據泄露的原因:不用特別手段,一般人根本看不出。

不過,雖説問題的本質一樣,但這兩個大廠出問題的理由卻並不相同。
谷歌是因為 Android 9 到 Android 10 的時候,讀寫文件相關的一個接口發生了變動,而且沒有記載在文檔和更新日誌裏。

祖傳的代碼在舊接口上會正確刪除舊文件,不會留下只因腳。
然而在新版本下,同樣的代碼就只能覆蓋寫入舊文件,只要新文件小於舊文件,舊文件的殘餘部分就會留下來。

而微軟這邊的問題可能要更大些。。。
根據微軟的 API 規則,程序員在調用覆蓋文件的接口時,如果沒有**額外的特別指示 Windows 把舊文件刪掉,**那麼新文件就會直接從頭開始覆蓋舊文件,然後留下一堆舊文件的殘餘。
但凡程序員在寫的時候沒注意到這個規則,就會有安全風險。。。
至於微軟為何要把這種不安全的行為作為接口的默認值,世超只能説,或許這就是國際大廠對編程的精妙理解吧。
好消息:微軟的接口一直都沒變過;壞消息:但是設計的和狗屎一樣。

嚴重的是,隨着這個漏洞原因的公開,已經有人在更加常用的 JPG 格式的圖像上發現了類似的問題。
考慮到大多數截屏和手機拍照都是 JPG 直出,漏洞擴展到 JPG 後,這個問題其實是是擴散了。
而且由於 JPG 和 PNG 的壓縮方式不同,文件頭部被覆蓋的 JPG 舊文件,搞不好還能實現幾乎完美的還原。。。
還原的JPG圖像只是比原圖多了點噪點

這 Bug,好像有那麼點剎不住車了。。。
好消息是,如今信息安全的概念已經深入人心,在我們的隱私完全漏勺之前,其實還有一道防線。
世超在當年試圖成為一個程序猿的時候,學到的第一課,就是絕對不能信任用户提交的數據。
用户試圖刪掉網站的用户數據表

一些技術人員甚至可以利用解碼器 **“ 只讀取文件尾之前數據 ”**的特性,在一張正常圖片的尾部附帶惡意代碼,從而攻擊網站服務器或其他用户。
之前在貼吧裏流行過的圖種也是類似原理。

為了清除這些可能有風險的無關數據,同時節約服務器流量和存儲,一般網站都會先用解碼器讀取圖片,然後重新編碼成低質量的 JPG。
這樣,即使是用户上傳的圖片裏有額外數據( 比如這次 Bug 留下來的舊圖 ),也不會出現在其他用户那裏。

但也有例外。
比如説,微信和 Discord 就提供下載原圖的選項,而且提供的是真正的原圖。這樣,那些無關數據就還是公開了。
按照安全原則,他們應當提供 “ 偽原圖 ”

總結一下,谷歌和微軟這次的 Bug,是兩個影響相當廣泛、原因極其簡單、後果控制不好可能會嚴重的漏洞。
其中一個從 Android 10(2019)開始,影響所有 Pixel 手機;
另一個從 Windows 10 (2015)開始,影響所有使用系統自帶截圖工具的用户。
更離譜的是,這兩個漏洞前幾天才剛剛修復。。。
世超覺得,考慮到時間跨度、受害者數量和形成原因,這兩個漏洞完全有資格參與 “ 年度最弱智漏洞 ” 的競爭。
但不管怎麼樣,在關係到用户隱私信息這一塊的問題,谷歌和微軟確實應該加強代碼的檢查。
各家互聯網平台運營商,也應該以此為戒,**避免在公共場合分發原始圖片的原文件,**這不僅可能損害自家服務器的安全,而且還可能暴露用户的隱私。
原圖信息中甚至還能有地點定位信息

從咱們用户自己的角度來説,世超的建議也很簡單:在任何公開平台都不要上傳原圖!不要上傳原圖!不要上傳原圖!

**當圖片經過在本地完成解碼 —— 重新編碼上傳的過程,**原圖上的信息自然也就會被處理。
安全這塊兒,還得是自己把住最後一關。。。
圖片、資料來源:
David Buchanan, Exploiting aCropalypse: Recovering Truncated PNGs
Twitter:@wdormann
Twitter: @David3141593
Wikipedia:PNG
