回想兩年前剛入職那會,真是“志得意滿”,心想自己大學時由於着迷於當時
流行的flash動漫,大部分業余時間基本耗在自學計算機之路的摸爬滾打上了,而且
畢業后還不惜又耗一年的時間考取了華科的計算機研究生,為的是換個專業證書,
接着熬過了所謂的碩士生涯然后就進入了國內口碑最好的安全廠商奇虎360;努力總
沒白費,正式踏上了曾“朝思暮想”的安全行業,可以繼續做我的“黑客夢”了。
應屆生入職時,會例行的培訓3個月。說是培訓,其實是一次“再面試”,也就
是趁機考察下大家的動手解決問題的能力。從獨立完成RSS閱讀器、小組合作完成
類似微軟的計算器到小組合作完成網絡五子棋,這個過程中確實讓人比較有成就感
,讓我發現了自己的動手編碼能力和快速學習解決問題的能力並不比科班出身的人
差,甚至還可能比大多數人強那么一點點。而且正是當時小組的導師也發現了我這
一點,收留我進入他所在的部門“主動防御”,去做后台。后台,這個詞對於當時
的我而言還是比較神秘和向往的,於是,我更加“意氣風發”,決心一定要認真對
待這次機會讓自己也能正式踏入“安全圈”。
入部門之后,導師所在小組連我在內其實就3個人,導師、我、還一個社招的,
下面就分別以張、我、顏代稱吧。張負責哪塊,當時我還真不清楚,畢竟是直屬上
級吧,他吩咐什么我照辦就行了,其他的不在我該了解的范圍;顏負責后台的數據
統計和交互頁面的開發;我嘛,張沒給我說將來會去負責什么,只是給了我svn的代
碼閱讀權限,先讓我放羊式的自己瀏覽下。純粹讓你學習先,哪這么美,張給我了
點體力活,讓我用python寫個簡單的功能,將后台的url日志做下各種統計工作,日
志哪來的、統計之后做什么的,這些我一概不知,我也不知道該不該問。他當時給
我分配這個任務是在周五下班前,明擺就是給你個家庭作業了。正好我也想學習下
python,就欣然的去加班,中間遇到各種瑣碎細節的問題,基本都是不知道完成某
個小功能有現成的庫可用,或者知道某個庫可用但是使用過程中會踩進各種容易掉
進去的坑中,這都是初學者必然會遇到的共同問題吧。接下來,又接到了一個全新
的任務:提取PE文件中的某些區塊的信息,包括導入/導出表、圖標資源等,從學習
PE格式到研究pefile模塊的實現,到eclipse下的調試,到成功提取想要的區塊信息
,這兩個個小任務完成之后,開了個面對面的小會,張說我最好能做xen虛擬化的研
究。我哪知道什么是xen,只知道是linux下的東西、開源的、用來運行虛擬機的,
還蠻高端大氣上檔次的,於是就在沒什么多余選擇的情況下選了這個虛擬化研究。
既然選了,再怎么一無所知愚昧無知,也得硬着頭皮耐着寂寞去潛心研究。於
是,下載xen的源碼、編譯、安裝、試驗各種linux下的命令。。。說來一句話的事
,聽來連貫流暢,對於一個linux新手來說還是有點挑戰的,單單是編譯、安裝啟動
內核所需的文件、配置啟動菜單這些概念就夠你折騰的了。這事折騰了幾天倒也忘
了,在裸機上裝xen並能正常啟動完成了,接着張在trac上給了我新的任務,在xen
上創建一台能穩定運行的windows的虛擬機,於是又噼里啪啦去xen的官網上搜索
各種資料,反正整個過程就是試驗、看日志、調整、再試驗,因為你對虛擬化沒什
么理論背景,只能采用這種簡單粗暴的方法了。從安裝xen到創建穩定的windows虛
擬機大概用了一周時間吧。接下來比較有挑戰性的任務到了,“改善xen下虛擬機網
絡的性能”,聽來好玄啊,我只能默默點頭,然后就是去分析xen的日志、看文檔的
解釋、在源碼里一頓grep查找,暈暈乎乎的,但總算是找到了創建虛擬網絡接口的
代碼塊了,好吧既然張說有個多余的網絡設備對hvm模式的虛擬機來說是不需要的,
那就直接取消掉那個創建過程吧,還真是,取消掉之后虛擬機仍然能正常聯網,不
錯,將這個小的改造做成patch吧。做完補丁,接下來是解決“虛擬機網絡穩定性”
,至於這個問題的背景張也沒給我提,看來他是覺得沒必要說,只給我提示使用
dnsmasq取代目前的libvirt來讓虛擬機的使用dhcp和nat聯上外網。好的,一下子各
種概念如潮水般涌來,xen的網絡結構是什么樣子、大致什么原理、dnsmasq和dhcp
什么關系、nat用什么來實現。。。時間有限,請記住不是讓你來研究這些該概念和
深層次理論的,只管在感性和膚淺的理性認識下去試驗試驗再試驗,拿出愛迪生發
明燈泡時的精神,失敗的嘗試是為最后的成功鋪路的,確實,前面的鋪路過程實質
就是使用排除法不斷排除錯誤方向的過程,所以只要你耐心足夠和豐富點的想象力
,那么問題是完全可以解決的,只是問題在於,當你知道解決了的時候你還是會去
想:誒,真可以啊,我解決的理論依據在哪呢,好凌亂。。。真是剪不斷,理還亂
,懵懵懂懂的狀態還在持續,新的任務紛至沓來,截止日期都定了,反正舊問題一
時半會想不太通,還是先去面對新問題吧。於是乎,借助grub來寫個讀取虛擬機磁
盤鏡像中文件的命令行工具吧、寫個在恰當時機生成虛擬機快照的命令工具吧、研
究二進制快照的格式以及嘗試修改來生成不同硬件配置的虛擬機、在樣本檢測流程
中動態的修改虛擬機快照模塊來快速啟動不同配置的虛擬機、改進下從關閉后的虛
擬機的磁盤鏡像中提取文件的效率。。。等等這些細小的、研究型的活讓你應接不
暇。 這些對樣本檢測流程的性能和效率有影響的問題都解決之后,以為可以喘口氣
了,呵呵,想得美,之前的研究工作是在版本屬於3.0系列的xen下,現在又出了一
款4.0系列的穩定版,得升級。。。尼瑪,意味着之前的那些工作都的在新版本上來
次升級,什么升級啊,就是重新再去測試下修改下,保證那些補丁在xen4上面也能
正常使用。xen3上的操作虛擬機的接口使用python實現的,xen4上使用c語言實現的
,這次的改動比xen3中的要大,而且代碼的編寫量也更大,還好gdb調試起來比較靈
活,升級過程總體還比較順利,最終分別整理出了xen3、xen4下的各個干凈的補丁
,然后配合ops部門做了個專門為主防后台蜜罐服務器准備的xen內核和工具集的安
裝源及部署腳本。這個升級過程中其實還插進了一個不痛不癢的事情----為分析360
殺毒引起的藍屏原因專門搭建一個內部用來統計的后台流程,組內的流程框架還是
相當不錯的,3天就搭建好了,不由對這個分布式的多進程多線程應用程序框架多了
幾分興趣,而且還了解到通過wine可以讓windows下的應用程序在linux下運行,真
是神奇。
至此,9個月的時間過去了。
藍屏分析流程有了新的需求,為廣大小白用戶自動查找藍屏原因並修復,這次
是要對外發布的產品,掛在安全衛士的電腦門診中,而且有一定的實時性要求,不
錯,這個活還比較有趣,我將親身經歷一個產品從無到有的全過程。其實流程很簡
潔,用戶上傳內存轉儲文件、后台接收文件、分析該dump文件提取屬性、用這些屬
性去匹配原因規則得到原因標識號、根據原因標識號去匹配雲端的方案規則、將解
決方案展示給用戶並嘗試修復。由於這個過程所經歷的階段比較多,而且分析dump
文件階段的效率很難有大的提升,於是產品方面決定采納我們開發人員的建議,將
在客戶端顯示倒計時60秒,也就是將修復的可忍受時間的限制為60s,讓用戶有個盼
頭,心里有數,不用毫無征兆的等待下去,畢竟這個浮躁的年代能靜心等待的人不
多。。。
接下來的5個月就是交錯在這幾個任務中切換,維護藍屏分析業務流程、為蜜罐
的樣本檢測流程擴展出“rootkit檢測”分支。
一年的多時間過去了,到了2013年1月。
全新任務到,去研究google上開源的volatility和github上的libvmi,看看哪
個更適合用來分析虛擬機的內存。volatility看了個把月,初步了解到是怎樣將某
個進程的虛擬地址轉化為物理地址、物理地址轉為dump文件的偏移。這不快過年回
家了,想起之前有個不緊急的任務拖着還沒完成,於是心血來潮奮戰5天,總算可以
將虛擬機的磁盤鏡像文件通過fuse掛載到文件系統上了,也就是說linux下可以讀取
基於qemu模擬器的虛擬磁盤中的的文件了,等於將虛擬磁盤的ntfs和fat文件系統無
縫集成到了linux中,這下從關閉后的虛擬機的磁盤中提取樣本行為日志文件就很便
捷了,而且這個虛擬磁盤可以是增量盤。這下虛擬機可以拋棄使用原生格式的磁盤
鏡像了,增量盤的使用讓虛擬機磁盤的母盤可以方便的復用,另外虛擬磁盤實際占
用的物理空間也大大縮小了。
年后回公司已是3月了,開始欣賞libvmi這個讀取虛擬機內存的庫,c語言寫的,
不錯,gdb調試起來方便。很強大,可以監視虛擬機讀寫內存的事件,並在恰當的
時刻做回調處理,借此機會也了解到了windows的少部分內核數據結構。其實這一切
的目的都是為了在虛擬機調用內核的某個函數時,比如NtReadFile,可以捕獲這個
動作,同時提取出該函數的參數從而得知在讀取哪個文件,算是對當前運行程序的
行為進行監控吧。斷斷續續研究這個庫將近兩月時間,順便修復了其中一個比較隱
蔽的bug,並和github上該項目的發起人討論了下內存讀寫事件的注冊方式。
到了2013年5月,公司的新產品天眼啟動,於是我開始研究怎么制作一鍵安裝盤,
將xen內核、依賴的工具包、精簡后的蜜罐檢測流程等部署安裝到企業客戶的機器,
保證傻瓜化、無人值守。
於是接下來的半年就一直在天眼這個產品上折騰,產品的部署安裝、產品注冊
激活、部署機器間安全通信、產品升級等問題,設計、編碼、測試、修正、再測試,
如此往復、生生不息。。。
現在,2013年已經接近尾聲了,我也離開了360,記下了這篇流水日志。
整體回顧下,這兩年的經歷,確實不能用一句話概括出來,因為所做的事情多
數比較雜亂、細小,連貫性不夠,以至於我和朋友在聊起時,對方會禁不住問我:
我不清楚你究竟是負責做什么的。。。我笑笑說,什么事情上面需要人去做就做什
么吧。
如果你能耐心讀到這里,我只能說,朋友,留下你的網絡聯系方式吧,說不定
你和我感同身受。。。可以交流下。