千家信息网

Linux中create_elf_tables函数如何使用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Linux中create_elf_tables函数如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。概述在近期的一次
千家信息网最后更新 2026年10月31日Linux中create_elf_tables函数如何使用

Linux中create_elf_tables函数如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

概述

在近期的一次安全分析过程中,我们在64位Linux系统内核里的create_elf_tables()函数中发现了一个整型溢出漏洞,本地攻击者将可以通过一份SUID-root代码来利用这个漏洞,并获取到目标设备的完整root权限。

目前,受该漏洞影响的Linux发行版有Red Hat Linux企业版、CentOS和Debian 8。

漏洞分析

150#define STACK_ROUND(sp, items) \ 151         (((unsigned long) (sp - items)) &~15UL) ... 165 create_elf_tables(struct linux_binprm*bprm, struct elfhdr *exec, ... 169        int argc = bprm->argc; 170        int envc = bprm->envc; 171        elf_addr_t __user *sp; ... 178        int items; ... 190        p = arch_align_stack(p); ... 287        items = (argc + 1) + (envc + 1) + 1; 288        bprm->p = STACK_ROUND(sp, items); ... 295        sp = (elf_addr_t __user *)bprm->p;

"argc"表示传递给execve()系统调用的命令行参数个数,个数受fs/exec.c中MAX_ARG_STRINGS的限制;"envc"表示传递给execve()的环境变量个数,个数同样受到MAX_ARG_STRINGS的限制;但是由于MAX_ARG_STRINGS为0x7FFFFFFF,所以我们可以让整数"items"发生溢出并让程序失效。

此时,我们就可以以增加用户态的栈指针,然后将用户态栈指针指向我们的参数和环境变量字符串,最终在用户模式执行SUID-root代码时重写这些字符串。

漏洞利用

在使用execve()运行SUID-root代码时,我们的"items"值为0x80000000,参数指针的大小约为0x80000000 * sizeof(char *) = 16GB,参数字符串为16GB,环境字符串也为16GB,因此我们的漏洞利用环境"只"需要2 * 16GB = 32GB内存,而并非3 * 16GB = 48GB或者更多,因为我们使用了一些小技巧来减少内存指纹。

下面这个图表代表了SUID-root代码开始执行后,我们的用户态栈结构:

-"A"("alpha")为create_elf_tables()分配的栈空间大小(代码190-287行),大约为512字节。

-"sprand"是create_elf_tables()分配的随机栈空间大小(代码190行),大小范围在0-8192字节之间。

-"protect"参数字符串是一个非常重要的命令行参数&选项,这个参数必须不能受到内存崩溃的影响。

-"padding"参数字符串大约需要占用16GB栈空间。

-"protect"环境字符串是一个重要的环境变量,必须必须不能受到内存崩溃的影响。

-"scratch"环境字符串为1MB。

-"onebyte"环境字符串为256KB,其部分数据会被fname[]缓冲区覆盖。

-"B"("beta")为ld.so分配的栈空间数量。

此时,ld.so会使用handle_ld_preload()中fname[]缓冲区的数据重写"onebyte"环境变量中的部分数据,并让process_envvars()中的UNSECURE_ECVVARS等过滤器失效。

我们的POC代码能够利用create_elf_tables()中的这个整型溢出漏洞,演示样例如下:

# gcc-O0 -o poc-suidbin poc-suidbin.c#chown root poc-suidbin#chmod 4555 poc-suidbin $ gcc-o poc-exploit poc-exploit.c$time ./poc-exploit...ERROR:ld.so: object 'LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=.' fromLD_PRELOAD cannot be preloaded:ignored.ERROR:ld.so: object 'LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=.' from LD_PRELOAD cannot bepreloaded: ignored.ERROR:ld.so: object 'LD_LIBRARY_PATH=.' from LD_PRELOAD cannot be preloaded: ignored.argc2147090419stack0x7ffbe115008f < 0x7ffbe1150188 < 0x7fffe0e50128 < 0x7ff7e11503ea <0x7ffbe102cdeagetenv0x7ffbe114d83b .0x7ffbe114d82bLD_LIBRARY_PATH=.0x7ffbe114df60LD_LIBRARY_PATH=.0x7ffbe114df72LD_LIBRARY_PATH=....0x7ffbe114e69eLD_LIBRARY_PATH=.0x7ffbe114e6b0LD_LIBRARY_PATH=.0x7ffbe114e6c2LD_LIBRARY_PATH=. real    5m38.666suser    0m0.049ssys     1m57.828s

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

字符 字符串 环境 参数 代码 漏洞 个数 内存 变量 大小 用户 空间 指针 数据 分配 影响 函数 重要 命令 字节 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 耶加雪菲 互联网科技工作委员会主任 科技互联网项目 互联网科技集团 卓越科技(互联网 ) 奇酷互联网络科技公司 壕鑫互联网络科技 互联网科技网站 长亮科技 互联网金融 老年人脱离互联网科技的作文 互联网之后的科技是什么 互联网大会黑科技排名 晓花互联网科技有限公司网址 成都互联网科技公司工作好不好 速维有品互联网信息科技(苏州)有限公司 工业互联网等科技实现智能化赋能 广东工业互联网大赛深圳学泰科技 新氧科技和美国互联网有关系吗 第三届互联网大会安防黑科技 重生之互联网科技帝国 卓越科技(互联网 ) 智慧科技互联网 成都狮子座互联网科技 蓝色互联网科技 富国互联网科技创新基金 广州新华互联网科技学校电竞方面 中科明德北京互联网科技 山东星卡互联网科技有限公司官网 上海万顺科技互联网有限公司招聘
0