Summary 前段时间,Linux upstream 上更新了一个栈溢出漏洞的patch CVE-2017-7187 。目前已知受影响的版本为Linux Kernel 4.10.4,可导致本地拒绝服务,或其他影响。
Vulnerability Analysis 这个漏洞很有意思,在用户空间下,应用程序可以设置下一条命令行长度的最大值。 首先,看一下第一条code path:
接着 review 一下代码:
从上一段代码中我们可以得到: 参数 arg 是由用户空间传进来的一个值,它是unsigned long ,并且我们可以控制它。 参数 arg 传进来后,分别把指针p、ip指向它[1][2];紧接着,在SG_NEXT_CMD_LEN 中调用get_user()函数,然后,调用 get_user() 将它的值拷贝到 val 中[3],get_user() 是一个类似 copy_from_user的函数,不过它只能从用户空间拷贝简单的数据类型,如: char、int等,不能拷贝复杂的数据类型,如:struct、arrays;最后,设置next_cmd_len,如果val 的值大于0,则使用val 的值,否则为0 。OK,我们看到[4] 这里,代码中没有做任何检查,这允许攻击者在用户空间设置一个很大很大的值。 再看第二条code path: 整个code path分析下来,我们发现了一个非常有趣的的函数__copy_from_user(),它被 sg_write()函数调用,现在让我们看看这个函数的细节吧。
同样,参数 buf 是可控的,在[1] 处,调用__copy_from_user()函数,从用户空间拷贝cmd_size大小的buf到内核空间cmnd 中;cmd_size的大小,在触发第一条code path时被设置,存储在sfp- |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|