阿里巴巴支付寶的一個(gè)進(jìn)程Alipaybsm.exe被懷疑監(jiān)控網(wǎng)絡(luò)流量,它會(huì)復(fù)制發(fā)送的數(shù)據(jù)到接收緩沖中。
在接下來(lái)的篇幅中,我要講一個(gè)目前還沒(méi)結(jié)束的故事。故事可能還會(huì)繼續(xù)發(fā)展下去,也可能因?yàn)槲业膽卸痛舜蜃?。但至少我覺(jué)得目前已經(jīng)有足夠有意思的信息可以讓諸位知道了。這件事,跟支付寶有關(guān),跟(網(wǎng)絡(luò))信息安全也可能有一些關(guān)系。有興趣的朋友,可以接著看下去。
我以前曾寫(xiě)過(guò)一個(gè)服務(wù)器Ping值測(cè)試程序(參見(jiàn)這里《寫(xiě)了個(gè)批量測(cè)試服務(wù)器Ping值的小工具》)。這個(gè)程序一直都能滿(mǎn)足我的需要,直到有一天在我老婆的筆記本W(wǎng)in7 x64系統(tǒng)上遇到了問(wèn)題:對(duì)幾乎所有的IP,我這個(gè)程序的Ping都很快收到了回應(yīng),快得不正常,幾乎就像做了個(gè)本地調(diào)用一樣,與實(shí)際情況不相符。于是我打算看看這是怎么回事情。
當(dāng)時(shí)我人在公司,VC6遠(yuǎn)程調(diào)試又不方便。最后靠著DbgView終于搞清楚了:接收到的數(shù)據(jù)中,多出來(lái)了一份不正常的東西。我之前的代碼,并沒(méi)有估計(jì)到這份不正常的數(shù)據(jù)可能會(huì)出現(xiàn),所以處理上出了些問(wèn)題。
OK,這算是我的Bug。可這“不正常的數(shù)據(jù)”到底是什么東西?我把它Dump出來(lái)一看,還真是有點(diǎn)奇怪!ICMP Type是8,源地址和目的地址則與預(yù)期的Echo回應(yīng)包剛好相反。算上sendto時(shí)候系統(tǒng)自己加上的IP包的包頭,跟我送去發(fā)送緩沖區(qū)里的數(shù)據(jù)那是一模一樣。
要解決我程序里的這個(gè)問(wèn)題非常簡(jiǎn)單。但是另一個(gè)問(wèn)題就不那么好回答了:為什么其它電腦上不會(huì)這樣,偏偏這臺(tái)電腦會(huì)出現(xiàn)這種奇怪的事情?
直接答案很簡(jiǎn)單——它一定跟別的電腦有什么地方不一樣!
那么還有第二個(gè)問(wèn)題:到底是什么地方不一樣呢?
可以說(shuō)是我的幸運(yùn),也可以說(shuō)是阿里集團(tuán)的不幸。因?yàn)槲业腡askmgr里面進(jìn)程列表設(shè)置為按ASCII字母序排升序的緣故,我很快就找到了這第二個(gè)問(wèn)題的答案:Alipaybsm.exe。殺掉Alipaybsm.exe這個(gè)進(jìn)程,前面提到的那份“不正常的數(shù)據(jù)”就不再出現(xiàn)。而這個(gè)Alipaybsm.exe似乎由AlipaySecSvc.exe在守護(hù),過(guò)了一會(huì)兒就又自己?jiǎn)?dòng)起來(lái)了。它一出現(xiàn)在進(jìn)程列表中,我一試,哈,那個(gè)奇怪的現(xiàn)象就又出現(xiàn)了。
后來(lái),我把這事情在Twitter上說(shuō)了一下,還引發(fā)了一場(chǎng)小小的討論。
我目前還沒(méi)完全想明白Alipaybsm.exe這樣做的目的是什么。初步感覺(jué),有可能是跟背地里監(jiān)控網(wǎng)絡(luò)流量有關(guān)。畢竟,目的地址不正確的數(shù)據(jù),就算被放入Socket接收緩沖里面,在網(wǎng)絡(luò)層與傳輸層之間估計(jì)也被濾掉了。我這次是因?yàn)橛昧薙OCK_RAW,需要自己下到網(wǎng)絡(luò)(IP)層來(lái)處理數(shù)據(jù),才碰巧發(fā)現(xiàn)了這個(gè)情況。如果只是在傳輸層(TCP/UDP)從事工作,估計(jì)不會(huì)有任何察覺(jué)。
只不過(guò),反過(guò)來(lái)講,如果能做到復(fù)制數(shù)據(jù)到Socket接收緩沖,那應(yīng)該完全可以做到監(jiān)控流量而不帶任何痕跡才對(duì)。所以我目前還只能理解為,Alipaybsm.exe想完全監(jiān)控網(wǎng)絡(luò)流量,所以利用了這個(gè)手段(復(fù)制發(fā)送的數(shù)據(jù)到接收緩沖中),但干這事屁股沒(méi)擦干凈(也可能沒(méi)法擦干凈),才產(chǎn)生了我遇到的這些情況。
我本來(lái)以為當(dāng)時(shí)那個(gè)Alipaybsm.exe是個(gè)假貨。但看EXE的詳細(xì)信息,以及綁定的數(shù)字證書(shū),都像是支付寶官方的真貨。我又以為那只是一個(gè)不成熟的版本,可能有Bug,但我前兩天為了轉(zhuǎn)一筆賬,又去下載并安裝了一個(gè)支付寶安全控件,然后它又出現(xiàn)了,帶著它那奇怪的行為又出現(xiàn)了。
所以,我們來(lái)仔細(xì)看看這貨吧:
看上去挺正常吧?
在Twitter上討論的時(shí)候,有人表示,在Mac上用防火墻沒(méi)觀(guān)察到有這個(gè)現(xiàn)象。為此,我今天特意去確認(rèn)了一下:在Windows上抓包,也觀(guān)察不到這個(gè)現(xiàn)象。我估計(jì),只有自己寫(xiě)基于SOCK_RAW的程序,才能收到這些數(shù)據(jù)。為了檢查這種特殊的行為,我專(zhuān)門(mén)寫(xiě)了個(gè)小程序AlipaybsmTester,基本上就是一個(gè)單地址單次單線(xiàn)程的PingTester。
從這幅截圖中可以看到,Microsoft Network Monitor只抓到了一來(lái)一回共兩個(gè)包,但我的測(cè)試程序發(fā)了一個(gè)包收到了兩個(gè),內(nèi)容各不相同。如果殺掉Alipaybsm.exe,那就只會(huì)收到后一個(gè)包了。
接下來(lái)再看看這個(gè)Alipaybsm.exe的一些更好玩的事情:
很奇怪的是,它其實(shí)并不是隨著“支付寶安全控件”(Aliedit.exe)裝上去的。當(dāng)你登錄支付寶,根據(jù)Web頁(yè)面上的提示安裝了“支付寶安全控件”時(shí),只會(huì)在Program Files (x86)alipay下面建一個(gè)名字叫alieditplus的目錄。
但是過(guò)一會(huì)兒(我這次過(guò)了30分鐘左右),在alieditplus下面會(huì)出現(xiàn)一個(gè)update目錄,并下載一個(gè)SafeTransaction_Setup.exe放在其“jobfile mpzip_1009_”子目錄中(不同時(shí)期不同環(huán)境中路徑可能會(huì)有所不同)。隨后Program Files (x86)alipaySafeTransaction目錄便出現(xiàn),里面就有Alipaybsm.exe(當(dāng)然還有一些別的)。
我在網(wǎng)上想搜一下關(guān)于這個(gè)Alipaybsm.exe或SafeTransaction_Setup.exe的相關(guān)信息,發(fā)現(xiàn)少得可憐。Alipay官方完全沒(méi)有提到過(guò)這些東西,好像它們是感染了AIDS的私生子一樣。不過(guò)每個(gè)安裝了支付寶安全控件的電腦上,估計(jì)都會(huì)有這些個(gè)東西(還有個(gè)AlipayDHC也值得注意)。我認(rèn)為以這種方式進(jìn)行推廣的程序,很可能另有其目的,不見(jiàn)得真的是保障個(gè)瀏覽器安全這么簡(jiǎn)單。如果真是為了保障瀏覽器安全,完全可以公開(kāi)(乃至大張旗鼓地)宣傳,然后打包到安裝包里一起分發(fā)下去正大光明地安裝,不是嗎?
PS: 我后來(lái)發(fā)現(xiàn),殺掉AlipaySecSvc.exe也會(huì)導(dǎo)致復(fù)制數(shù)據(jù)包的現(xiàn)象中斷,并且重啟該服務(wù)之后,恢復(fù)現(xiàn)象花的時(shí)間比單單殺掉Alipaybsm.exe要長(zhǎng)。可見(jiàn)Alipaybsm.exe的角色大概只是一個(gè)行動(dòng)的發(fā)起者和結(jié)果的分析者,具體對(duì)流量實(shí)施監(jiān)控的行為,很可能是它去調(diào)用AlipaySecSvc.exe中的某些個(gè)服務(wù)來(lái)完成的。這說(shuō)明對(duì)于“支付寶安全控件”本身也不能掉以輕心。相關(guān)功能其實(shí)可能一直就放在AlipaySecSvc.exe中,只是沒(méi)有人來(lái)扣扳機(jī)而已。而這個(gè)扣扳機(jī)的可以是Alipaybsm.exe,也可以是別的誰(shuí),那誰(shuí)誰(shuí)誰(shuí)。