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