我是靠谱客的博主 年轻小熊猫,最近开发中收集的这篇文章主要介绍Linux CVE-2009-0029 漏洞解析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        The ABI in the Linux kernel 2.6.28 and earlier on s390, powerpc, sparc64, and mips 64-bit platforms requires that a 32-bit argument in a 64-bit register was properly sign extended when sent from a user-mode application, but cannot verify this, which allows local users to cause a denial of service (crash) or possibly gain privileges via a crafted system call.

        上面这段话是对CVE-2009-0029的说明,大概意思是说:在Linux 2.6.28及以前版本的内核中,IBM/S390、PowerPC、Sparc64以及MIPS 架构64位平台的ABI要求在系统调用时,用户空间程序将系统调用中32位的参数存放在64位的寄存器中要做到正确的符号扩展,但是用户空间程序却不能保证做到这点,这样就会可以通过向有漏洞的系统调用传送特制参数便可以导致系统崩溃或获得权限提升。
 

可能有人不理解ABI是什么意思,在这里当个小插曲简单介绍一下:大家都知道API,是定义了应用程序调用库的接口。那么ABI,其实就是定义了二进制接口,全称叫

Application Binary Interface.定义的内容大概包括
                    1、数据类型的大小、布局和对齐
                    2、调用约定(控制着函数的参数如何传送以及如何接受返回值),例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后
                    3、系统调用的编码和一个应用如何向操作系统进行系统调用;
                    4、在一个完整的操作系统中,目标文件的二进制格式、程序库等等。
 举个例子看一下:

int sys_sample(int arg)
{
    ....
    return sample[arg];
}

根据ABI的规定,32位的参数存放在64位的寄存器上要自己进行符号扩展,但是程序是人写的,可能是疏忽,也可能是有意,总之并不能完全保证这一点,那么传参的时候,就会出现只修改了低32位,并没有修改高32位的情况,那么如果高32位是ffffffff,这个数就变为了一个很大的负数,在内核中执行,sample[arg]就会取到一个非法地址。
 

最后

以上就是年轻小熊猫为你收集整理的Linux CVE-2009-0029 漏洞解析的全部内容,希望文章能够帮你解决Linux CVE-2009-0029 漏洞解析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部