數字化技術的應用,成為了金融機構良性發展的驅動力,卻也在諸多方面留下了安全隱患。近期人民銀行辦公廳聯合中央網信辦等多家單位聯合發布的《關于規范金融業開源技術應用與發展的意見》(以下簡稱《意見》),再次將金融信息安全的問題放到了輿論的風口浪尖。
“鼓勵金融機構將開源技術應用納入自身信息化發展規劃,加強對開源技術應用的組織管理和統籌協調”,《意見》從政策層面規范了金融科研機構對于新興數字化技術的使用場景和使用模式,而在技術層面,諸多國內技術團隊也在提供更智能的開源自動化模糊檢測方案,強化我國在相關技術方向的自主可控能力。
最近,水木羽林聯合清華大學軟件學院Wingtecher Lab就開源了操作系統模糊測試工具Healer,本文將介紹利用Healer進行操作系統安全測試的基礎原理及其使用方法,Healer是一款?高效的內核模糊測試工具,由水木羽林與清華大學軟件學院Wingtecher Lab聯合研發,可用于快速挖掘內核風險。
Healer項目開源地址:https://github.com/SunHao-0/healer
Healer原理介紹
操作系統內核測試需要解決的一個核心問題是高質量調用序列的生成。Healer兼容現有kernel fuzzer的特征,例如, Healer可以直接利用業界廣泛使用的Google Syzkaller的接口描述,來自動生成滿足結構約束和部分語義約束的系統調用序列,從而保證生成的每個調用不被簡單的內核參數檢查拒絕,并通過執行生成的調用序列來觸發內核崩潰、不斷地發現內核漏洞。 但又不同于現有工具,Healer設計實現了高效的算法和框架來優化整個Fuzz流程,例如,Healer通過使用系統調用之間的影響關系來引導調用序列的生成與變異,盡可能地保證調用序列中的前序調用為后續調用設定需要的內核狀態,并通過關系學習算法在運行時不斷精化和發現新的影響關系、優化整個fuzz過程。如下圖所示,關系學習算法實際上在推導一個非常復雜的圖結構,其中每個節點對應一個系統調用,每條邊對應調用之間的影響關系。 
最終效果上,Healer生成的系統調用序列步驟更多、更有效,可以提高每個測試用例達到內核深層邏輯、挖掘深層漏洞的效率。 基于標準對比實驗可以發現,相比于Google Syzkaller、Moonshine等同類工具,Healer可以達到28%以上的覆蓋深度提升、2倍以上的覆蓋速度加速。

關于Healer的更多信息,可閱讀孫浩、沈煜恒、劉建中及姜宇等人發表在ACM SOSP 2021的論文《HEALER: Relation Learning Guided Kernel Fuzzing》。 截止目前,Healer已向Linux社區匯報了數百個漏洞,已確認并修復60余個。
Healer使用方式
安裝Healer
除了少部分補丁代碼(Golang,C),Healer是使用高效的系統級編程語言rust從零研發。 編譯構建Healer需要安裝下述依賴:
最新版rust工具鏈
Golang環境,啟用Go mod
Gcc,1.0版本或更新
Qemu,0版或更新
除了上述工具依賴,一些常見的工具也需要被安裝,例如sha384sum、patch、make工具。
一旦上述工具準備就緒,Healer可以通過如下命令一鍵構建:
> cargo build --release
小提示:使用nightly版本,并設置構建目標可獲得進一步的性能加速(RUSTFLAGS="-C target-cpu=native")
最終,編譯好的二進制可以在項目目錄下的target/release目錄中找到,其中healer為最核心的可執行文件,syz-bin下有構建好的打過補丁的執行器。
Healer基礎用法
使用Healer對Linux內核進行模糊測試僅需兩個步驟:
(1)構建磁盤鏡像與內核;
(2)創建工作目錄與啟動Healer。
Healer利用Qemu啟動待測內核,因此我們需要準備一個磁盤鏡像和待測內核本身。 磁盤鏡像可以通過兩種方式獲得:第一種是利用完全自動化的腳本來構建,例如使用Syzkaller提供的create-image.sh腳本;第二種是使用三方構建好的鏡像,例如Linux發行版提供的鏡像。 得益于Linux內核本身優秀的構建方案,編譯待測內核也非常容易。 在獲得Linux內核源碼后,我們僅需在內核編譯配置文件(.config文件)中添加覆蓋率、sanitizer選項,隨后一鍵構建即可(make)。 推薦啟用如下配置項,更多編譯配置可參考這部分指導。
# 覆蓋率
CONFIG_KCOV=y
# 用于符號化的調試信息
CONFIG_DEBUG_INFO=y
# 內存錯誤檢測器
CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y
# 部分鏡像要求的特性
CONFIG_CONFIGFS_FS=y
CONFIG_SECURITYFS=y
上述步驟結束后,我們就獲得了stretch鏡像與用于登錄的ssh密鑰文件stretch.id_rsa以及待測內核bzImage。
隨后我們可以構建一個工作目錄,下面用環境變量WORK-DIR表示。 把準備好的鏡像拷貝到工作目錄,并把可執行文件拷貝到工作目錄下的bin目錄,最后工作目錄應該有如下內容:
> cd $WORK_DIR && ls
bin bzImage stretch.id_rsa stretch.img
> ls $WORK_DIR/bin
healer linux_amd64 syz-repro syz-symbolize syz-sysgen
到了這一步,我們的準備工作就都完成了,我們可以使用如下命令一鍵啟動Healer,開始整個fuzz過程:
> healer -d stretch.img -s stretch.id_rsa -k bzImage
其中,-d、-s、-k分別指定了磁盤鏡像、ssh-key以及待測內核,也可以使用默認參數直接啟動Healer,無需提供任何命令行參數。 如果一切正常,那么如下日志會被打印:

可以看到,Healer會自動加載輸入語料、檢測內核特性、預啟動檢錯,等待初始setup、檢測過程完成,整個fuzz過程就開始了,可以通過日志數據、存儲在輸出目錄的數據查看內核奔潰、覆蓋數據等。
Healer進階用法
為了支持不同的使用場景,Healer還支持更高級的使用方法,下面將進行簡單介紹。
架構支持:Healer支持非常多架構的運行和Fuzz,例如x86/x86_64、arm/arm64、mips、ppc64等架構,這一特性在編譯時會自動配置,無需任何手動的配置。
多實例fuzz:Healer支持并發多實例fuzz,通過-j參數即可指定,每個實例對應一個工作線程,工作線程會單獨啟動Qemu、執行整個fuzz流程,并與其它工作線程共享&同步數據。
Fuzz數據自動恢復:Healer支持Fuzz數據自動恢復與維護,每次Fuzz的數據,例如語料輸入、崩潰數據,都會被Healer用特定的方式寫出到輸出目錄,在每次重新啟動時,用戶無需做任何事,Healer會自動恢復Fuzz狀態,并維護歷史數據,例如為崩潰數據打時間戳,也可以通過-i選項指定新的輸入語料,從而不斷演進輸出目錄的語料質量。
錯誤注入白名單Healer:在測試時可以利用內核特性自動注入錯誤,從而檢測內核魯棒性。但一些內核模塊穩定性較差,在這種模式下很容易引起重復崩潰,通過使用白名單、利用正則表達式可過濾掉對應模塊。
黑帽WiKi_黑帽百科(www.790079.com),8年黑帽SEO優化技術,黑帽seo快速排名,黑帽SEO技術培訓學習,黑帽SEO快速排名程序、泛目錄、寄生蟲技術,贈送免費黑帽SEO視頻教程
(黑帽seo技術,網站快速排名,蜘蛛池加速收錄,目錄程序定制)
掃一下添加微信:
