av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

AFL實(shí)戰(zhàn):測試sudo提權(quán)漏洞CVE-2021-3156

最近sudo發(fā)現(xiàn)了一個(gè)嚴(yán)重的緩存溢出提權(quán)漏洞CVE-2021-3156,這很正常。不正常的是這個(gè)漏洞已經(jīng)潛伏了10年之久,為什么10年才發(fā)現(xiàn)呢?如果用常規(guī)的測試方法需要多久才能發(fā)現(xiàn)?對此有人進(jìn)行了Fuzz測試,請和蟲蟲一起學(xué)習(xí)一下過程。

概述

在本文試驗(yàn)中,使用了AFL模糊器。AFL模糊器(American Fuzzy lop)是一種面向安全的模糊器,AFL使用新型編譯時(shí)檢測和遺傳算法,自動(dòng)發(fā)現(xiàn)干凈有趣的測試用例,這些用例會在目標(biāo)二進(jìn)制文件中觸發(fā)新的內(nèi)部狀態(tài)。用這樣的方法可以大大改善了模糊代碼的功能覆蓋范圍。

AFL模糊器生成的緊湊的合成語料庫還可以用于復(fù)現(xiàn)其他測試人員更耗費(fèi)人力或資源的測試方案。

測試準(zhǔn)備

sudo是setuid二進(jìn)制文件,以root用戶隨機(jī)輸入運(yùn)行潛在錯(cuò)誤的二進(jìn)制文件不是最安全的方法。為了避免任何潛在的意外系統(tǒng)損壞,此設(shè)置試驗(yàn)中使用了虛擬機(jī)環(huán)境。并選擇最近一個(gè)涉及漏洞sudo版本sudo 1.9.5.p1。

AFL旨在將輸出生成到文件或stdout中,但是要模糊命令行參數(shù)。因此,需要自行修補(bǔ)sudo,忽略實(shí)際的argv并將其改為從stdin。

AFL提供了一個(gè)可以提供這樣功能的argv-fuzz-inl.h:

示例argv-fuzz-inl.h從stdin讀取NUL分隔的參數(shù)。注意,sudo在單個(gè)二進(jìn)制文件中同時(shí)提供了sudo和sudoedit實(shí)用程序,因此要測試兩者,還需要向fuzzer公開argv[0]。輸入的代碼argv-fuzz-inl.h不會執(zhí)行此操作,因此需要對其進(jìn)行修復(fù):

 
 
 
 
  1. int rc = 0; /* start at argv[0] */

sudo本身補(bǔ)丁很簡單,只需在main的開頭連接AFL_INIT_ARGV即可:

 
 
 
 
  1. --- a/src/sudo.c
  2. +++ b/src/sudo.c
  3. @@ -66,6 +66,8 @@
  4. #include "sudo_plugin.h"
  5. #include "sudo_plugin_int.h"
  6. +#include "argv-fuzz-inl.h"
  7. +
  8. /*
  9. * Local variables
  10. */
  11. @@ -149,6 +151,7 @@ sudo_dso_public int main(int argc, char *argv[], char *envp[]);
  12. int
  13. main(int argc, char *argv[], char *envp[])
  14. {
  15. +AFL_INIT_ARGV();
  16. int nargc, status = 0;
  17. char **nargv, **env_add, **user_info;

快速測試表明sudo/sudoedit選擇無法從stdin中傳遞的測試用例正常工作,因?yàn)槌鲇谀撤N原因,它使用了__progname。一個(gè)快速解決方法:

 
 
 
 
  1. --- a/lib/util/progname.c
  2. +++ b/lib/util/progname.c
  3. @@ -83,7 +83,7 @@ void
  4. initprogname2(const char *name, const char * const * allowed)
  5. {
  6. int i;
  7. -# ifdef HAVE___PROGNAME
  8. +# if 0
  9. extern const char *__progname;
  10. if (__progname != NULL && *__progname != '\0')

最后,設(shè)置無需等待密碼輸入,因此只需使其無條件失敗即可:

 
 
 
 
  1. --- a/plugins/sudoers/auth/sudo_auth.c
  2. +++ b/plugins/sudoers/auth/sudo_auth.c
  3. @@ -259,7 +259,7 @@ verify_user(struct passwd *pw, char *prompt, int validated,
  4. "--disable-authentication configure option."));
  5. debug_return_int(-1);
  6. }
  7. -
  8. +return 0;
  9. /* Enable suspend during password entry. */
  10. sigemptyset(&sa.sa_mask);
  11. sa.sa_flags = SA_RESTART;

由于某種原因afl-gcc工具無法正常工作,因此使用了基于LLVM的工具。需要重寫CC為./configure:

 
 
 
 
  1. CC=AFL-clang-fast ./configure

測試中使用了兩個(gè)簡單的測試用例,調(diào)用了兩個(gè)可用的實(shí)用程序:

 
 
 
 
  1. echo -ne 'sudo\0ls\0\0' > case1
  2. echo -ne 'sudoedit\0test\0\0' > case2

準(zhǔn)備就緒后,以并行模式啟動(dòng)了四個(gè)AFL實(shí)例。半小時(shí)后,出現(xiàn)了一個(gè)crash:

結(jié)果:

確實(shí)在sudoedit -s是崩潰了。假設(shè)并行運(yùn)行了4個(gè)實(shí)例,大約2小時(shí)的CPU時(shí)間。通過2小時(shí)的CPU時(shí)間測試,就可以在setuid中找到嚴(yán)重的安全漏洞。

總結(jié)

為什么在十年中,才能發(fā)現(xiàn)這樣的嚴(yán)重問題,其他重要的基礎(chǔ)系統(tǒng)是否是不是也存在類似類似的潛伏漏洞。不知道之前有沒有人對sudo做過模糊測試?或者社區(qū)大意了,只測試過sudo,而遺漏了不太引人注意的sudoedit了。

但是無論如何,需要指出的是,使用快速使用模糊測試程序可以發(fā)現(xiàn)廣泛使用的實(shí)用程序中仍然存在嚴(yán)重的錯(cuò)誤。


分享文章:AFL實(shí)戰(zhàn):測試sudo提權(quán)漏洞CVE-2021-3156
網(wǎng)頁網(wǎng)址:http://uogjgqi.cn/article/dpphgsh.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流