因漏洞修补触发的漏洞—CVE-2016-6309漏洞详细分析


预估稿费:500RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linweidefineLIMIT_BEFORE_EXPANSION0x5ffffffc。

满足这三个条件后函数进入代码4处,使用realloc函数重新分配一块内存,而导致原先的str-data指针被free掉,成为野指针,而程序其他地方继续使用这一指针,就导致了UseAfterFree。

至此为止,漏洞的原理搞清楚了,那么如何构造畸形的TLS握手包呢?

首先使用wireshark导出正常的TLS握手包,将包头中的两个长度段分别改为0x4000,0x5560。并在包尾填充相应长度的字符。很简单,是不是?


漏洞溯源

俗话说,”冤有头,债有主”,那么这次漏洞是如何出生的呢?openssl使用的代码管理工具是git,我们能够在github看到过往的历史提交记录,让我们来查查此次漏洞到底是如何产生的。根据上面的分析,我们知道漏洞是在文件中。经过一番搜索,最后找到这段代码的修改记录:

查看页面中的修改说明,openssl给TLS包分配内存的时机太早,如果有恶意攻击者发送大量恶意TLS包,可能导致openssl分配大量内存而导致拒绝服务漏洞。注意看说明结尾,此次漏洞是由360团队的shilei向openssl报告的,openssl开发团队收到这一漏洞报告后对相关文件进行了修改,并最终导致了此次拒绝服务攻击。总结起来就是360的一位安全研究员shilei向openssl报告了CVE-2016-6307拒绝服务攻击漏洞,openssl对此进行了修改,并导致了CVE-2016-6309漏洞。

通过这一漏洞的分析,以下是笔者一些不成熟的关于软件安全的想法,请大家指正:

1.尽量不要让你的代码太复杂。我认为软件开发人员在修复一个bug的时候引入一个新bug的原因在于软件的复杂度已经超过了开发人员的驾驭能力。对于开发人员而言,太过复杂的代码容易出bug,这是常识。但是因为业务的各种变更,项目进度需要,历史原因等种种实际情况,很容易出现极其复杂的代码,并产生安全漏洞。因此,开发人员如果有多一些时间的话,希望能思考一下,你手头上正在开发或维护的代码,能否在不影响业务的基础上降低复杂度。

2.在给漏洞打补丁的同时,也可能产生新的漏洞。安全研究人员在挖掘漏洞的时候,可以试着从软件的补丁上考虑。

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐