<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          親測(cè)體驗(yàn)Go語言模糊測(cè)試

          共 6194字,需瀏覽 13分鐘

           ·

          2024-03-26 07:00


          何為 模糊測(cè)試 (Fuzz Testing)?


          模糊測(cè)試是一種自動(dòng)化的軟件測(cè)試技術(shù),它通過向程序提供無效、意外或隨機(jī)的數(shù)據(jù)作為輸入來檢測(cè)軟件中的錯(cuò)誤、漏洞或失敗。這種測(cè)試方法的目的是找到程序處理意外或異常輸入時(shí)可能會(huì)崩潰或表現(xiàn)出異常行為的地方。

          模糊測(cè)試已成為軟件開發(fā)和安全領(lǐng)域的一個(gè)重要組成部分。對(duì)很多基礎(chǔ)軟件,金融類軟件,安全圈子的各位"師傅"們,可能在跑著若干Fuzz Testing以尋找漏洞。


          作用


          1. 發(fā)現(xiàn)安全漏洞:如緩沖區(qū)溢出、內(nèi)存泄漏、注入攻擊等,這些通常在正常的測(cè)試用例中可能被忽略。

          2. 增強(qiáng)軟件穩(wěn)定性:幫助開發(fā)者識(shí)別和修復(fù)導(dǎo)致程序崩潰或行為異常的代碼。

          3. 驗(yàn)證輸入驗(yàn)證:確保程序能夠適當(dāng)?shù)靥幚聿缓弦?guī)格的輸入。

          4. 自動(dòng)化測(cè)試:模糊測(cè)試可以自動(dòng)進(jìn)行,覆蓋更廣泛的測(cè)試用例。


          步驟


          模糊測(cè)試通常包括以下步驟:

          1. 生成測(cè)試用例:使用隨機(jī)化或一些算法生成大量不同的輸入數(shù)據(jù)。

          2. 執(zhí)行程序:將這些測(cè)試用例作為輸入提供給待測(cè)試的程序。

          3. 監(jiān)控程序行為:檢測(cè)程序崩潰、功能失敗、代碼異常執(zhí)行等問題。

          4. 分析結(jié)果:如果程序在處理某個(gè)輸入時(shí)失敗,分析其原因并報(bào)告。


          語料庫來源


          語料庫是模糊測(cè)試中使用的一組數(shù)據(jù),用于生成測(cè)試用例。通常來自以下來源:

          1. 現(xiàn)有的測(cè)試用例:利用已有的測(cè)試數(shù)據(jù)作為基礎(chǔ),通過變異生成新的測(cè)試用例。

          2. 實(shí)際數(shù)據(jù)樣本:從生產(chǎn)環(huán)境或?qū)嶋H應(yīng)用場(chǎng)景中提取的數(shù)據(jù),以確保測(cè)試用例接近真實(shí)世界的情況。

          3. 開源數(shù)據(jù)集:特定領(lǐng)域的開源數(shù)據(jù)集,例如網(wǎng)絡(luò)協(xié)議、文件格式等。

          4. 隨機(jī)生成的數(shù)據(jù):完全隨機(jī)或遵循特定模式和規(guī)則生成的數(shù)據(jù)。

          5. 專門的工具和庫:一些工具和庫專門設(shè)計(jì)用來生成用于模糊測(cè)試的語料庫,例如 AFL(American Fuzzy Lop)和 LibFuzzer。


          使用模糊測(cè)試的注意事項(xiàng)


          • 資源消耗:模糊測(cè)試可能需要大量計(jì)算資源和時(shí)間。

          • 誤報(bào),即假陽性:可能會(huì)產(chǎn)生大量的假陽性結(jié)果,報(bào)告了非問題或不重要的問題。

          • 測(cè)試覆蓋范圍:雖然可以發(fā)現(xiàn)很多問題,但不能保證完全的代碼覆蓋率,因此應(yīng)與其他測(cè)試方法結(jié)合使用。


          Go語言模糊測(cè)試


          Go Fuzzing 由發(fā)布于2022年3月份的Go 1.18版本引入,迄今已近兩年。但感覺總體關(guān)注度不太高,多半是因?yàn)?.18中眾所期待的泛型,掩過了其風(fēng)頭。

          類似Rob Pike曾在泛型發(fā)布前夕,提issue建議放慢節(jié)奏。印象里,大佬也曾對(duì)Go Fuzzing "毒舌"過: 這東西有何意義? 就是找一百萬只猴子,在鍵盤前隨機(jī)敲打?

          事實(shí)上,包括單元測(cè)試在內(nèi)的諸多測(cè)試,都可以認(rèn)為是白盒測(cè)試---我知道邏輯,構(gòu)造輸入并驗(yàn)證預(yù)期結(jié)果和實(shí)際輸出是否一致. 但難免有很多犄角旮旯的邊角情況考慮不到,模糊測(cè)試恰好彌補(bǔ)了這一點(diǎn),可以認(rèn)為是一種黑盒測(cè)試.

          關(guān)于Go Fuzzing,,繞不開dvyukov[1],他也是Go調(diào)度器的開發(fā)者,Google員工(但不在Go Team). 其最早提了加入fuzz test的提案,自己也有一個(gè)很有名的項(xiàng)目 dvyukov/go-fuzz[2],,并用此工具找出了標(biāo)準(zhǔn)庫上百個(gè)錯(cuò)誤[3]..

          github.com/google下面也有一個(gè)類似的項(xiàng)目 github.com/google/gofuzz[4], 不過已經(jīng)很久沒維護(hù)了~


          另外, github.com/google/syzkaller[5]  這個(gè)項(xiàng)目也是他重度參與的:

          syzkaller is an unsupervised coverage-guided kernel fuzzer , 是一個(gè)針對(duì)部分操作系統(tǒng)內(nèi)核的 fuzzer工具...這個(gè)在安全圈使用很多,用來挖內(nèi)核漏洞...

          內(nèi)核fuzz工具Syzkaller使用方法的簡(jiǎn)單介紹 [6]


          2022年之前的文章,基本都是講dvyukov寫的這個(gè)第三方庫go-fuzz怎么用,而不是go官方的(因?yàn)楫?dāng)時(shí)還沒有集成進(jìn)去)

          關(guān)于Go的模糊測(cè)試,更多可以參考TonyBai老師的這篇文章:

          Go 1.18新特性前瞻:原生支持Fuzzing測(cè)試 [7]

          以及

          你需要了解的 Go 中的模糊測(cè)試 | Linux 中國


          親測(cè)體驗(yàn)


          先寫一個(gè)Multiply函數(shù),返回 a 和 b 的乘積,但故意有一個(gè) bug

          main.go:

                
                package main

          import "fmt"

          // Multiply 返回 a 和 b 的乘積
          func Multiply(a, b int) int {
              // 故意引入的 bug: 當(dāng) a 和 b 都是負(fù)數(shù)時(shí),返回錯(cuò)誤的結(jié)果
              if a < 0 && b < 0 {
                  return a + b
              }
              return a * b
          }

          func main() {
              fmt.Println("Multiply 3 and 4:", Multiply(34))
          }

          再寫一個(gè)單元測(cè)試,但這個(gè)測(cè)試無法捕捉到上述的 bug:

          main_test.go:

                
                package main

          import "testing"

          func TestMultiply(t *testing.T) {
              testCases := []struct {
                  a, b, expected int
              }{
                  {3412},
                  {-34-12},
                  {000},
              }

              for _, tc := range testCases {
                  if res := Multiply(tc.a, tc.b); res != tc.expected {
                      t.Errorf("Multiply(%d, %d) = %d; expected %d", tc.a, tc.b, res, tc.expected)
                  }
              }
          }

          單測(cè)屬于白盒測(cè)試,如果編寫者沒有考慮到 a 和 b 都是負(fù)數(shù)的情況,則這個(gè)單元測(cè)試將會(huì)通過,無法捕捉到這個(gè) bug。

          ea51f0fac20968f313582f2bf09aabb7.webp

          再編寫一個(gè)模糊測(cè)試來捕捉單測(cè)未發(fā)現(xiàn)的 Bug

          模糊測(cè)試是一種自動(dòng)化測(cè)試技術(shù),用于生成隨機(jī)輸入數(shù)據(jù)來測(cè)試程序。在 Go 中,可以使用 testing 包提供的 Fuzz 功能來實(shí)現(xiàn)模糊測(cè)試。這需要 Go 1.18 或更高版本。

                
                package main

          import "testing"


          func FuzzMultiply(f *testing.F) {
           testCases := []struct {
            a, b int
           }{
            {34},
            {-34},
            {00},
           }

           for _, tc := range testCases {
            f.Add(tc.a, tc.b) // 添加已知的測(cè)試用例(這段內(nèi)容也可以去掉)
           }

           f.Fuzz(func(t *testing.T, a, b int) {
            // 這里,a 和 b 是隨機(jī)生成的
            expected := a * b
            if res := Multiply(a, b); res != expected {
             t.Errorf("Multiply(%d, %d) = %d; expected %d", a, b, res, expected)
            }
           })
          }

          這段模糊測(cè)試將生成隨機(jī)的 ab 值,并用其來測(cè)試 Multiply 函數(shù)。如果 Multiply 函數(shù)的實(shí)現(xiàn)有 bug,這個(gè)模糊測(cè)試很可能會(huì)揭露


          通過以下命令 運(yùn)行模糊測(cè)試:

                
                go test -fuzz=Fuzz

          模糊測(cè)試將不斷生成新的隨機(jī)輸入,并很快揭示故意引入的 bug:

          9c58c062cf9c0945a1a5dc37771a0af4.webp

          輸出信息會(huì)顯示FAIL,并輸出導(dǎo)致錯(cuò)誤的用例.

          還會(huì)生成一個(gè)testdata目錄,其中會(huì)生成一個(gè)fuzz/FuzzMultiply目錄,里面有一個(gè)隨機(jī)文件,內(nèi)容也是導(dǎo)致錯(cuò)誤的用例.


          另外, go test -fuzz會(huì)先進(jìn)行普通TestXxx的用例執(zhí)行,之后才會(huì)執(zhí)行FuzzXxx。

          fuzz testing默認(rèn)會(huì)一直執(zhí)行下去,直到遇到crash。

          比如修復(fù)Multiply中故意引入的這個(gè)bug,再執(zhí)行,就會(huì)一直執(zhí)行下去

          5d23d1c3a26d329193330547ec562b28.webp

          如果要限制fuzz testing的執(zhí)行時(shí)間,可以使用-fuzztime,如下面的命令只允許fuzz testing執(zhí)行10s:

          go test -fuzz=Fuzz -fuzztime 10s

          d40ba5d268a5f529fccf495c525c4d7a.webp

          go test -fuzz=Fuzz會(huì)運(yùn)行項(xiàng)目目錄下所有以 Fuzz 開頭的 Fuzz 測(cè)試函數(shù).

          如果想精確指定運(yùn)行某個(gè) Fuzz 測(cè)試函數(shù),如此處的FuzzMultiply, 可以使用

          go test -v ./ -run Fuzz.+ -fuzz=FuzzMultiply


          當(dāng)然,真實(shí)項(xiàng)目中的bug,不會(huì)如此低級(jí),邏輯會(huì)更復(fù)雜,隱藏得更深,模糊測(cè)試花費(fèi)的時(shí)間也會(huì)更多.

          可以肯定,此時(shí)此刻,針對(duì)某些知名的廣泛使用的項(xiàng)目,正以月,以年為單位,曠日持久得在很多機(jī)器上跑著模糊測(cè)試,以期能捕獲很難直觀發(fā)現(xiàn)的 bug。


          參考資料 [1]

          dvyukov: https://github.com/dvyukov

          [2]

          dvyukov/go-fuzz: https://github.com/dvyukov/go-fuzz

          [3]

          標(biāo)準(zhǔn)庫上百個(gè)錯(cuò)誤: https://github.com/dvyukov/go-fuzz#trophies

          [4]

          github.com/google/gofuzz: https://github.com/google/gofuzz

          [5]

          github.com/google/syzkaller: https://github.com/google/syzkaller

          [6]

          內(nèi)核fuzz工具Syzkaller使用方法的簡(jiǎn)單介紹: https://www.bilibili.com/video/BV1gL4y1j7Cs

          [7]

          Go 1.18新特性前瞻:原生支持Fuzzing測(cè)試: https://tonybai.com/2021/12/01/first-class-fuzzing-in-go-1-18/

          推薦閱讀:

          我是如何實(shí)現(xiàn)Go性能5倍提升的?

          「GoCN酷Go推薦」我用go寫了魔獸世界登錄器?

          Go區(qū)不大,創(chuàng)造神話,科目三殺進(jìn)來了

          Go 1.22新特性前瞻

          這些流行的K8S工具,你都用上了嗎 ?


          想要了解Go更多內(nèi)容,歡迎掃描下方??關(guān)注公眾號(hào), 回復(fù)關(guān)鍵詞 [實(shí)戰(zhàn)群]   ,就有機(jī)會(huì)進(jìn)群和我們進(jìn)行交流



          分享、在看與點(diǎn)贊Go  9f907a5b15e672119a5ce4c3e188d424.webp
          瀏覽 43
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉97超碰 | 啊啊啊啊啊在线观看 | 欧美一级黄色片子 | 日韩高清一区二区 | 中文字幕高清无码视频 |