QQ瀏覽器隱私洩露報告

wyzsk發表於2020-08-19
作者: virustracker · 2016/06/06 16:49

source:citizenlab.org

0x00 簡介


QQ瀏覽器是騰訊開發的一款網路瀏覽器,面向Android,Windows,Mac和iOS等平臺。相較於內建瀏覽器,QQ瀏覽器提供了更豐富的功能,例如,增加了標籤視窗,並且整合了聊天平臺等。

報告中詳細的分析了Windows和Android版本的QQ瀏覽器是如何傳輸使用者資料。這兩個版本的QQ瀏覽器在傳輸使用者的身份資料時,要麼直接不使用加密,要麼使用的加密演算法簡直形同虛設。完整的討論內容請參閱我們的報告《Baidu’s and Don’ts: Privacy and Security Issues in Baidu Browser》

由於這種資料傳輸方式非常不安全,所以只要能介入資料傳輸路徑(比如,使用者的ISP,連線了咖啡店的WiFi網路,或入侵了相應網路的駭客),收集並解密資料流量,就能夠截獲到這些個人資料。

除了資料傳輸方式不夠安全,這兩版QQ瀏覽器的更新方式也有漏洞,會導致任意程式碼執行。也就是說,攻擊者可以偽造一個軟體更新,將惡意程式碼安裝到使用者的裝置上。

這份報告屬於《Privacy and Security of Mobile Applications in Asia》系列。此前,我們已經確認了移動版的UC瀏覽器和百度瀏覽器也存在類似的問題。斯諾登也曾經曝光說,五眼情報聯盟(NSA,GCHQ,CSE,ASD,GCSB)利用了UC瀏覽器中的安全問題來識別和跟蹤使用者身份。在已經公佈的《The Many Identifiers in Our Pockets》報告中,我們列出了哪些個人資料是經常被收集和傳輸的。

另外,我們研究了TOM-Skype和UC上的密碼稽核機制,對比分析了一些在亞洲風靡的移動聊天工具,包括微信,LINE和KakaoTalk。除此之外,我們還檢查了微信上的密碼稽核機制。這次研究的主要目的是透過一種綜合性的方法,包括逆向工程和其他技術分析方法,讓使用者意識到這些應用中的安全和隱私問題,同時,希望相關的軟體公司,承擔起應有的責任,保護使用者的權益。

2016年3月17日,我們詢問了騰訊為什麼要收集使用者資料,並且還要透過一種不安全的方式將這些資料傳輸到QQ伺服器。這裡是我們提出的具體問題。直至截稿,我們沒有收到任何答覆。在最後,我們討論了一些可能的深層原因,為什麼中國的這三款瀏覽器會出現類似的問題。

0x01 技術分析


我們分析了兩個版本的QQ瀏覽器,分別是安卓版6.3.01920和Windows版9.2.5478。在分析過程中,我們使用了大量的工具。比如,我們使用了tcpdump和Wireshark來捕捉和分析網路流量,也使用了機器程式碼和位元組碼反彙編工具,反編譯器和除錯工具來分析程式行為,包括,JD, JADX和IDA。

我們發現這兩個瀏覽器都使用了一種通用機制與伺服器通訊,而這種機制會導致個人資訊的洩露,並且,這些瀏覽器的更新過程中也存在多個安全漏洞。

我們的技術分析分為三部分,第一部分介紹了一個基本結構,這兩個版本的QQ瀏覽器都會透過這個結構向QQ伺服器傳輸資料。第二部分分析了被採集的個人使用者資料,以及安卓版的軟體更新過程。第三部分分析了相應的Windows版功能。

0x02 第一部分:QQ瀏覽器的資料傳輸


安卓和Windows版的QQ瀏覽器都使用了一種WUP請求與QQ伺服器通訊。

WUP請求

WUP請求是一種二進位制格式,可以包含不同型別的值,例如,整數,浮點數,列表,字串和遞迴結構。有時候,這些請求首先要經過加密,然後再嵌入到一個HTTP POST請求的主體中,最後,隨著這個HTTP POST請求傳送到目的URL。我們寫了一個Python指令碼來解密並解析這些請求,從而將其轉換成人類可讀格式。在這個指令碼的程式碼中,還包含了在接下來解密資料時需要用到的其他指令碼。

Q-GUID,Q-UA和Q-UA2欄位

Q-GUID,Q-UA和Q-UA2欄位出現在WUP請求的HTTP標頭中。在接下來介紹WUP請求時,如果某個欄位的對應值出現在了WUP請求的有效載荷中,我們就用這個欄位來代指一個相應的例項。在HTTP標頭中,這些欄位都不會經過加密,但是,當這些欄位出現在WUP請求中時,其格式會發生變化。

Q-GUID欄位中填充的值是在初始化時,透過一個WUP請求從QQ伺服器上獲取的,並且在接收到這個值後,瀏覽器就會保留這個值,並且將其新增到後續請求的HTTP標頭中,沒有加密。在很多WUP請求的有效載荷中,也包含有這個值。下面就是一個Q-GUID:caed22d728efa6127d53bc0412f888cb

GUID可能表示的是“全域性唯一標示符”,是一個128位數字,通常是隨機生成的。

Q-UA和Q-UA2值中包含有與QQ瀏覽器版本和硬體平臺相關的硬編碼資訊。雖然,UA很可能指的是“User Agent”,並且包含有與HTTP user agent字串相似的資訊,但是其格式卻不同於QQ瀏覽器在HTTP標頭中使用的user agent HTTP欄位。

0x03 第二部分:分析安卓版QQ瀏覽器


我們分析的安卓版QQ瀏覽器是6.3.01920版本,下載於http://mb.qq.com/。在啟動後,或執行了某些事件時,比如,瀏覽網頁或檢查更新,瀏覽器就會向http://wup.imtt.qq.com:8080/傳送WUP請求。這些請求使用了下面的這種加密方式。

對於每個加密的WUP請求,會根據下面的Java程式碼來生成一個AES秘鑰:

#!java
int i = 10000000 + new Random().nextInt(89999999);

    int j = 10000000 + new Random().nextInt(89999999);

    return (String.valueOf(i) + String.valueOf(j)).getBytes();

所以說,這個秘鑰是一個128位秘鑰,由16個ASCII數字組成。而且,第1個和第9個位元組永遠不可能是0,前8個和最後8個位元組不可以全都是9,所以,秘鑰空間並不是常規的2^128,而是89999999^2 < 2^53

隨後,這個秘鑰會用於透過AES+ECB模式來加密WUP請求。AES秘鑰會使用一個128位的RSA公鑰加密,係數:245406417573740884710047745869965023463,指數:65537。加密後的AES秘鑰會被納入到HTTP請求的qbkey HTTP標頭中。

RSA是一種非對稱加密演算法,也就是說,在解密時需要使用另一個不同的私鑰,上面提到的RSA秘鑰無法直接用於解密AES秘鑰和WUP請求。但是,RSA的安全程度取決於加密秘鑰的係數分解難度。一旦分解,解密秘鑰就很容易獲得了。上述的RSA公鑰只有128位,分解起來並不難。(RSA秘鑰一般建議至少2018位)。使用Wolfram Aplpha這個線上計算引擎,用不了1秒就可以分解秘鑰的係數:

http://www.wolframalpha.com/input/?i=factor+245406417573740884710047745869965023463

分解後,得到了下面兩個質因數:

14119218591450688427 x 17381019776996486069

有了這些質因數,任何在監控流量的中間人都可以解密出每個WUP請求使用的AES秘鑰,然後再使用AES秘鑰解密WUP請求。

我們一直監控著瀏覽器傳送的流量,並且使用這個秘鑰解密了所有的WUP請求。多數WUP請求中傳輸的是一些很容易解密的個人資訊。在圖1中,是一個解密後的WUP請求,透過我們的指令碼,可以將其解析成可讀的形式。

p1 圖1-解密後的WUP請求。我們用“#”替代了敏感數字。

下面是我們識別出的一些重要請求,以及每個請求傳輸的個人資訊:

WUP請求 傳送時間 加密程度
profileInfo.profileInfo 瀏覽器啟動時 簡單加密
hotword.getAssociationalWords 輸入位址列時 不加密
Security.doSecurityReqest [sic] 瀏覽網頁時 簡單加密
proxyip.getIPListByRouter 瀏覽器啟動時 簡單加密
pkgcenternew.checkUpdate 檢查更新時 簡單加密
資料點 資料點描述 加密程度 WUP請求
IMEI 國際移動裝置標識碼,每臺裝置對應一個唯一的字串 簡單加密 profileInfo.profileInfoSecurity.do SecurityReqest proxyip.getIPListByRouter pkgcenternew.checkUpdate
IMSI 國際移動使用者標識碼,每個使用者對應一個唯一的數字 簡單加密 profileInfo.profileInfo
Q­GUID QQ瀏覽器使用這個唯一字串來識別使用者身份 不加密 hotword.getAssociationalWords Security.doSecurityReqest proxyip.getIPListByRouter
Q­UA2 QQ瀏覽器使用這個值來識別應用版本和硬體平臺的型別 不加密 hotword.getAssociationalWords Security.doSecurityReqest
QQ username QQ使用者名稱 簡單加密 profileInfo.profileInfo
Screen pixel dimensions 使用者裝置的螢幕尺寸 簡單加密 profileInfo.profileInfo
WiFi MAC address 媒體訪問控制地址,識別無線傳輸器的唯一標識,比如,裝置上的藍芽晶片和WiFi晶片 簡單加密 profileInfo.profileInfo*
In­range WiFi access point MAC addresses 所有周邊WiFi訪問點的媒體訪問控制地址 簡單加密 profileInfo.profileInfo proxyip.getIPListByRouter
SSID of connected WiFi access point 使用者連線的WiFi名稱 簡單加密 proxyip.getIPListByRouter
Android ID 在OS首次執行時,生成的一個唯一數字,用於追蹤使用者 簡單加密 pkgcenternew.checkUpdate
Address bar contents 使用者在位址列中輸入的內容(比如,搜尋請求) 不加密 hotword.getAssociationalWords
Full page URL 每個訪問頁面的完整URL 簡單加密 Security.doSecurityReqest

WiFi MAC地址透過DES+ECB模式加密,使用的秘鑰是“\x25\x92\x3c\x7f\x2a\xe5\xef\x92”。

WUP請求的響應也很容易解密。WUP響應並沒有使用前面提到的非對稱加密演算法,而是單純使用了一種對稱性演算法,所以我們不需要分解任何秘鑰的質因數。換句話說,其加密模式是MTEA+MCBC,使用的硬編碼ASCII加密秘鑰是:“sDf434ol*123+-KD

很有趣的是,QQ瀏覽器的加密過程是非標準的MTEA+MCBC模式,和百度瀏覽器一樣(見圖4)。

因為這種演算法是對稱的,所以這些響應的加密和解密秘鑰是同一個。任何中間人都可以利用這個秘鑰,主動偽造一個來自QQ伺服器的響應。我們透過攻擊QQ瀏覽器的更新過程證實了這一點。

軟體更新過程存在漏洞

透過pkgcenternew.checkUpdate請求的存在來看,軟體更新是可用的。在這個請求的響應中可能會包含有下載新APK檔案的連結,APK的MD5雜湊和更新日誌。在安卓上,如果APK更新使用的簽名與當前安裝的版本不符,那麼APK更新就會失敗;雖然,這種攻擊方式無法將QQ瀏覽器替換成任意的APK;但是,這種方法可以用來安裝新App,透過使用QQ瀏覽器的名稱和圖示,誘騙使用者安裝惡意的APK。

p2 圖2-中間人攻擊QQ瀏覽器的更新過程。在左圖中,我們可以插入任意的更新日誌。在右側,更新下載完成後,瀏覽器會提示使用者安裝憤怒的小鳥APK(攻擊者可以將這個App的名稱修改為“QQ瀏覽器”,使用與QQ瀏覽器相似的圖示,從而誘使使用者安裝這個APK)

目前,由於Google Play商店無法在中國使用,所以中國的安卓使用者必須透過其他途徑來更新應用。因為無法使用Google Play商店的更新過程,所以,開發者必須自己實現自動更新機制,而這樣則會導致程式的更新過程出現漏洞。據稱,中國版的Google Play商店會在2016年上線。

0x04 第三部分:分析Windows版QQ瀏覽器


我們分析的Windows版QQ瀏覽器是9.2.5478版本,下載於http://browser.qq.com/。雖然,Windows版的QQ瀏覽器也是透過WUP請求與伺服器通訊,但是,採用了不同於安卓版本的加密方式和加密時間。而且,Windows版本使用了MTEA+MCBC演算法來加密WUP請求,這是一種對稱加密演算法,而不是安卓版本上的非對稱RSA演算法(WUP響應都是採用了MTEA+MCBC演算法進行加密,無論是安卓版本還是Windows版本)。

我們還發現,安卓版本的WUP請求都是發給了http://wup.imtt.qq.com:8080/,而Windows版本則是向多個URL傳送了WUP請求,包括http://qbwup.imtt.qq.comhttp://wup.html5.qq.comhttp://wup.imtt.qq.com:8080

透過WUP請求來看,Windows版QQ瀏覽器還會跟蹤裝置的硬體指紋。這裡的硬體指紋指的是下列專案的MD5雜湊:

  1. 網路MAC地址
  2. 硬碟序列號
  3. 硬碟型號
  4. 硬碟控制器版本號

比如:md5(“080027B09CC2” + “VB7c666e15-ef97c40b” + “VBOX HARDDISK” + “1.0”)

因為MTEA+MCBC是完全對稱的,所以,任何能觀察到流量的中間人都可以利用硬編碼的加密秘鑰,輕易地解密所有的WUP請求。和前面一樣,我們監控了瀏覽器傳送的流量並解密了所有的WUP請求。其中有多個WUP請求會洩露可解密的個人資訊。下面是我們識別出的一些重要請求,以及每個請求傳輸的個人資訊:

WUP請求 傳送時間 加密程度
devicesniffer.DeviceSnifferHandle 瀏覽器啟動時 簡單加密
login.login 瀏覽器啟動時 簡單加密
qbkpireportbak.stat 瀏覽器啟動時 簡單加密
qbpcstat.stat 瀏覽器啟動時 簡單加密
qbindexblacklist.testUrl 在位址列中發起搜尋請求或輸入URL時 不加密

WUP請求本身是沒有加密的,但是其中的WUP有效載荷使用了DES+ECB演算法進行加密(一種對稱性的加密演算法,解密起來很簡單),使用的秘鑰是“\x62\xe8\x39\xac\x8d\x75\x37\x79”。

資料點 資料點描述 加密程度 WUP請求
Hardware fingerprint 網路MAC地址,硬碟序列號,硬碟型號,硬碟控制器版本號的雜湊 不加密 login.login qbkpireportbak.stat qbpcstat.stat qbindexblacklist.testUrl
Q-GUID QQ瀏覽器使用這個唯一字串來識別使用者身份 不加密 devicesniffer.DeviceSnifferHandle login.login* qbkpireportbak.statqbpcstat.stat qbindexblacklist.testUrl
Q-UA QQ瀏覽器使用這個值來識別應用版本和硬體平臺的型別 不加密 login.login qbindexblacklist.testUrl
Machine IP Address 使用者裝置的網際網路協議地址 簡單加密 devicesniffer.DeviceSnifferHandle
Machine hostname 使用者的Windows主機名稱 簡單加密 devicesniffer.DeviceSnifferHandle
Gateway MAC address 使用者計算機上,閘道器的媒體訪問控制地址。 簡單加密 devicesniffer.DeviceSnifferHandle
Windows version and build 使用者計算進上的Windows版本和編譯號 不加密 qbkpireportbak.stat qbpcstat.stat qbindexblacklist.testUrl
Internet Explorer version 使用者計算機上的IE版本 簡單加密 qbkpireportbak.stat Qbpcstat.stat
QQ Browser version 使用者計算機上的QQ瀏覽器版本 不加密 qbindexblacklist.testUrl
Hard drive serial number 使用者硬碟的唯一序列號 簡單加密 qbkpireportbak.stat qbpcstat.stat
Windows user security identifier 隨機生成的Windows使用者唯一標示符 簡單加密 qbkpireportbak.stat qbpcstat.stat
Full page URL 在位址列中輸入的每個頁面的完整URL 未加密 qbindexblacklist.testUrl

Q-GUID使用了3DES+ECB加密演算法,使用的秘鑰是“\x63\xd7\x90\x63\x3c\x0e\x2f\xc3\x46\xef\x85\x37\x42\x1f\x9d\x4a\x46\x3d\x58\xf3\x8a\x95\xec\x84”明文位元組和隨機位元組交替出現,也就是說,第一個,第三個,第五個等位元組是Q-GUID的第一個,第二個和第三個位元組,而明文的第二,第四,第六等位元組是隨機選擇的。

當使用者訪問了一個網頁後,Windows版QQ瀏覽器也會透過WUP請求洩露使用者資訊。每個被訪問頁面的完整URL,無論是輸入到位址列,透過連結跳轉,還是其他方式訪問,都會經過MTEA+MCBC加密,傳送到http://masterconn.qq.com/,使用的秘鑰是“\x8a\x0d\x75\x73\x90\x03\x4a\xd2\xb5\x25\xab\xe2\x31\xe2\x9f\x6f”。

軟體更新過程存在漏洞

軟體更新檢查是透過JSON傳送給http://update.browser.qq.com/qbrowser。與安卓版本一樣,更新請求和伺服器返回的後續請求都沒有經過加密,我們發現,Windows版本和安卓版本的區別在於,Windows版會驗證更新包的數字簽名。但是,我們發現了兩種針對更新過程的攻擊活動,任何中間人都可以透過主動攻擊,在安裝了QQ瀏覽器的裝置上遠端執行程式碼。

第一種攻擊是目錄遍歷攻擊。通常,當有更新時,QQ的伺服器會在響應中給出EXE檔案的下載連結,MD5雜湊,新功能和修復簡介,EXE的檔名和儲存位置。我們發現檔名中出現了目錄,透過目錄遍歷,攻擊者可以覆蓋使用者有許可權寫入的任何檔案。例如,將檔案命名為../../../../../../../../../program files/tencent/qqbrowser/qqbrowser.exe,我們就可以用任意程式替換QQ瀏覽器,這樣使用者在下次執行QQ瀏覽器時,實際執行的就是我們的程式。攻擊者可以利用這種攻擊方式來安卓隱藏的間諜軟體或木馬。

第二種攻擊方式說明了僅僅是驗證數字簽名還不足以認證軟體更新的安全性。數字簽名驗證只是判斷下載的EXE是不是由騰訊簽名的,但是不會判斷這個EXE會不會更新QQ瀏覽器-這個EXE可以是任何一個騰訊簽名的程式。我們發現,舊版的QQ瀏覽器安裝程式不會執行簽名檢查(這個安裝程式本身只使用了對稱加密),在更新時也是這樣,我們使用了漏洞版本的QQ瀏覽器線上安裝服務來“更新”使用者的QQ瀏覽器,然後下載和執行我們選擇一個EXE(圖3)。

p3 圖3-中間人攻擊QQ瀏覽器的更新程式,首先注入一個有漏洞的線上安裝程式,然後注入我們的程式。有效載荷是顯示為“Oh Hai There”,但是,可以注入任意軟體,比如間諜程式或木馬。

0x05 討論


在這份報告中,我們指出了QQ瀏覽器中存在的一些很嚴重的安全漏洞。這個應用會收集和傳輸使用者的身份資料,從而導致第三方可以監控到這些資料。另外,軟體更新缺陷致使攻擊者可以在使用者裝置上執行任意程式碼,比如第三方可以在使用者的裝置上插入惡意的間諜程式並執行。最讓人討厭的是使用者還不一定能意識到風險的存在-沒有意識到自己的資料會被收集,也可能不會意識到自己的裝置上會被安裝惡意程式碼。

但是,我們已經研究發現,這一問題並不僅限於某個特定的應用,作業系統或公司。我們分析的QQ瀏覽器,百度瀏覽器和UC瀏覽器-這三家世界知名科技公司-都爆出了相似的安全漏洞。所以說,不只有QQ瀏覽器會收集這些敏感的使用者資料,並且不加密或簡單加密就傳輸。考慮到這些相似性,需要從更廣泛的移動安全和應用安全層面來評估這些安全問題,而不是集中在某一家公司或某個應用。

使用者信任web瀏覽器會安全地處理使用者輸入的敏感資訊並安全地將這些資訊傳輸給web伺服器。但是,QQ瀏覽器和其他的瀏覽器背棄了使用者的信任,這些軟體不僅僅在收集使用者資料,還採用了一種不安全的傳輸方式。即使是使用了非對稱加密,也沒有能夠堅持。安卓版的QQ瀏覽器使用了非對稱的RSA演算法,但是使用的秘鑰太小,沒有滿足建議的2048位大小。這一缺陷要求開發者必須要使用經過考驗的協議,比如OpenSSL這種廣泛使用的方法能夠更加安全地傳輸敏感資料。

除了批評這些應用的資料傳輸方式不夠安全,更大的問題在於為什麼要收集和傳輸這類個人資料。經由移動裝置傳輸的個人身份資料成千上萬,收集這些資訊會導致嚴重的使用者安全和隱私問題。然而,正是因為使用者裝置上的這些資料,開發者才能夠提供高效的,高度定製化的服務,這些移動版瀏覽器收集的資料範圍過大,很可能會引起使用者的擔憂-尤其是當廠商沒有辦法保證資料的安全。收集與使用者身份,使用者裝置和使用者線上行為相關的資訊,很可能是為了監控高風險使用者,在中國,可能包括民主人士,記者,人權支持者,律師等。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章