村政府可以做網(wǎng)站么企業(yè)宣傳冊
本文由Bruno Oliveira于2024年4月25日發(fā)表于IncludeSec的官方網(wǎng)站上。作為IncludeSec的安全研究人員,在他們?nèi)粘5陌踩珜徲?jì)和滲透測試工作中,有時(shí)需要為客戶開發(fā)一些模糊測試工具。在安全評估方法中使用模糊測試技術(shù),可以有效地在復(fù)雜的現(xiàn)代化軟件產(chǎn)品中發(fā)現(xiàn)和識別安全漏洞,并為應(yīng)用程序快速提供高度結(jié)構(gòu)化的輸入數(shù)據(jù)。
當(dāng)我們的客戶要求在手動(dòng)和傳統(tǒng)自動(dòng)化測試之外進(jìn)行更全面的工作,以提供額外的分析來發(fā)現(xiàn)更復(fù)雜的漏洞時(shí),通常會(huì)應(yīng)用此技術(shù)。在這篇文章中,我們將跟大家介紹于模糊測試相關(guān)的內(nèi)容,并詳細(xì)闡述如何通過擴(kuò)展指令增強(qiáng)基于覆蓋引導(dǎo)的模糊測試。
介紹
基于覆蓋引導(dǎo)的模糊測試是很多高級模糊測試工具所使用的一種十分有用的功能,例如AFL、libFuzzer和Fuzzilli等。這種功能允許模糊測試工具確認(rèn)一個(gè)輸入是否能夠在源程序路徑中發(fā)現(xiàn)新的邊或執(zhí)行分支。在控制流圖(CFG)中,一個(gè)邊連接兩個(gè)分支。比如說,如果一個(gè)輯條件涉及if-else語句,則會(huì)有兩條邊,一條用于if,另一條用于else語句。它是模糊測試過程中的重要組成部分,有助于確定模糊測試工具是否有效地覆蓋了目標(biāo)程序的可執(zhí)行代碼。
引導(dǎo)模糊測試通常會(huì)使用基于覆蓋引導(dǎo)的模糊測試(CGF)技術(shù),這種技術(shù)會(huì)使用非?;镜闹噶顏硎占钄?shù)據(jù),以識別在模糊測試用力的執(zhí)行過程中是否命中了新的邊或代碼塊。
這種指令指的是在程序編譯過程中添加的代碼,這些代碼的功能非常豐富,包括軟件調(diào)試在內(nèi)。
本文我們將以JerryScript(包含了一個(gè)已知且公開的漏洞)為例,介紹如何使用相關(guān)技術(shù)來擴(kuò)展Fuzzili的檢測以提升漏洞識別效率,并為模糊測試工具提供更有價(jià)值的數(shù)據(jù)以進(jìn)行進(jìn)一步的測試。
模糊測試
模糊測試指的是向目標(biāo)應(yīng)用程序提供一系列隨機(jī)輸入以嘗試觸發(fā)應(yīng)用程序非預(yù)期行為的過程。根據(jù)最新的模糊測試方法,很多模糊測試工具會(huì)考慮目標(biāo)應(yīng)用程序的多個(gè)方面以生成更合適測試場景的輸入數(shù)據(jù)。其中一個(gè)考慮因素就是種子,即生成輸入數(shù)據(jù)的源。某些現(xiàn)代軟件的結(jié)構(gòu)比較復(fù)雜,我們無法通過簡單的輸入來獲取期望的結(jié)果。換言之,也就是無法通過簡單的輸入對目標(biāo)應(yīng)用程序產(chǎn)生足夠的影響,這樣也就難以發(fā)現(xiàn)潛在的安全漏洞。
下圖中顯示的是帶有變異策略和代碼覆蓋功能的模糊測試程序的通用基本結(jié)構(gòu):

1、選擇種子;
2、變異過程需要獲取種子作為初始的執(zhí)行輸入;
3、程序執(zhí)行;
4、觸發(fā)漏洞,或者...;
5、輸入命中了目標(biāo)程序中的一個(gè)新的邊,模糊測試工具繼續(xù)對種子執(zhí)行變異操作,或者...;
6、輸入沒有命中新的邊,模糊測試工具選擇一個(gè)新的種子執(zhí)行變異;
代碼覆蓋率可以讓模糊測試工具在目標(biāo)應(yīng)用程序執(zhí)行過程中發(fā)現(xiàn)新的邊或代碼塊,有助于識別輸入是否能夠抵達(dá)目標(biāo)應(yīng)用程序的各個(gè)部分。
下圖所示為Fuzzilli在對樣本進(jìn)行處理和變異時(shí)所使用的算法:

Clang
Clang是一款針對C、C++、Objective-C和Objective-C++編程語言的編譯器,該編譯器屬于LLVM項(xiàng)目的一個(gè)部分,可以提供比GCC這種傳統(tǒng)編譯器更強(qiáng)大的功能。
Clang編譯器中很重要的一個(gè)工具就是數(shù)據(jù)清洗器(Sanitizer),Sanitizer可以被視作一種安全庫或工具,可以通過檢查目標(biāo)代碼來自動(dòng)檢測安全漏洞。啟用了Sanitizer之后,編譯器會(huì)自動(dòng)檢查編譯后的代碼是否存在安全問題。
常見的Sanitizer包括:
1、AddressSanitizer (ASAN);
2、UndefinedBehaviorSanitizer (UBSAN);
3、MemorySanitizer (MSAN);
4、ThreadSanitizer (TSAN);
5、LeakSanitizer (LSAN);
下面給出的Shell代碼段顯示了如何使用ASAN選項(xiàng)在代碼編譯過程中跟蹤程序計(jì)數(shù)器:
$ clang -o targetprogram -g -fsanitize=address -fsanitize-coverage=trace-pc-guard targetprogram.c
根據(jù)Clang文檔的描述,LLVM內(nèi)置了一個(gè)簡單的代碼覆蓋指令,可以向用戶定義的函數(shù)插入函數(shù)調(diào)用,并提供了回調(diào)的默認(rèn)實(shí)現(xiàn),從而實(shí)現(xiàn)了簡單的覆蓋率報(bào)告和可視化。
比如說,Fuzzilli(Google的JavaScript引擎模糊測試工具)就使用了簡單的指令來響應(yīng)Fuzzilli的進(jìn)程,具體如下代碼段所示:
extern "C" void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {uint32_t index = *guard;__shmem->edges[index / 8] |= 1 << (index % 8);*guard = 0;}
當(dāng)找到一個(gè)新的邊時(shí),__sanitizer_cov_trace_pc_guard()函數(shù)會(huì)持續(xù)執(zhí)行,因此無需任何條件來處理新的邊被發(fā)現(xiàn)時(shí)要做什么。接下來,函數(shù)會(huì)將共享位圖中的__shmem->edges設(shè)置為1,Fuzzilli會(huì)在執(zhí)行后對位圖進(jìn)行分析。
其他工具,比如說LLVM-COV,能夠靜態(tài)地捕獲代碼覆蓋率信息,在執(zhí)行之后提供人類可讀的文檔。但是,需要高效讀取磁盤中文檔的模糊測試工具,可能會(huì)影響性能。
獲取更多的信息
我們可以修改Fuzzilli的指令,并觀察__sanitizer_cov_trace_pc_guard()能夠給代碼覆蓋率帶來什么其他的東西。下列代碼段演示了我們對Fuzzilli指令的部分修改:
extern "C" void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {uint32_t index = *guard;void *PC = __builtin_return_address(0);char PcDescr[1024];__sanitizer_symbolize_pc(PC, "%p %F %L", PcDescr, sizeof(PcDescr));printf("guard: %p %x PC %s\n", guard, *guard, PcDescr);__shmem->edges[index / 8] |= 1 << (index % 8);*guard = 0;}
我們已經(jīng)知道的是,__sanitizer_cov_trace_pc_guard()函數(shù)在每次程序命中新的邊時(shí)便會(huì)執(zhí)行。此時(shí),我們可以利用__builtin_return_address()函數(shù)來收集每一個(gè)命中的新的邊所返回的地址。現(xiàn)在,PC指針已經(jīng)獲取到了返回的地址信息。我們可以利用__sanitizer_symbolize_pc()函數(shù)來將地址與符號相關(guān)聯(lián),從而提供有關(guān)執(zhí)行過程中所使用的源代碼文件的更多信息。
大多數(shù)模糊測試工具只會(huì)使用邊的信息來引導(dǎo)模糊測試。然而,正如我們接下來會(huì)給大家演示的那樣,我們可以使用Sanitizer接口來為安全評估提供更多有價(jià)值的信息。
動(dòng)手實(shí)操
在我們的演示過程中,我們將利用一個(gè)舊版本的JerryScript JavaScript引擎來創(chuàng)建一個(gè)環(huán)境,環(huán)境信息如下:
1、操作系統(tǒng)(OS):Ubuntu 22.04;
2、目標(biāo)程序:JerryScript;
3、漏洞:CVE-2023-36109;
環(huán)境搭建
我們可以使用下列命令構(gòu)建JerryScript,首先克隆項(xiàng)目代碼庫:
$ git clone https://github.com/jerryscript-project/jerryscript.git
切換到JerryScript目錄,并校驗(yàn)8ba0d1b6ee5a065a42f3b306771ad8e3c0d819bc commit:
$ git checkout 8ba0d1b6ee5a065a42f3b306771ad8e3c0d819bc
然后應(yīng)用Fuzziilli庫提供的修補(bǔ)程序:
$ cd jerry-main$ wget https://github.com/googleprojectzero/fuzzilli/raw/main/Targets/Jerryscript/Patches/jerryscript.patch$ patch < jerryscript.patchpatching file CMakeLists.txtpatching file main-fuzzilli.cpatching file main-fuzzilli.hpatching file main-options.cpatching file main-options.hpatching file main-unix.c
Fuzziilli修補(bǔ)程序提供的指令文件為jerry-main/main-fuzzilli.c,其中也包含了簡單的代碼覆蓋功能,但這還遠(yuǎn)遠(yuǎn)不夠。因此 ,我們還需要像之前一樣在編譯代碼之前更新__sanitizer_cov_trace_pc_guard()函數(shù)。除此之外,還需要將下列Header添加到j(luò)erry-main/main-fuzzilli.c文件中:
void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {uint32_t index = *guard;if(!index) return;index--;void *PC = __builtin_return_address(0);char PcDescr[1024];__sanitizer_symbolize_pc(PC, "%p %F %L", PcDescr, sizeof(PcDescr));printf("guard: %p %x PC %s\n", (void *)guard, *guard, PcDescr);__shmem->edges[index / 8] |= 1 << (index % 8);*guard = 0;}
我們現(xiàn)在更改編譯配置并禁用strip,這些符號僅用于識別我們演示中可能存在的易受攻擊功能。修改根目錄中的CMakeLists.txt文件:
# Strip binaryif(ENABLE_STRIP AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug")jerry_add_link_flags(-g)endif()
確保jerry-main/CMakeLists.txt包含了main-fuzzilli.c文件之后,我們就可以準(zhǔn)備編譯代碼并使用Fuzzilli指令完成構(gòu)建了:
$ python jerryscript/tools/build.py --compile-flag=-fsanitize-coverage=trace-pc-guard --profile=es2015-subset --lto=off --compile-flag=-D_POSIX_C_SOURCE=200809 --compile-flag=-Wno-strict-prototypes --stack-limit=15
如果你安裝了Clang,但CMAKE_C_COMPILER_ID卻顯示 GNU或其他內(nèi)容的話,你可能構(gòu)建過程出錯(cuò)了:
$ python tools/build.py --compile-flag=-fsanitize-coverage=trace-pc-guard --profile=es2015-subset --lto=off --compile-flag=-D_POSIX_C_SOURCE=200809 --compile-flag=-Wno-strict-prototypes --stack-limit=15-- CMAKE_BUILD_TYPE ??????????????MinSizeRel-- CMAKE_C_COMPILER_ID ???????????GNU-- CMAKE_SYSTEM_NAME ?????????????Linux-- CMAKE_SYSTEM_PROCESSOR ????????x86_64
你可以直接修改CMakeLists.txt文件中的28-42行,通過將USING_GCC 1修改為USING_CLANG 1來強(qiáng)制使用Clang:
# Determining compilerif(CMAKE_C_COMPILER_ID MATCHES "GNU")set(USING_CLANG 1)endif()if(CMAKE_C_COMPILER_ID MATCHES "Clang")set(USING_CLANG 1)endif()
構(gòu)建出的代碼路徑為“build/bin/jerry”。
測試執(zhí)行
首先,我們先禁用掉ASLR:
$ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
測試完成后,我們可以通過將值設(shè)置為2來重新啟用ASLR:
$ echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
現(xiàn)在,我們可以先嘗試跟蹤源碼文件的地址,禁用ASLR將有助于我們在分析過程中不受干擾,且不會(huì)影響我們的結(jié)果。
現(xiàn)在,我們使用針對CVE-2023-36109的PoC文件來執(zhí)行JerryScript,并嘗試觸發(fā)漏洞。根據(jù)漏洞描述,該漏洞位于jerry-core/ecma/base/ecma-helpers-string.c文件的ecma_stringbuilder_append_raw函數(shù)中,具體如下所示:
$ ./build/bin/jerry ./poc.js[...]guard: 0x55e17d12ac88 7bb PC 0x55e17d07ac6b in ecma_string_get_ascii_size ecma-helpers-string.cguard: 0x55e17d12ac84 7ba PC 0x55e17d07acfe in ecma_string_get_ascii_size ecma-helpers-string.cguard: 0x55e17d12ac94 7be PC 0x55e17d07ad46 in ecma_string_get_size (/jerryscript/build/bin/jerry+0x44d46) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12e87c 16b8 PC 0x55e17d09dfe1 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x67fe1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12ae04 81a PC 0x55e17d07bb64 in ecma_stringbuilder_append_raw (/jerryscript/build/bin/jerry+0x45b64) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12e890 16bd PC 0x55e17d09e053 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x68053) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12e8b8 16c7 PC 0x55e17d09e0f1 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x680f1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d133508 29db PC 0x55e17d0cc292 in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x96292) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d133528 29e3 PC 0x55e17d0cc5bd in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x965bd) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12f078 18b7 PC 0x55e17d040a78 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xaa78) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12f088 18bb PC 0x55e17d040ab4 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xaab4) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12f08c 18bc PC 0x55e17d040c26 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xac26) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)guard: 0x55e17d12f094 18be PC 0x55e17d040ca3 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xaca3) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)UndefinedBehaviorSanitizer:DEADLYSIGNAL==27636==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x55e27da7950c (pc 0x7fe341fa092b bp 0x000000000000 sp 0x7ffc77634f18 T27636)==27636==The signal is caused by a READ memory access.#0 0x7fe341fa092b ?string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513#1 0x55e17d0cc3bb in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x963bb) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#2 0x55e17d09e103 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x68103) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#3 0x55e17d084a23 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4ea23) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#4 0x55e17d090ddc in ecma_op_function_call_native ecma-function-object.c#5 0x55e17d0909c1 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a9c1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#6 0x55e17d0d4743 in ecma_builtin_string_prototype_object_replace_helper ecma-builtin-string-prototype.c#7 0x55e17d084a23 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4ea23) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#8 0x55e17d090ddc in ecma_op_function_call_native ecma-function-object.c#9 0x55e17d0909c1 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a9c1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#10 0x55e17d0b929f in vm_execute (/jerryscript/build/bin/jerry+0x8329f) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#11 0x55e17d0b8d4a in vm_run (/jerryscript/build/bin/jerry+0x82d4a) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#12 0x55e17d0b8dd0 in vm_run_global (/jerryscript/build/bin/jerry+0x82dd0) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#13 0x55e17d06d4a5 in jerry_run (/jerryscript/build/bin/jerry+0x374a5) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#14 0x55e17d069e32 in main (/jerryscript/build/bin/jerry+0x33e32) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)#15 0x7fe341e29d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16#16 0x7fe341e29e3f in __libc_start_main csu/../csu/libc-start.c:392:3#17 0x55e17d0412d4 in _start (/jerryscript/build/bin/jerry+0xb2d4) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)UndefinedBehaviorSanitizer can not provide additional info.SUMMARY: UndefinedBehaviorSanitizer: SEGV string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513==27636==ABORTING
通過使用這種技術(shù),我們可以識別出ecma_stringbuilder_append_raw()中漏洞存在根本原因的棧地址。
如果我們僅僅依賴于Sanitizer來檢測堆棧記錄的話,我們將無法在輸出中看到存在漏洞的函數(shù)名稱:
$ ./build/bin/jerry ./poc.js[COV] no shared memory bitmap available, skipping[COV] edge counters initialized. Shared memory: (null) with 14587 edgesUndefinedBehaviorSanitizer:DEADLYSIGNAL==54331==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x5622ae01350c (pc 0x7fc1925a092b bp 0x000000000000 sp 0x7ffed516b838 T54331)==54331==The signal is caused by a READ memory access.#0 0x7fc1925a092b ?string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513#1 0x5621ad66636b in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x9636b) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#2 0x5621ad6380b3 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x680b3) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#3 0x5621ad61e9d3 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4e9d3) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#4 0x5621ad62ad8c in ecma_op_function_call_native ecma-function-object.c#5 0x5621ad62a971 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a971) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#6 0x5621ad66e6f3 in ecma_builtin_string_prototype_object_replace_helper ecma-builtin-string-prototype.c#7 0x5621ad61e9d3 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4e9d3) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#8 0x5621ad62ad8c in ecma_op_function_call_native ecma-function-object.c#9 0x5621ad62a971 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a971) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#10 0x5621ad65324f in vm_execute (/jerryscript/build/bin/jerry+0x8324f) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#11 0x5621ad652cfa in vm_run (/jerryscript/build/bin/jerry+0x82cfa) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#12 0x5621ad652d80 in vm_run_global (/jerryscript/build/bin/jerry+0x82d80) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#13 0x5621ad607455 in jerry_run (/jerryscript/build/bin/jerry+0x37455) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#14 0x5621ad603e32 in main (/jerryscript/build/bin/jerry+0x33e32) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)#15 0x7fc192429d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16#16 0x7fc192429e3f in __libc_start_main csu/../csu/libc-start.c:392:3#17 0x5621ad5db2d4 in _start (/jerryscript/build/bin/jerry+0xb2d4) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)UndefinedBehaviorSanitizer can not provide additional info.SUMMARY: UndefinedBehaviorSanitizer: SEGV string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513==54331==ABORTING
總結(jié)
在這篇文章中,我們演示了如何通過擴(kuò)展Fuzzilli的指令來對目標(biāo)應(yīng)用程序的棧進(jìn)行實(shí)施跟蹤,以更好地了解返回地址信息以及相關(guān)的源代碼文件信息,從而給模糊測試工具提供更多的路徑,最終產(chǎn)生更多有價(jià)值的測試結(jié)果。
參考資料
Not All Coverage Measurements Are Equal: Fuzzing by Coverage Accounting for Input Prioritization - NDSS Symposium
Clang C Language Family Frontend for LLVM
SanitizerCoverage — Clang 19.0.0git documentation
GitHub - googleprojectzero/fuzzilli: A JavaScript Engine Fuzzer
fuzzilli/Targets/Jerryscript/Patches/jerryscript.patch at main · googleprojectzero/fuzzilli · GitHub
GitHub - Limesss/CVE-2023-36109: a poc for cve-2023-36109
參考鏈接
Coverage Guided Fuzzing - Extending Instrumentation to Hunt Down Bugs Faster! - Include Security Research Blog