剛?cè)肼毦蛯?xiě)了個(gè)bug,把幾萬(wàn)用戶搞藍(lán)屏了…
這幾天看到公司有校招的同學(xué)不斷入職,抬頭一看臺(tái)歷,不算實(shí)習(xí),正式工作滿7年了。7年光陰,彈指一揮間。
記得7年前,簽訂勞動(dòng)合同加入我的第一家公司:百度。
說(shuō)來(lái)也挺奇怪,我本來(lái)校招投遞的崗位是C/C 開(kāi)發(fā)崗,結(jié)果由于面試過(guò)程中,面試官看我在內(nèi)核技術(shù)、逆向分析技術(shù)和底層系統(tǒng)編程上上有一些經(jīng)驗(yàn),于是把我分到了內(nèi)核攻防組,做驅(qū)動(dòng)開(kāi)發(fā)。
那時(shí)候,我們團(tuán)隊(duì)分了兩個(gè)方向:
1、漏洞安全攻防
2014年,正是微軟宣布停止對(duì)Windows XP技術(shù)支持的時(shí)候,為了守護(hù)國(guó)內(nèi)數(shù)量眾多的XP用戶(說(shuō)是守護(hù),其實(shí)就是搶占市場(chǎng)),各個(gè)安全廠商都開(kāi)始推出XP安全防御產(chǎn)品,其中比較出名的就是360的XP盾甲。
國(guó)內(nèi)的信安評(píng)測(cè)機(jī)構(gòu)CNCERT搞了一個(gè)XP安全挑戰(zhàn)賽,隔幾個(gè)月就來(lái)一次PK,在不同的XP電腦上分別裝上各家的安全產(chǎn)品,然后使用一些漏洞EXP進(jìn)行攻擊,看看誰(shuí)守得住。主要的幾個(gè)玩家就是360、騰訊電腦管家、金山毒霸、北信源,還有就是百度。
咱們團(tuán)隊(duì)中的漏洞安全攻防組就是負(fù)責(zé)這個(gè)方向,把XP上能使用的漏洞基本上全都擼了一遍,然后把更高系統(tǒng)Win7、Win8上的一些安全機(jī)制(比如DEP、ASLR等等)通過(guò)內(nèi)核驅(qū)動(dòng)的方式移植到XP上去,以增強(qiáng)XP的安全能力,抵御安全攻擊,贏得比賽。
我記得360的XP盾甲做了一個(gè)功能,Windows XP啟動(dòng)時(shí),伴隨啟動(dòng)進(jìn)度條的出現(xiàn),會(huì)出現(xiàn)經(jīng)典的LOGO,360把這個(gè)logo改了,居然改成了360的logo,當(dāng)時(shí)年輕的我被震的一愣一愣的,居然還有這種騷操作。
不過(guò)很快,身邊的同事就拿到ntldr進(jìn)行了逆向分析,找到了360這一招的原理,我們也照貓畫(huà)虎,把這個(gè)LOGO換成了咱們百度的,不過(guò)沒(méi)有推到產(chǎn)品上,估計(jì)會(huì)被噴的,只當(dāng)是技術(shù)研究罷了。
團(tuán)隊(duì)中的成員好多都是從360挖過(guò)來(lái)的大牛,那段時(shí)間,跟著這些大佬們學(xué)到了許多東西,我在二進(jìn)制漏洞方面入門差不多就是那個(gè)時(shí)候。
2、競(jìng)品攻防對(duì)抗
我主要的精力是放在這一塊的。如果說(shuō)前面第一個(gè)方向是和漏洞攻擊做對(duì)抗,那這個(gè)方向就是和競(jìng)爭(zhēng)對(duì)手打交道,這一部分更加有意思。
競(jìng)品對(duì)抗分為三塊,安裝、啟動(dòng)與優(yōu)化、反卸載。
安裝,就是競(jìng)爭(zhēng)對(duì)手會(huì)想進(jìn)一切技術(shù)手段對(duì)我們的產(chǎn)品進(jìn)行圍追堵截,如果你的電腦上安裝了競(jìng)品,可能你下載了一個(gè)百度殺毒的安裝包,安裝莫名報(bào)錯(cuò),各種依賴缺失,甚至連安裝包都下載不成功,各種情況都有。
實(shí)際上,是競(jìng)爭(zhēng)對(duì)手的產(chǎn)品在背后作祟,當(dāng)它識(shí)別到百度的產(chǎn)品在安裝時(shí),會(huì)各種使絆子,一開(kāi)始通過(guò)文件MD5來(lái)識(shí)別,我們官方發(fā)布的每一個(gè)安裝包的MD5都會(huì)第一時(shí)間被競(jìng)爭(zhēng)對(duì)手拉入黑名單,一遇到直接就被干。
后來(lái)我們改了策略,安裝包下載自動(dòng)隨機(jī)生成,每一次下載的MD5都不一樣,這樣才勉強(qiáng)逃過(guò)絞殺,不過(guò)對(duì)手也不是吃素的,后面又改成文件特征識(shí)別,比如文件內(nèi)部含有“baidu”等字符串,就列入黑名單,那段時(shí)間,百度網(wǎng)盤(pán)和百度音樂(lè)等幾款客戶端軟件還因此被殃及過(guò)。沒(méi)辦法,我們只好再次抹掉這些特征,或者進(jìn)行加密,不讓它們明文出現(xiàn)。
再后來(lái),對(duì)手改成了通過(guò)文件圖標(biāo)來(lái)識(shí)別對(duì)手,提取PE文件的圖標(biāo)識(shí)別是不是我們,總之,在這個(gè)過(guò)程拉鋸了很多回,非常有意思,各種損招都有。
啟動(dòng)與優(yōu)化,這是更有意思的部分。躲過(guò)了安裝這才是闖過(guò)了第一關(guān),接下來(lái)的日子,每一天都充滿了危機(jī)。
可能某一天,用戶什么也沒(méi)做,我們的產(chǎn)品就起不來(lái)了,這叫開(kāi)機(jī)啟動(dòng)使絆子,讓我們起不來(lái)。
還可能競(jìng)品可能彈個(gè)窗告訴你:內(nèi)存吃緊,趕緊優(yōu)化。然后你一點(diǎn)加速球,對(duì)手就把我們的進(jìn)程干掉了,甚至把我們直接都卸載了,文件、進(jìn)程、注冊(cè)表啥也沒(méi)了,消失的悄無(wú)聲息。
那我需要做的當(dāng)然就是對(duì)抗競(jìng)品的這些騷操作,卸載必須由用戶手動(dòng)通過(guò)控制面板或者我們自己的卸載軟件發(fā)起,需要識(shí)別競(jìng)品的卸載行為,攔截刪文件、殺進(jìn)程、刪注冊(cè)表等一系列操作。
任何一個(gè)安全產(chǎn)品都有主動(dòng)防御的功能,直接調(diào)用系統(tǒng)API進(jìn)行上面的操作肯定會(huì)被我們的主動(dòng)防御攔截掉,對(duì)手也深知這一點(diǎn)。所以,想要干掉我們,對(duì)手得在內(nèi)核模式下,用驅(qū)動(dòng)調(diào)一些比較底層的函數(shù)繞過(guò)我們的安全防御。
那我們要做的就是和它進(jìn)行對(duì)抗,直接的內(nèi)核硬碰硬不是好辦法,一不小心容易把電腦干藍(lán)屏,我們選擇了比較巧妙的一招:攔截通信。
對(duì)手要搞我們,他們處于Ring3模式下的應(yīng)用程序總得和他們的Ring0模式下的內(nèi)核驅(qū)動(dòng)程序通信吧,就是DeviceIOControl,所以我們逆向了他們的通信協(xié)議,一旦發(fā)現(xiàn)要搞的目標(biāo)是我們,就把這條消息攔截掉,這樣他們的驅(qū)動(dòng)收不到消息,也就不知道要搞我們了。
在這一部分,我們進(jìn)行了好幾個(gè)月的對(duì)抗,對(duì)手不斷變化通信協(xié)議,不斷變化通信的設(shè)備名稱,甚至加密傳輸,我們也就見(jiàn)招拆招,兵來(lái)將擋,水來(lái)土掩。
后來(lái)發(fā)現(xiàn)我們總是攔截他們的通信,他們決定不再通信了,先把這事情記錄起來(lái),記錄到文件、注冊(cè)表等各種地方,等到關(guān)機(jī)的時(shí)候,我們的驅(qū)動(dòng)程序已經(jīng)停掉了,他們?cè)賮?lái)干這事,或者放到開(kāi)機(jī)的時(shí)候,他們的驅(qū)動(dòng)比我們先加載,我們還沒(méi)起來(lái)就被干掉。
于是,戰(zhàn)場(chǎng)又轉(zhuǎn)移到了關(guān)機(jī)和開(kāi)機(jī)時(shí)刻,驅(qū)動(dòng)停止順序上,比誰(shuí)后卸載,最后留下來(lái)的就有后發(fā)優(yōu)勢(shì),可以進(jìn)行復(fù)活操作,兩邊互相搶,結(jié)果就是用戶的電腦可能關(guān)機(jī)關(guān)半天都關(guān)不了。除了關(guān)機(jī)順序,還會(huì)逆向分析它到底把信息記錄到了哪里,把這個(gè)信息刪掉,也能自保。
在這過(guò)程中,又對(duì)抗拉鋸了好幾個(gè)月,比較有意思的是,對(duì)手似乎和我們達(dá)成了某種"默契",專挑每周五下班的時(shí)候,更新他們新的策略,讓我們加班,真是太不講武德了。
隨著我們DAU的不斷增長(zhǎng),除了一味的防守,我們也開(kāi)始嘗試給競(jìng)品使使絆子,也讓他們嘗嘗這種滋味兒,正所謂以彼之道,稍加修改,還施彼身,其樂(lè)無(wú)窮,我們也來(lái)卸載他們,刪他們文件,殺他們進(jìn)程,刪他們注冊(cè)表。
剛剛?cè)肼毦蛥⑴c這種項(xiàng)目,著實(shí)對(duì)技術(shù)是有非常大的挑戰(zhàn),不管是逆向分析,加解密技術(shù),還是內(nèi)核攻防技術(shù),調(diào)試分析技術(shù),編程功底都是非常大的考驗(yàn),那段時(shí)間寫(xiě)代碼非常謹(jǐn)慎,因?yàn)橐粋€(gè)不小心,可能就會(huì)導(dǎo)致成千上萬(wàn)的用戶電腦藍(lán)屏。沒(méi)錯(cuò),我就因?yàn)閷?xiě)了一個(gè)bug,好像是一個(gè)指針釋放后未及時(shí)置空,導(dǎo)致上萬(wàn)的用戶電腦藍(lán)屏了,把剛剛?cè)肼毑痪玫奈覈樀冒胨馈?/p>
故事的結(jié)尾,可能大家想不到,我們一直和競(jìng)品A做對(duì)抗,和另一個(gè)競(jìng)品B聯(lián)合對(duì)抗A,頗有種三國(guó)時(shí)代,聯(lián)吳抗曹的味道。但在臨近年關(guān)的時(shí)候,競(jìng)品B突然在背后狠狠捅了我們一刀,全面卸載我們,一個(gè)周末,DAU掉了近千萬(wàn),年終目標(biāo)頃刻化為烏有。
那段日子,百度為了推廣他的安全產(chǎn)品,做了不少過(guò)分的事情,各種捆綁,全家桶,很多中高層領(lǐng)導(dǎo)為了KPI,寧愿犧牲口碑。因?yàn)楹透?jìng)品做對(duì)抗,導(dǎo)致產(chǎn)品怎么也卸載不掉,被用戶罵的很慘。據(jù)說(shuō)競(jìng)品B要搞我們的原因就是不小心推廣到了他們公司一個(gè)高管的電腦上,還死活卸載不掉,于是才有了后面的事情,當(dāng)然這只是道聽(tīng)途說(shuō),不知真假。
后來(lái),我也厭倦了這樣的產(chǎn)品和工作,如果是和病毒木馬做斗爭(zhēng)倒也罷了,拿用戶的電腦當(dāng)戰(zhàn)場(chǎng)互相拼殺,實(shí)在不是什么光彩的事情。
恰逢我也想謀求技術(shù)轉(zhuǎn)型,于是開(kāi)始轉(zhuǎn)向新的方向,咱們下次再聊。
作者:軒轅之風(fēng)
來(lái)源:編程技術(shù)宇宙
版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。