0x00 漏洞介绍
漏洞位于/usr/sbin/upnpd,是ssdp(UDP 1900)协议的解析过程中,对MX字段的strncpy引发的栈溢出。
附件:
0x01 漏洞分析
漏洞成因是因为直接将MX字段到”\r\n”字段中间的的内容拷贝到了缓冲区上,然而却并没有判断这段字符的长度是不是要小于要拷贝的缓冲区的大小,因此造成了栈溢出。
可以观察到造成这个漏洞的危险函数是strncpy
我们想直接定位一下二进制程序里有没有这种类似的漏洞的话直接使用交叉引用查看strncpy的调用发现有350处,直接人工去过工作量太大了
0x02 漏洞查询
观察此处漏洞点的漏洞模式,strncpy的第三个参数n首先不是一个定值且这个值和第一个参数没有关系即他们空间大小没有来自于同一个变量
根据这种漏洞模式的查询思路我们可以构造出下面的查询语句:
match (n:identifier{callee:"strncpy",index:0}), (m:identifier{callee:"strncpy",index:2})where n.function=m.function and m.line=n.line and not (m)-[:dfg]-(n) return m.function limit 1000
其中not (m)-[:dfg]-(n)
这一句是过滤了第一个参数和第三个参数存在数据流的情况
在破壳平台上执行查询指令得到结果,查询结果缩减为了22条,且漏洞所在函数位于查询结果中。这个查询方法不受source,sink点的影响可以更广泛的用在多数固件上。