
測試操作系統(tǒng)網(wǎng)絡安全【免費下載鏈接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer項目地址https://gitcode.com/gh_mirrors/syz/syzkaller點擊查看免費下載syzkaller 作為覆蓋率引導的模糊測試器,其覆蓋率(coverage)機制既是驅動語料庫進化的核心信號,也是評估模糊測試整體進度的主要手段。本文圍繞 syzkaller 倉庫中的覆蓋率文檔 docs/coverage.md 展開,結合 pkg/cover、tools/syz-cover 與 syz-manager 的源碼,講清楚覆蓋數(shù)據(jù)的采集原理、Web 報告界面的目錄樹與源碼著色規(guī)則、原始覆蓋數(shù)據(jù)(rawcover)的獲取方式,以及命令行工具syz-cover生成 HTML/CSV/JSON 報告參數(shù)的完整用法。讀完本文,你將能夠看懂cover頁面每一種顏色的含義、從運行中的syz-manager導出原始覆蓋數(shù)據(jù),并離線生成可分享的覆蓋率報告。覆蓋數(shù)據(jù)的來源:sanitizer coverage 與 KCOVdocs/coverage.md開篇即說明:syzkaller使用sanitizer coverage(tracing mode)和KCOV進行覆蓋率采集。sanitizer coverage 同時被gcc支持,KCOV 也被一些其他操作系統(tǒng)支持;而gVisor的覆蓋率實現(xiàn)是完全不同的另一套體系。coverage point:基本塊還是 CFG 邊覆蓋率基于插入到目標代碼中的coverage point(覆蓋點)。一個覆蓋點通常對應:一段基本塊(basic block)代碼,或一條控制流圖(CFG)邊。具體是哪一種,取決于構建時使用的編譯器與插樁模式:對 Linux clang 而言默認模式是CFG 邊,對 gcc 而言默認模式是基本塊。文檔特別強調(diào)了一個容易被忽視的事實:覆蓋點是在編譯器中端(middle-end)完成大量變換與優(yōu)化 pass 之后才插入的,因此覆蓋信息可能與源代碼的關系并不直觀。實際使用中會出現(xiàn):未覆蓋的行后面跟著已覆蓋的行;你以為會出現(xiàn)覆蓋點的地方看不到覆蓋點,反之亦然(例如編譯器拆分了基本塊,或把控制流結構變成了無控制流的條件移動指令);因此,評估覆蓋率對理解整體模糊測試進度仍然非常有用,但應當“帶著一粒鹽”(with a grain of salt)來看待具體數(shù)字。從源碼結構看,覆蓋數(shù)據(jù)在 syzkaller 內(nèi)部就是一個“已執(zhí)行 PC 值的集合”:pkg/cover/cover.go 中定義了核心類型Cover map[uint64]struct{},并提供MergeDiff方法在合并新覆蓋時只返回新增的 PC——這正是語料庫去重與“新覆蓋優(yōu)先”策略的數(shù)據(jù)基礎。Linux 內(nèi)核的符號化鏈路:binutils 工具鏈docs/linux/coverage.md 進一步給出了 Linux 內(nèi)核場景下覆蓋數(shù)據(jù)如何從地址映射回源碼。kcov 導出每個被執(zhí)行基本塊的地址,而 syzkaller 運行時借助binutils工具(objdump、nm、addr2line、readelf)把這些地址映射到源碼文件與函數(shù):readelf— 檢測虛擬內(nèi)存偏移。執(zhí)行readelf -SW kernel_image列出段頭。由于 executor 在把 PC 發(fā)送給syz-manager前會把 PC 截斷為uint32,syz-manager需要利用段頭信息恢復偏移量:只考慮類型為PROGBITS的段,要求所有PROGBITS段的Address字段高 32 位相同,這 32 位即恢復偏移。在代碼中,這一邏輯對應 pkg/cover/backend 的GetPCBase(見 pkg/cover/report.go 的GetPCBase),僅對非 GVisor/Starnix 的 Linux 目標生效。nm— 解析內(nèi)核鏡像中每個函數(shù)的地址與大小:nm -Ptx kernel_image。第一列是符號名,第二列是類型(只關心t/T代碼段符號),第三列是地址,第四列是大小(syzkaller 中總是向上取整到 16)。最終形成以符號名為鍵、起止地址為值的映射,用于判斷某個函數(shù)是否被調(diào)用過。objdump— 解析對__sanitizer_cov_trace_pc的每次調(diào)用的 PC 值。編譯插樁會在每個基本塊插入__sanitizer_cov_trace_pc調(diào)用,這些調(diào)用點就是回溯覆蓋代碼行的錨點:objdump -d --no-show-raw-insn kernel_image,從反匯編中識別callq ... __sanitizer_cov_trace_pc來確定可執(zhí)行塊的起始地址。addr2line— 把 kcov 導出的、objdump解析出的 PC 值映射到源文件與行號:addr2line -afi -e kernel_image(-afi表示顯示地址、函數(shù)名并展開內(nèi)聯(lián)函數(shù))。最終得到一張以 PC 為鍵的 frame 哈希表,frame 包含PC、Func、File、Line、Inline字段;由于內(nèi)聯(lián),同一個 PC 可能對應多個 frame。對應到源碼,pkg/cover/backend/backend.go 中定義了這些結構:Frame(含Module、PC、Name、FuncName、Path、Inline及行/列范圍Range)、Symbol(符號地址區(qū)間)、CompileUnit(編譯單元及其可回調(diào)的 PC 列表)。pkg/cover/report.go 中的symbolizePCs按模塊批量調(diào)用rg.Symbolize完成 PC → frame 的轉換,findSymbol則通過二分查找把 PC 定位到所屬符號區(qū)間??缂軜嫮h(huán)境下還需要注意:在啟動syz-manager之前,必須為 syzkaller 提供正確的交叉編譯 binutils。docs/linux/coverage.md給出的示例(mips64le 目標)是創(chuàng)建符號鏈接目錄并加入PATH:mkdir -p ~/bin/mips64le ln -s which mips64el-linux-gnuabi64-addr2line ~/bin/mips64le/addr2line ln -s which mips64el-linux-gnuabi64-nm ~/bin/mips64le/nm ln -s which mips64el-linux-gnuabi64-objdump ~/bin/mips64le/objdump ln -s which mips64el-linux-gnuabi64-readelf ~/bin/mips64le/readelf export PATH~/bin/mips64le:$PATH目標三元組前綴由配置中的target選項決定。Web 界面:目錄樹、百分比與源碼著色點擊syz-manager頁面上的cover鏈接(對應 HTTP 路由/cover,見 syz-manager/http.go 中handle(/cover, mgr.httpCover)),會得到一個以內(nèi)核構建目錄為根的目錄樹視圖。目錄與文件級的百分比每個目錄顯示X% of N或---:X% of N表示 N 個覆蓋點中已有 X% 被覆蓋;---表示該目錄完全沒有覆蓋。點擊目錄可以下鉆到其中的文件與子目錄;每個源文件同樣顯示---或覆蓋百分比。點擊某個文件百分比數(shù)字,可以看到該文件內(nèi)每個函數(shù)的覆蓋率。從源碼看,這些視圖由 pkg/cover/html.go 的DoHTML生成:它先把每個源文件按路徑切分掛到templateDir目錄樹上,再由processDir自底向上累加每個目錄/文件的Total與Covered覆蓋點數(shù)量并計算百分比;當某目錄Covered 0時其子樹會被清空,模板中對應顯示---。一個值得注意的細節(jié)是percent函數(shù):百分比向上取整,但只有完全覆蓋時才顯示 100%,否則封頂 99%,避免“99.x% 卻顯示 100%”的誤導。函數(shù)級視圖由addFunctionCoverage生成,每個函數(shù)顯示X% of N,并在末尾給出SUMMARY匯總行。源碼視圖的著色規(guī)則點擊任意 C 文件會進入源碼視圖,顏色定義在 pkg/cover/html.go 的coverTemplate中(原文檔引用的report.go#L504是模板拆分前的位置)。各顏色含義如下:Covered(黑色 #000000):該行關聯(lián)的所有 PC 值都已被覆蓋。行左側有一個數(shù)字,表示有多少個程序觸發(fā)過該行關聯(lián)的 PC 值;點擊該數(shù)字可以打開對應程序。Both(橙色 #c86400):該行關聯(lián)了多個 PC 值,但只有部分被執(zhí)行。左側同樣有可點擊的程序計數(shù)。Weak-uncovered(深紅 #c80000):該行所在的函數(shù)(符號)完全沒有任何覆蓋,即函數(shù)從未被執(zhí)行。注意:如果編譯器把某符號優(yōu)化掉并把代碼內(nèi)聯(lián)到別處,則該行關聯(lián)的符號是“代碼被編譯進去”的那個符號,這會讓顏色的含義有時很難判斷。Uncovered(紅色 #ff0000):該行未被覆蓋,但它所在的函數(shù)已經(jīng)被執(zhí)行過(該函數(shù)中存在至少一個已執(zhí)行的 PC)。Not instrumented(灰色 #505050):該行關聯(lián)的 PC 未被插樁,或該行源碼根本不產(chǎn)生代碼。從源碼結構看,著色是在fileContents中按“行內(nèi)片段”(chunk)粒度完成的:它把已覆蓋與未覆蓋的行范圍(backend.Range,精確到列)逐行合并為lineCoverChunk,再輸出span classcovered|uncovered|both。模板 CSS 中.covered為rgb(0, 0, 0)、.uncovered為rgb(255, 0, 0)、.both為rgb(200, 100, 0),而未插樁代碼直接使用右欄基礎文字色rgb(80, 80, 80)(即 #505050)呈現(xiàn);原文檔描述的 weak-uncovered 深紅則對應函數(shù)零覆蓋的語義,當前模板中未再保留獨立類名,閱讀時以文檔定義為準。另外兩個源碼級細節(jié):左側程序計數(shù)點擊后打開的“最近執(zhí)行的程序”,在 pkg/cover/report.go 的prepareFileMap中實際選取的是覆蓋該行且內(nèi)容最短的程序(len(progs[progIndex].Data)更小者),便于閱讀。當啟用了精確覆蓋校驗(PreciseCoverage)時,prepareFileMap會檢查 kcov 返回的 PC 是否都能在二進制中發(fā)現(xiàn)的覆蓋回調(diào)點(CallbackPoints)里找到,若發(fā)現(xiàn)無法匹配的 PC 會報錯提示檢查discoverModules(),并可通過?force1跳過該校驗。原始覆蓋數(shù)據(jù):rawcover 與相關導出端點syz-manager暴露了一組覆蓋相關 HTTP 端點(見 syz-manager/http.go 的路由注冊段),與本文檔最相關的是:端點處理函數(shù)(見 pkg/cover/html.go)輸出/rawcoverDoRawCover每行一個十六進制 PC(如0xffffffff839862fc),去重并排序;啟用 rawCover 時直接輸出單個程序的 PC 列表/rawcoverfilesDoRawCoverFilesCSV:PC,Module,Offset,Filename,Inline,StartLine,EndLine/funccoverDoCSV函數(shù)級覆蓋 CSV/filecoverDoCSVFiles文件級統(tǒng)計 CSV/cover?jsonl1DoCoverJSONL每行一個CoverageInfo對象的 JSONL/subsystemcover、/modulecoverDoHTMLTable、DoModuleCover按子系統(tǒng)路徑前綴/模塊聚合的統(tǒng)計表DoRawCover輸出的就是syz-cover工具需要的原始數(shù)據(jù)格式。/filecover的統(tǒng)計表包含CoveredLines/TotalLines、CoveredPCs/TotalPCs、函數(shù)數(shù)與“已覆蓋函數(shù)內(nèi)的 PC 數(shù)”等指標,按子系統(tǒng)(配置中的路徑前綴)聚合,對應 pkg/cover/html.go 中groupCoverByFilePrefixes的聚合邏輯。syz-cover:離線生成覆蓋率報告?zhèn)}庫提供了小型工具syz-cover,基于原始覆蓋數(shù)據(jù)文件生成覆蓋率報告,源碼位于 tools/syz-cover/syz-cover.go。構建按文檔給出的方式:GOOSlinux GOARCHamd64 go build -ldflags-s -w -o ./bin/syz-cover github.com/google/syzkaller/tools/syz-cover也可以使用 Makefile 中現(xiàn)成的目標(第 203 行):GOOS$(HOSTOS) GOARCH$(HOSTARCH) $(HOSTGO) build $(GOHOSTFLAGS) -o ./bin/syz-cover github.com/google/syzkaller/tools/syz-cover。獲取原始覆蓋數(shù)據(jù)從運行中的syz-manager下載:wget http://localhost:your syz-manager port/rawcover原始覆蓋文件是純文本,每行一個十六進制 PC,例如:0xffffffff8398658d 0xffffffff839862fc 0xffffffff8398633f除/rawcover端點外,syz-cover.go的注釋還指出原始覆蓋文件也可以來自帶-coverfile標志的syz-execprog。生成 HTML 報告./bin/syz-cover --config location of your syzkaller config rawcover--config指向 syzkaller 的 manager 配置文件,其余參數(shù)是原始覆蓋文件(支持多個,syz-cover -config config_file rawcover.file*)。不提供覆蓋文件時,syz-cover會使用rg.Symbols中記錄的全部PC 生成“全量覆蓋”視圖。默認行為是把 HTML 報告寫入臨時文件并調(diào)用xdg-open在瀏覽器中打開(見 tools/syz-cover/syz-cover.go 的main函數(shù))。導出函數(shù)級覆蓋 CSV./bin/syz-cover --config location of your syzkaller config --csv filename where to export rawcoverCSV 列頭由 pkg/cover/html.go 的DoCSV定義,為:Module, Filename, Function, Covered PCs, Total PCs,即每個函數(shù)的已覆蓋/總覆蓋點數(shù)。導出行級覆蓋 JSON./bin/syz-cover --config location of your syzkaller config --json filename where to export rawcover對應DoLineJSON,輸出每個源文件的行級信息,結構為lineCoverExport:Module、Filename:所屬模塊與文件;Covered:完全覆蓋的行號列表;Uncovered:未覆蓋的行號列表;Both:同一行同時存在已執(zhí)行與未執(zhí)行 PC 值的行號列表。除文檔提到的--csv、--json外,從 tools/syz-cover/syz-cover.go 的 flag 定義看,syz-cover還支持:--jsonl(導出 JSONL 格式的逐 frame 覆蓋數(shù)據(jù),含文件、函數(shù)、行列范圍與命中次數(shù))、--html(把 HTML 報告保存到指定文件而不彈瀏覽器)、--modules(提供從 manager/modules端點獲取的模塊 JSON 信息,用于內(nèi)核模塊的符號化)。小結:把覆蓋率當作進度信號來用綜合 docs/coverage.md 與其指向的 docs/linux/coverage.md,syzkaller 覆蓋率體系可以歸納為一條鏈路:編譯期插樁(__sanitizer_cov_trace_pc等覆蓋點)→ 運行期采集(kcov/sanitizer 上報 PC)→ 符號化(binutils 把 PC 映射回符號與源碼行)→ 聚合展示(目錄樹/文件/函數(shù)三級百分比與行級著色)→ 離線導出(syz-cover的 HTML/CSV/JSON)。理解 coverage point 與源碼行之間的“非一一對應”關系,是正確解讀報告中每一種顏色與百分比數(shù)字的前提;而/rawcoversyz-cover的組合則讓你在syz-manager之外也能復現(xiàn)并分享完整的覆蓋率報告。贊分享測試操作系統(tǒng)網(wǎng)絡安全【免費下載鏈接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer項目地址https://gitcode.com/gh_mirrors/syz/syzkaller點擊查看免費下載相關推薦syzkaller 覆蓋率采集與報告指南KCOV、Sanitizer Coverage 與 syz-cover 全解析syzkaller 覆蓋率采集與報告指南KCOV、Sanitizer Coverage 與 syz cover 全解析 syzkaller 是內(nèi)核模糊測試工具網(wǎng)絡安全開發(fā)工具質(zhì)量保障ipatool的代碼覆蓋率報告使用Cover工具ipatool的代碼覆蓋率報告使用Cover工具 代碼覆蓋率是衡量測試質(zhì)量的關鍵指標它能幫助開發(fā)者發(fā)現(xiàn)未被測試覆蓋的代碼區(qū)域。ipatool作為一款iOSCLI開發(fā)工具Git LFS Go代碼覆蓋率使用cover工具生成報告Git LFS Go代碼覆蓋率使用cover工具生成報告 1. 環(huán)境準備與依賴安裝 Git LFSLarge File Storage大文件存儲是Git開發(fā)工具CLI版本控制上一篇Eino流式處理4大范式詳解Invoke、Stream、Collect與Transform實戰(zhàn)指南下一篇終極指南如何一鍵批量下載網(wǎng)頁資源并保持完整文件夾結構創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考