AFL实战:测试sudo提权漏洞CVE-2021-3156

最近sudo发现了一个严重的缓存溢出提权漏洞CVE-2021-3156,这很正常。不正常的是这个漏洞已经潜伏了10年之久,为什么10年才发现呢?如果用常规的测试方法需要多久才能发现?对此有人进行了Fuzz测试,请和虫虫一起学习一下过程。

概述

在本文试验中,使用了AFL模糊器。AFL模糊器(American Fuzzy lop)是一种面向安全的模糊器,AFL使用新型编译时检测和遗传算法,自动发现干净有趣的测试用例,这些用例会在目标二进制文件中触发新的内部状态。用这样的方法可以大大改善了模糊代码的功能覆盖范围。

AFL模糊器生成的紧凑的合成语料库还可以用于复现其他测试人员更耗费人力或资源的测试方案。

测试准备

sudo是setuid二进制文件,以root用户随机输入运行潜在错误的二进制文件不是最安全的方法。为了避免任何潜在的意外系统损坏,此设置试验中使用了虚拟机环境。并选择最近一个涉及漏洞sudo版本sudo 1.9.5.p1。

AFL旨在将输出生成到文件或stdout中,但是要模糊命令行参数。因此,需要自行修补sudo,忽略实际的argv并将其改为从stdin。

AFL提供了一个可以提供这样功能的argv-fuzz-inl.h:

示例argv-fuzz-inl.h从stdin读取NUL分隔的参数。注意,sudo在单个二进制文件中同时提供了sudo和sudoedit实用程序,因此要测试两者,还需要向fuzzer公开argv[0]。输入的代码argv-fuzz-inl.h不会执行此操作,因此需要对其进行修复:

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

sudo本身补丁很简单,只需在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.  
  7. +#include "argv-fuzz-inl.h" 
  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. +AFL_INIT_ARGV(); 
  15. int nargc, status = 0
  16. char **nargv, **env_add, **user_info; 

快速测试表明sudo/sudoedit选择无法从stdin中传递的测试用例正常工作,因为出于某种原因,它使用了__progname。一个快速解决方法:

  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. int i; 
  6. -# ifdef HAVE___PROGNAME 
  7. +# if 0 
  8. extern const char *__progname; 
  9.  
  10. if (__progname != NULL && *__progname != '\0') 

最后,设置无需等待密码输入,因此只需使其无条件失败即可:

  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. +return 0; 
  7. /* Enable suspend during password entry. */ 
  8. sigemptyset(&sa.sa_mask); 
  9. sa.sa_flags = SA_RESTART

由于某种原因afl-gcc工具无法正常工作,因此使用了基于LLVM的工具。需要重写CC为./configure:

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

测试中使用了两个简单的测试用例,调用了两个可用的实用程序:

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

准备就绪后,以并行模式启动了四个AFL实例。半小时后,出现了一个crash:

结果:

确实在sudoedit -s是崩溃了。假设并行运行了4个实例,大约2小时的CPU时间。通过2小时的CPU时间测试,就可以在setuid中找到严重的安全漏洞。

总结

为什么在十年中,才能发现这样的严重问题,其他重要的基础系统是否是不是也存在类似类似的潜伏漏洞。不知道之前有没有人对sudo做过模糊测试?或者社区大意了,只测试过sudo,而遗漏了不太引人注意的sudoedit了。

但是无论如何,需要指出的是,使用快速使用模糊测试程序可以发现广泛使用的实用程序中仍然存在严重的错误。

 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/126664.html<

(0)
管理的头像管理
上一篇2025-02-24 07:51
下一篇 2025-02-24 07:53

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注