Linux中createelftables函数整型溢出漏洞分析(CVE201814634)

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序把安全装进口袋

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

目前,受该漏洞影响的Linux发行版有RedHatLinux企业版、CentOS和Debian8。

150#defineSTACK_ROUND(sp,items)\

151(((unsignedlong)(sp-items))&~15UL)

...

165create_elf_tables(structlinux_binprm*bprm,structelfhdr*exec,

169intargc=bprm->argc;

170intenvc=bprm->envc;

171elf_addr_t__user*sp;

178intitems;

190p=arch_align_stack(p);

287items=(argc+1)+(envc+1)+1;

288bprm->p=STACK_ROUND(sp,items);

295sp=(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-opoc-suidbinpoc-suidbin.c

#chownrootpoc-suidbin

#chmod4555poc-suidbin

$gcc-opoc-exploitpoc-exploit.c

$time./poc-exploit

ERROR:ld.so:object'LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=.'fromLD_PRELOADcannotbepreloaded:

ignored.

ERROR:ld.so:object'LD_LIBRARY_PATH=.0LD_LIBRARY_PATH=.'fromLD_PRELOADcannotbepreloaded:ignored.

ERROR:ld.so:object'LD_LIBRARY_PATH=.'fromLD_PRELOADcannotbepreloaded:ignored.

argc2147090419

stack0x7ffbe115008f<0x7ffbe1150188<0x7fffe0e50128<0x7ff7e11503ea<0x7ffbe102cdea

THE END
1.高效文件处理:Pythonpathlib实战指南# path 对象 # WindowsPath('D:/temp/pathlib') 构造路径对象之后,Path会自动判断出是windows还是linux下的路径。 1.2. 拼接和拆分路径 用字符串来拼接和拆分路径时,最麻烦的就是不同系统中路径分隔符(\ 和 /)的处理。 使用Path对象,能够避免此困扰。 https://blog.csdn.net/fenfenfen520a/article/details/144423375
2.LINUX随笔二十一添加动态库路径的方法/lib -ltest -Wl,-rpath ./lib) ,其中,-Wl的意思是,后面的选项直接交给ld程序处理,-rpath选项是说更改搜索路径为后面的参数 ./lib b.环境变量LD_LIBRARY_PATH指定的动态库搜索路径; c.配置文件/etc/ld.so.conf中指定的动态库搜索路径;(修改完文件后,用ldconfig更新) d.默认的动态库搜索路径/lib和/usr/https://www.ctyun.cn/zhishi/p-409896
3.C++标准库实现wx639dba20b70fd的技术博客C++标准库(Standard Library)是C++语言的重要组成部分,提供了丰富的数据结构和算法,极大地简化了开发过程。本文将深入探讨C++标准库的实现机制,并通过代码实例帮助读者更好地理解和应用这些概念。 一、标准库概述 C++标准库由多个头文件组成,每个头文件包含一组相关的类和函数。以下是一些常用的头文件及其功能: https://blog.51cto.com/u_15916160/12771707
4.Pythonpython源码下载平台```python # 导入模块 import os # 定义变量 my_variable = "Hello, World!" # 创建一个工作空间 workspace = {} # 将变量添加到工作空间 workspace["key"] = my_variable # 访问工作空间中的变量 print(workspace["key"]) ``` 在这个示例中,我们首先导入了os模块,然后定义了一个名为my_variable的变https://python.code.coder100.com/index/index/content/id/59882
5."dicts.lsp"文件详解与应用指南导读本文将详细介绍"dicts.lsp"文件的构成、功能及应用。首先,我们将概述"dicts.lsp"文件的基本概念及其在编程中的作用。接着,我们将深入探讨 本文将详细介绍"dicts.lsp"文件的构成、功能及应用。首先,我们将概述"dicts.lsp"文件的基本概念及其在编程中的作用。接着,我们将深入探讨文件的结构和语法规则,帮助读http://m.caohai.net/hlkj/202412/187982.html
6.LogicalDatabases逻辑数据库数据库表(T类型节点):节点名称(上图中的根节点名称输入框)必须为数据库表名(上图中的数据库表输入框)或者view,且不可以为纵深结构。此类型(数据库表或视图)的节点情况下,可执行程序里,你可以使用NODES or TABLES语句来定义工作区,在LDB的数据库程序中,需要对每个节点使用NODESor TABLES来定义,不能有TYPE选项。https://www.u72.net/daima/n3uvr.html
7.解析java.library.path和LDLIBRARYPATH的介绍与区别java为什么有LD_LIBRARY_PATH? 上面我们说到可以通过cache和ldconfig来简化搜索和加载动态库的流程,但是还有两个问题没有考虑到,一是还没有将编出来的库放到系统目录中去,二是依赖库数量很少,不需要经过这么复杂的查找。 LD_LIBRARY_PATH就是用来满足这个需要,它也指定一个搜索路径,且ld-linux.so会优先在这个路径下搜https://m.jb51.net/article/211890.htm
8.深入理解Linux动态库加载:路径问题与解决方案这个命令会将/path/to/libs添加到LD_LIBRARY_PATH的开始,动态链接器会首先在这个目录中搜索动态库。 4.4 修改/etc/ld.so.conf文件 /etc/ld.so.conf文件是一个包含动态库搜索路径的配置文件。动态链接器会在这些路径中搜索动态库。你可以编辑这个文件 https://developer.aliyun.com/article/1466188
9.linuxLDLIBRARYPATHdoesn'tseemtowork/usr/bin/ld: cannot find -lg2c If I use: gcc -o test test.c -L/usr/lib/gcc/x86_64-redhat-linux/3.4.6 -lg2c then it works fine. So I added the path like so: LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/3.4.6:$LD_LIBRARY_PATH https://stackoverflow.com/questions/13292261/ld-library-path-doesnt-seem-to-work
10.更改当前进程环境的LDLIBRARYPATHPython开发问题这篇关于更改当前进程环境的 LD_LIBRARY_PATH的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!https://www.genban.org/ask/python/48271.html
11.LDLIBRARYPATH变量设置hxlexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/b in:/sbin umask 022 export PATH unset USERNAME 明明是设置了LD_LIBRARY_PATH变量的,怎么不生效呢,后来在.bashrc文件中添加该变量问题解决. http://blog.chinaunix.net/uid-77311-id-3268488.html
12.ORACLEHOME迁移后需要设置LDLIBRARYPATH环境变量在10g以后,一般情况下环境变量中没有必要设置LD_LIBRARY_PATH,但是一旦将ORACLE_HOME迁移到其他目录,则环境变量中还需要添加这个变量。 Linux和Unix支持TAR方式迁移ORACLE_HOME,如果有需要将ORACLE_HOME放到其他路径下,那么一般都会使用tar的方式将整个路径拷贝到目标目录。 https://blog.itpub.net/4227/viewspace-718879/
13.图像质量调试工具使用指南.docx运行前准killallittbstream;ittbstreamDLLPATH=${LDLIBRARYPATH}:${PWD}/libs;#exportLDLIBRARYPATH=${DLLPATH}#exportLDLIBRARYPATH即Linux环境变量名,该环境变量主要用于指定查找共享库(动态工具里使用了自己编译好的动态库,而这些动态库放在发布包的libs文件夹下。当执行函数动态 下’/lib’and‘/usr/lib’,那么https://www.renrendoc.com/paper/243693177.html
14.科学网—Linux操作系统中编译安装GCC详解以及需要注意的问题1.3 上面装的3个库,GCC找不到,需要设置变量 LD_LIBRARY_PATH export LD_LIBRARY_PATH=/usr/local/lib (在终端里运行这行命令, 下次开机失效) 或更改~/.profile文件,在文件的最后加上一行: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib (需先注销,永久有效) https://blog.sciencenet.cn/blog-830496-699204.html
15.PaddlePaddle/PaddleSeg:飞桨高性能图像分割开发套件,端到端完成python deploy/python/infer.py \ --config ./pp_liteseg_infer_model/deploy.yaml \ --image_path ./cityscapes_demo.png 参数说明如下: 参数名用途是否必选项默认值 config导出模型时生成的配置文件, 而非configs目录下的配置文件是- image_path预测图片的路径或者目录或者文件列表是- https://openi.pcl.ac.cn/PaddlePaddle/PaddleSeg/src/branch/release/2.7/docs/deployment/inference/python_inference_cn.md
16.RPATH–demonstrate的blog比较推荐的做法是链接的时候加入 -rpath 参数指明所谓的 RUNPATH,这样可执行文件(或者依赖其他动态链接库的动态链接库)就能告诉 ld.so 到哪里去搜索对应的动态链接库了。对于没有设定 RPATH 的可执行文件或者动态链接库,我们可以用 LD_LIBRARY_PATH 这个环境变量通知 ld.so,这个方法的问题是,环境变量有时候设置了(https://remonstrate.wordpress.com/tag/rpath/
17.鲲鹏GPU生态应用Relion移植指南(CentOS8.2)技术分享专区./configure --prefix=/path/to/FFTW --enable-shared --enable-threads --enable-openmp --enable-mpi CFLAGS="-O3 -fomit-frame-pointer -fstrict-aliasing" make -j && make install 步骤6 执行以下命令配置环境变量: export PATH=/path/to/FFTW/bin:$PATH export LD_LIBRARY_PATH=/path/to/FFTW/libhttps://developer.huawei.com/home/forum/kunpeng/thread-0207101461153257010-1-1.html
18.FAQ《PaddleOCRv2.0使用教程》A:需要把cudnn lib添加到LD_LIBRARY_PATH中去。 Q3.1.4:PaddlePaddle怎么指定GPU运行 os.environ[“CUDA_VISIBLE_DEVICES”]这种不生效 A:通过设置 export CUDA_VISIBLE_DEVICES=’0’环境变量 Q3.1.5:windows下训练没有问题,aistudio中提示数据路径有问题 https://www.bookstack.cn/read/PaddleOCR-2.0-zh/3e138bdc40f16673.md
19.关于LDLIBRARYPATH的问题东写西读终见大海无量据说因为安全原因,Linux系统做了限制。LD_LIBRARY_PATH not loading from .profile nor /etc/environment Ubuntu 不能在 profile, environment,.bashrc中设置 LD_LIBRARY_PATH; 解决办法: 编辑/etc/ld.so.conf 文件,将指定的路径加上,或者在 /etc/ld.so.conf.d/ 目录中添加一个新的配置文件。 https://www.iteye.com/blog/yangzb-598700