java空指针漏洞利用_源码审计之空指针引用漏洞

本文介绍了空指针漏洞的原因、难以发现的原因,并通过白盒分析工具RATS进行源码审计,展示如何使用SourceInsight进行深入分析。作者通过实例详细解析了空指针漏洞的排查过程,包括可疑点的识别、触发条件的分析以及漏洞的验证。最终,文章总结了使用到的工具和技术,为读者提供了一次代码审计的学习案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

*本文原创作者:freezing,本文属FreeBuf原创奖励计划,未经许可禁止转载

前言

最近在网上加入了一个安全团队,里面有人问我如何做代码审计。只能说先能看得懂代码,了解各种漏洞的形成原因。然后多进行审计和调试练习。 这是刚学习源码审计时写的一遍审核过程, 希望大家做个参考。(php的文章很多,来一篇C语言的)

一、空指针漏洞原因

Null Pointer空指针的引用,对于空指针的错误引用往往是由于在引用之前没有对空指针做判断,就直接使用空指针,还有可能把空指针作为一个对象来使用,间接使用对象中的属性或是方法,而引起程序崩溃。

二、空指针漏洞难以发现的原因

空指针(NullPointer)引用导致的错误,依靠代码审计工具很难发现其中的错误,因为空指针的引用一般不会发生在出现空指针然后直接使用空指针情况。往往是由于代码逻辑比较复杂空指针引用的位置会比较远,不容易发现;并且在正常情况下不会触发,只有在某一个特定输入条件下才会引发空指针引用。对于排查此类错误也就更加困难。

三、白盒分析是空指针引用

3.1  三个条件

0d0e400cacf740a1a9cde7e8e8c872d9.png

3.2.rats软件介绍

RATS是一个代码安全审计工具,可扫描 C、C++、Perl、PHP 和 Python 源码,检查出一些常见的安全问题,例如缓冲区溢出和 TOCTOU (Time Of Check, Time Of Use) 。 rats软件版本v2.3。

3.3.sourceinsight查找分析

(1)由于软件本身是代码审计工具,所以缓冲区之类的溢出就不检查了。直接查找空指针NULL是否存在。

c82309a53309138a51709162637cdb29.png

剔除出掉指针初始化赋值。

主要针对数据赋值。

找到了一下几处。

可疑点1:

fd07ca8422b0956204057f48a0efea08.png

可疑点2:

d00b833b3c7c716520bd38f5e853053e.png

可疑点3:

469e1db200f05cb2639bd143d3d53074.png

可疑点4:

ebc427fdf15f59245fa97073445748ff.png

可疑点5:

f259be70b79f01b0f90e55ed8cf67583.png

可疑点6:

80eec10054a331f51c3b6f485e8e7cb0.png

(2)可疑点是否有调用

可疑点1查看其调用点发现所有的都针对NULL做了判断,所以不存在空指针引用。排除。

9fd87dddd8795af18e931e0c4ca102c2.png

可疑点2:

所有文件中查找后发现就赋值了一次。再也没使用过此字段。排除.

7085147e7b48773addea36d7dfc994a4.png

可疑点3:

所有文件中查找就只有一处使用,而且做了判断。故排除。

97d2ecd36e5c44267f6e976827a13632.png

可疑点4:

所有文件中查找就一处使用,其它做赋值,使用部分做了判断,故排除。

21f7f96336a3f6fc12ee1b2879b8991d.png

可疑点5和可疑点6一起分析。

81dd64c72e7b2363e37f1281478360c6.png

下面的引用还有未做是否为空的判断。

24f25a28bdce4842e556d0bb0c39b463.png

进一步分析可疑点5:函数名为staticbuffer,有引用,所以可疑点5有可能性。

2cc988fecaedf9dbd086f429c5453a91.png

进一步分析可疑点6,函数名phpbacktick,没有对data的引用,所以可以排除可疑点6.

bc274ad79dde5332cbd1bbd60ede63f5.png

(3)对触发条件进行分析梳理。

第一步:赋空值的条件

倒推出StaticGlobalBuffer为条件。可以看到下图中的数据。

c4395f5322c73d3f706eab011c80d55f.png

2.调用的条件:

经过查找发现

build_html_vulnerability(vulnerability_t*ptr)

report_vulnerability(vulnerability_t*ptr)

存在引用data。

所以可以得知。

一个C或Cpp文件中有char类型的全局缓冲区变量(char数组),就可以触发这个异常。

四、验证漏洞

1.根据白盒可得知如下文件即可引发漏洞,1.c文件里只有

char a[10]; 一句代码。

e516f08efc8ec8d5ab9fed8d61df7446.png

2.生成文件验证。gdb rats

set args --html  1.c

可以得到如下结果。

000cbddaae760564e7b9c26ae08c26c9.png

发现并没有引发异常。

所以build_html_vulnerability函数的调用栈。

c095aa788f9bbe2473df40bbdc708fad.png

前面有一个条件,如果告警不等于默认以及小于2类。就忽略掉。

但是全局字符的告警为low,不等于默认但是小于2类,忽略。

fcaf64b811eb83151feb2e13f5b4819b.png

所以需要条件来使告警不被忽略,所以要改变warning_level的值,查找

warning_level的引用。发现如下图

635d75473f12d187fb1ab3c23c546b94.png

当输入参数小于1时为1,只要warning_level为1时,(low=1)<1不成立,则忽略可以不被忽略即可。所以只要optarg大于等于3即可达到条件。

重新设置参数 set args –w4 --html  1.c,发现已经出现错误了。

31f7cfe65b59ff1e4cbf3be70658bdef.png

6dc7e12fb624f6f4767659688cd16313.png

由于xml格式显示也是这样的。所以重新设置参数 set args –w4 --xml  1.c   输出也一样。

afe37204a46a79bef940260ded121dfe.png

df4eca01a2e741cf78813b98d334351e.png

五、总结

本次使用到的工具,rats-2.3(源码自行下载),sourceinsight,gdb,peda。学习的时候写一个一片过程总结,今天发表出来。   希望大家做个参考。

*本文原创作者:freezing,本文属FreeBuf原创奖励计划,未经许可禁止转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值