可怕,原來(lái) HTTPS 也沒用
背景
最近發(fā)生了幾個(gè)事情,想必有的你已經(jīng)看到過(guò)了:
- 網(wǎng)傳 某PDD員工在某匿名社區(qū)發(fā)布同事被抬上救護(hù)車的照片被抓出來(lái)并辭退?
- 某運(yùn)營(yíng)同學(xué)在試用期期間因?yàn)樵诠ぷ髌陂g上了某 1024 網(wǎng)站,導(dǎo)致試用期不過(guò)。(恰好今天瀏覽到一個(gè)知乎問(wèn)題)
試用期不過(guò)因在公司瀏覽 1024 網(wǎng)站
- 前兩天還看到不少公眾號(hào)推文,大意是:看小電影前一定要注意網(wǎng)址是不是 HTTPS 的,因?yàn)?HTTPS 是加密的,別人就不知道了。
看到上面幾個(gè)問(wèn)題,我不禁想問(wèn)(這腦回路也是……):
- 通過(guò)瀏覽器訪問(wèn) HTTPS 站點(diǎn),其他人真的沒法知道嗎?
- 通過(guò) App 訪問(wèn)匿名論壇(HTTPS),公司怎么知道的?(他是不是接入了公司 WiFi?)
總之就是,上班時(shí)間上網(wǎng)摸魚嗎?哪怕用 HTTPS 訪問(wèn),如果公司知道,是通過(guò)什么手段?
本文談?wù)勎业目捶?,主要分為以下幾個(gè)方面:
- HTTPS 為什么安全。
- HTTPS 真的安全嗎?
- App 如何保證信息安全,不被爬走?
- 公司可能的監(jiān)控手段有哪些?我們?nèi)绾巫霾拍艽_保自己的隱私泄露?
HTTPS 為什么安全
HTTPS,也稱作 HTTP over TLS,TLS 前身是 SSL,會(huì)有各個(gè)版本。
TLS協(xié)議在TCP/IP協(xié)議棧中的關(guān)系
上圖描述了在TCP/IP協(xié)議棧中TLS(各子協(xié)議)和 HTTP 的關(guān)系。HTTP+TLS 也就是 HTTPS,和 HTTP 相比,HTTPS的優(yōu)勢(shì):
- 數(shù)據(jù)完整性:內(nèi)容傳輸經(jīng)過(guò)完整性校驗(yàn)
- 數(shù)據(jù)隱私性:內(nèi)容經(jīng)過(guò)對(duì)稱加密,每個(gè)連接生成一個(gè)唯一的加密密鑰
- 身份認(rèn)證:第三方無(wú)法偽造服務(wù)端(客戶端)身份
上面內(nèi)容參考了HTTPS工作原理[1]。(石頭在N 久前用印象筆記收藏的,現(xiàn)在好多原文訪問(wèn)不了了)
HTTPS 原理
上圖就是大致介紹了 HTTPS 的握手流程,感興趣的同學(xué)可以用 WireShark 抓包詳細(xì)看看其中的每一個(gè)步驟,有助于理解 HTTPS 的完整流程。
大致就是客戶端和服務(wù)端通過(guò)“握手會(huì)談”商量出一個(gè)雙方支持的加密算法和相應(yīng)隨機(jī)參數(shù),得到一對(duì)密鑰,后續(xù)的傳輸?shù)膬?nèi)容都通過(guò)這對(duì)密鑰進(jìn)行加解密。
這對(duì)密鑰很牛皮,比如要加密傳輸消息『tangleithu』,客戶端通過(guò)公鑰加密得到的密文『xyyaabbccdd』進(jìn)行傳輸,服務(wù)端用自己的私鑰對(duì)密文解密,恰好能得到『tangleithu』。中間錯(cuò)一位都不行,這樣就保證了數(shù)據(jù)完整和隱私性。
這個(gè)過(guò)程比較復(fù)雜,本文不詳述,類似的原理可參考石頭多年前寫的這篇文章 —— RSA算法。
因此,你在通過(guò) HTTPS 訪問(wèn)網(wǎng)站的時(shí)候,就算流量被截取監(jiān)聽,獲取到的信息也是加密的,啥實(shí)質(zhì)性的內(nèi)容也看不到。
例如,如下圖所示,當(dāng)我訪問(wèn)某個(gè)網(wǎng)站,此時(shí)通過(guò) wireshark 抓包得到的信息,能獲得僅僅是一些通信的IP地址而已。
HTTPS加密傳輸
這下放心了嗎?
摸魚的過(guò)程中,就算訪問(wèn)的 IP 地址被知道了,好像也無(wú)關(guān)緊要?
其實(shí),有了 IP 地址也能獲取不少信息了。
還好這個(gè) IP 搜出來(lái)是 github,而不是……
你或許會(huì)高興,連個(gè)網(wǎng)站域名都看不到,可以放心摸魚了。不過(guò),這是真的嗎?
HTTPS 真的安全嗎?
HTTPS 真的完全安全嗎?連訪問(wèn)的域名都獲取不到?答案是否定的。
上述 HTTPS 在握手階段有一個(gè)很重要的東西 —— 證書。
SNI —— 域名裸奔
當(dāng)訪問(wèn) HTTPS 站點(diǎn)時(shí),會(huì)首先與服務(wù)器建立 SSL 連接,第一步就是請(qǐng)求服務(wù)器的證書。
當(dāng)一個(gè) Server IP 只對(duì)應(yīng)一個(gè)域名(站點(diǎn))時(shí),很方便,任意客戶端請(qǐng)求過(guò)來(lái),無(wú)腦返回該域名(服務(wù))對(duì)應(yīng)的證書即可。但 IP 地址(IPv4)是有限的呀,多個(gè)域名復(fù)用同一個(gè) IP 地址的時(shí)候怎么辦?
服務(wù)器在發(fā)送證書時(shí),不知道瀏覽器訪問(wèn)的是哪個(gè)域名,所以不能根據(jù)不同域名發(fā)送不同的證書。
因此 TLS 協(xié)議升級(jí)了,多了 SNI 這個(gè)東西,SNI 即 Server Name Indication,是為了解決一個(gè)服務(wù)器使用多個(gè)域名和證書的 SSL/TLS 擴(kuò)展。
現(xiàn)在主流客戶端都支持這個(gè)協(xié)議的。別問(wèn)我怎么知道這個(gè)點(diǎn)的,之前工作上因?yàn)檫@個(gè)事情還費(fèi)了老大勁兒……
它的原理是:在與服務(wù)器建立 SSL 連接之前,先發(fā)送要訪問(wèn)站點(diǎn)的域名(Hostname),這樣服務(wù)器會(huì)根據(jù)這個(gè)域名返回一個(gè)合適的證書。此時(shí)還沒有辦法進(jìn)行加解密,因此至少這個(gè)域名是裸奔的。
如下圖所示,上面的截圖其實(shí)是訪問(wèn)我的個(gè)人博客(www.tanglei.name)的抓包情況,客戶端發(fā)送握手請(qǐng)求時(shí),很自覺帶上了自己的域名。
HTTPS SNI
因此,即便是 HTTPS,訪問(wèn)的域名信息也是裸奔狀態(tài)。你上班期間訪問(wèn)小電影網(wǎng)站,都留下了痕跡,若接入了公司網(wǎng)絡(luò),就自然而然被抓個(gè)正著。
除了域名是裸奔外,其實(shí)還有更嚴(yán)重的風(fēng)險(xiǎn),那就是中間人攻擊。
中間人攻擊
前面也提到 HTTPS 中的關(guān)鍵其實(shí)在于這個(gè)證書。從名字可以看出來(lái),中間人攻擊就是在客戶端、服務(wù)器之間多了個(gè)『中介』,『中介』在客戶端、服務(wù)器雙方中偽裝對(duì)方,如下圖所示,這個(gè)『MitmProxy』充當(dāng)了中間人,互相欺騙:
中間人攻擊,來(lái)源 evil0x
可以安裝 MitmProxy 或者 Fiddler 之類的抓包軟件嘗試一把,然后開啟代理。
此時(shí)用手機(jī)訪問(wèn)百度,得到的信息如下:
證書信任前
提示,連接不是私密連接,其實(shí)就是瀏覽器識(shí)別了證書不太對(duì)勁,沒有信任。而如果此時(shí)手機(jī)安裝了 Fiddler 的證書,就會(huì)正常訪問(wèn)。
證書信任后可正常訪問(wèn)
因此,當(dāng)你信任證書后,在中間人面前,又是一覽無(wú)余了。
而如果你用了公司電腦,估計(jì)你有相應(yīng)的操作讓信任證書吧,或者手機(jī)上是否有安裝類似的客戶端軟件吧?
抓緊時(shí)間看看手機(jī)的證書安裝明細(xì)(比如我手機(jī)上的)。
我前任公司在信息安全這塊做得就非常謹(jǐn)慎,手機(jī)會(huì)有工作手機(jī),未授權(quán)的任何 App 都不能安裝,誰(shuí)知道 App 會(huì)悄悄干些什么事情呢。(最新熱點(diǎn),QQ掃描瀏覽器歷史記錄,你可知道)
當(dāng)然各種 App 肯定也不是吃素的,不會(huì)讓『中間人攻擊』這么容易就得逞的,咱們接著看。
如何防止信息安全,反爬
前面提到,要實(shí)施中間人攻擊,關(guān)鍵在于證書是否得到信任。瀏覽器的行為是證書可以讓用戶授權(quán)是否信任,而 APP 就可以開發(fā)者自己控制。
比如我嘗試通過(guò)類似的方式對(duì)某匿名社區(qū)進(jìn)行抓包解密 HTTPS,但最終失敗了,為什么呢?
這就要談到『SSL Pinning』技術(shù)。
App 可以自己檢驗(yàn) SSL 握手時(shí)服務(wù)端返回的證書是否合法,“SSL pinning” 技術(shù)說(shuō)的就是在 App 中只信任固定的證書或者公鑰。
因?yàn)樵谖帐蛛A段服務(wù)端的證書必須返回給客戶端,如果客戶端在打包的時(shí)候,就把服務(wù)端證書放到本地,在握手校驗(yàn)證書的環(huán)節(jié)進(jìn)行比較,服務(wù)端返回的證書和本地內(nèi)置的證書一模一樣,才發(fā)起網(wǎng)絡(luò)請(qǐng)求。否則,直接斷開連接,不可用。
當(dāng)然,一般情況下,用這種技術(shù)也就能防止 HTTPS 信息被解密了。
不過(guò),也還有其他的技術(shù)能夠破解這種方法,比如 Android 下的一些 Hook 技術(shù),具體而言就是繞過(guò)本地證書強(qiáng)校驗(yàn)的邏輯。感興趣的同學(xué)可以抱著學(xué)習(xí)目的研究一下。不過(guò)據(jù)說(shuō)這種方式需要對(duì)系統(tǒng)進(jìn)行 Root、越獄等,需要一些更高權(quán)限的設(shè)置。
因此,也告誡我們,一定不要亂安裝一些軟件,稍不注意可能就中招,讓自己在互聯(lián)網(wǎng)上進(jìn)行裸奔。一方面?zhèn)€人隱私信息等泄露,另外一個(gè)方面可能一些非常重要的如賬戶密碼等也可能被竊取。
可能的監(jiān)控手段有哪些?
辦公電腦當(dāng)然要接入公司網(wǎng)絡(luò),通過(guò)上面介紹的內(nèi)容,你也應(yīng)該知道,你在什么時(shí)候?yàn)g覽了哪些網(wǎng)站,公司其實(shí)都是一清二楚的。
若自己的手機(jī)如果接入了公司網(wǎng)絡(luò)也是一模一樣(連 Agent 軟件都不需要裝)。這就提醒我們,私人上網(wǎng)盡量用自己的移動(dòng)網(wǎng)絡(luò)呀。
瀏覽記錄,來(lái)源知乎
上面提到,如一些涉及隱私的敏感信息,如一些 PC 軟件、手機(jī) App 自己內(nèi)部加密傳輸?shù)脑挘瑑?nèi)容加密(包括但不限于 HTTPS)不被破解也問(wèn)題不大。
不過(guò),這當(dāng)然依賴這些軟件設(shè)計(jì)者的水平了。比如同一個(gè)匿名用戶對(duì)外展示的 ID 不能相同,如果是同一個(gè)的話也恰好暴露了邏輯漏洞。
當(dāng)然,我們還是不要抱有僥幸心理,在監(jiān)管的要求下,如果確實(shí)有一些違法等不恰當(dāng)?shù)难哉摰龋冀K還是有門路找到你的。
更何況,一般辦公電腦都會(huì)預(yù)安裝一些公司安全軟件,至于這些軟件究竟都干了些什么,有沒有進(jìn)行傳說(shuō)中悄悄截圖什么的,這就因人(公司)而異了。(不討論類似行為是否涉及到侵犯了員工隱私等問(wèn)題)
圖源知乎
不過(guò),個(gè)人認(rèn)為,咱也沒必要過(guò)度擔(dān)心。一般公司也不會(huì)因?yàn)槟闵习嗯紶柮€(gè)魚,逛逛淘寶、看看微博來(lái)找你麻煩的。畢竟沒必要這么點(diǎn)芝麻事情來(lái)『大動(dòng)干戈』。
但最好是不是對(duì)照員工手冊(cè)來(lái)看看,是否有明令禁止的行為?自己的行為是不是太過(guò)了,免得被抓住把柄,正所謂『常在河邊走哪有不濕鞋』,『欲加之罪、何患無(wú)辭』。
后記
本人才疏學(xué)淺,文章難免有所疏漏,如有相應(yīng)問(wèn)題,還望大家指教。最后,祝大家一輩子都不要因文中提到的類似事情掉坑里。
覺得本號(hào)分享的文章有價(jià)值,記得添加星標(biāo)哦。周更很累,不要白 piao,需要來(lái)點(diǎn)正反饋,安排個(gè) “一鍵三連”(點(diǎn)贊、在看、分享)如何?😝 這將是我持續(xù)輸出優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力。
關(guān)于作者:程序猿石頭(ID: tangleithu),阿里P7,清華學(xué)渣,前大疆后端 Leader。用不同的視角分享高質(zhì)量技術(shù)文章,歡迎關(guān)注,交流和指導(dǎo)!掃碼回復(fù)關(guān)鍵字 “1024” 獲取程序員大廠面試指南。
參考資料:
HTTPS工作原理: https://cattail.me/tech/2015/11/30/how-https-works.html
如何評(píng)價(jià)互聯(lián)網(wǎng)公司監(jiān)控員工日常上網(wǎng)的行為?: https://www.zhihu.com/question/46818840/answer/103329958
網(wǎng)傳拼多多員工因在網(wǎng)上發(fā)布同事被抬上救護(hù)車的照片,被管理層逼迫主動(dòng)辭職、趕出公司?事件真實(shí)性如何?: https://www.zhihu.com/question/438581129/answer/1670519587
HTTPS工作原理: https://cattail.me/tech/2015/11/30/how-https-works.html
淺析HTTPS中間人攻擊與證書校驗(yàn): http://www.evil0x.com/posts/26569.html
Mac/Windows Wireshark/tcpdump抓包TCP3次握手,4次揮手實(shí)例: https://www.tanglei.name/blog/example-show-3-times-handshaking-of-tcp-in-mac-or-windows.html
本文轉(zhuǎn)載自微信公眾號(hào)「程序猿石頭」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序猿石頭公眾號(hào)。