CVE-2018-1040漏洞现形记(6)
11 污染从哪来
提到污染,很多人都知道,无非是外部输入的参数构成的,如scanf函数的输入。当然,还有一些,如函数的参数输入,特别是操作系统的API函数,被大量外部用户调用,其参数也构成外部输入污染。
除此之外,从漏洞的判定来看,还有其它的漏洞污染。如整数溢出构成污染、堆溢、栈溢、算术运算污染、污染输入函数的输出等,这些都会构成污染,不过这些构成二次污染。
显然,污染不一定构成漏洞,特别是初级污染。二次污染则可能。
12 约束条件
其实,单独谈污染,谈各类溢出,估计很多人都能谈。这是学院派的做法。产品则还要更进一步。crystal不仅找出所有的污染传播对象,还要给出传播的路径、传播的约束条件。没有特定的路径,谈污染传播是耍流氓。没有约束条件,污染的误报可能很高。
约束条件是什么?如何表示?这个要做符号执行分析了。以前一直以为符号执行很高大上。但是,当我真正将代码的对象特征分析、污染传播做完了之后,发现一切都是水到渠成的。有一个吐血的感想:有很多人没有做过具体的代码分析程序,但拍脑袋想一些程序分析的问题,到处问别人。对懂行的人而言,答非所问,鸡同鸭讲。对同样不懂得人,则还心有戚戚焉,但解决不了问题。最要命得是这类人还非常自信,对别人的解释做选择性的过滤后理解,遇到这样得人要吐血。
扯远了。符号执行crystal是独立编写得引擎实现的,约束求解用的是别人的。当然,法律是许可的。本来想做过简单的约束求解,但一则麻烦,二则时间不够。再说,产品不是技术秀,没必要。
现在,所有的函数调用、路径分析、污染传播、各类漏洞执行的约束条件基本都能展示。这得益于代码的对象分析系统的灵巧和完备性;感谢当年老板的严谨和认真。
13 轻舟已过万重山
在测试时,一直纠结于IDA的各类问题。特别是在几十万行代码的格式化分析时,各类问题层出不穷。每天都在焦虑,每天都在彷徨,每天都在绝望,每天都准备投降----老子不干了。但是,睡一觉后,又找到了一丝火花,于是又再出发。到现在,终于格式化分析没有问题了。近40万行的内核代码,足以覆盖99%的情况吧。至于还有可能的1%,老子真不干了。谁要搞就让那孙子搞吧!不过可能还是老子来搞!
搞完这个格式化分析之后,最担心的就只有路径爆炸。尽管验证了许多程序;尽管做了许多理论分析和证明;但路径爆炸真的很担心。因为我在内核发现了两个很变态的函数:200-300行代码有近100个跳转指令,也就是两到三个指令就有一个跳转,很好奇这是什么样的源代码写出来的。或者本身就是汇编写的吧。以前见识过路径爆炸,一个1000行的函数,貌似路径遍历到了上亿,好像没有重复。前几天对一个300多行的代码遍历路径,过了一百万。测试前面的十万条路径,双重遍历前面的五万,没有重复!我现在想来都头皮发麻。当然,我在漏洞分析时从应用层面解决了爆炸问题,这得益于某次无聊得培训。
还有什么问题吗?没有!那就万流归宗吧!
14 万流归宗
从技术层面来说,crystal现在能检测的有未初始化、堆溢、栈溢、整数溢、除0等。但这些都是没有技术含量的东西。错了,单就是整数溢出,就有很多问题。当然,堆溢、栈溢还有许多不同类型和场景也有问题。我好像看到有个博士专门有毕业论文讨论二进制代码的整数溢出的,向他致敬。他的所有理论成果估计都要为我所用了,哈哈。如果将来有收益,我估计会找到他给点研发补偿。
还有一本专门讲逆向分析的开源书,上面对循环分析得很好,简短精炼,已为我所用了。
其实,在我做好了二进制代码的对象分析系统架构之后,现在国内外的二进制代码理论分析成果基本上都可以在crystal上验证应用了。而且是快速的应用上来。记得国防科大有个学院派的老总说,我们不缺理论,也不缺实践,缺的是将理论和实践结合的人。我说我可以,但他舍不得花钱!其实,如果没有扎实的做过平台的基础分析、反复的设计和一线的编程实现,理论永远是理论,和实践差距一直存在。尽管不大,但很难越过。
下一步,估计要专门找国内外的所有关于二进制代码漏洞挖掘的理论成果,逐一用到crystal上面去。估计这就是我一直想做的事:万流归宗!
在万流归宗的过程中,如果写博士毕业论文,估计可以写好几篇了。如果发SCI,估计也是杠杠了。不过我老了,没兴趣。有需要的硕士、博士、教授可以来一起切磋,咱免费提供实验平台,还免费帮助编程分析实现。
(后面如有时间,我们将专门讲权限误用漏洞、对象类型错误漏洞等的检测,敬请关注。)
更多技术,请关注 朗曦科技 公众号
(未完,待续)
2019.12.05
麟朗曦科技 林孟尼
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!