我们的 博客

为什么“内存管理”漏洞值得你的绝对关注!

Aug 15, 2019 刘新铭

在IT业务环境中,客户数据是关注的焦点。因此,保护客户数据自然是任何IT专业人员最重要的责任。许多国家或组织已经立法要求,数据在静态存储和移动过程中必须为加密状态。这会使许多人觉得如果IT系统符合法律要求,数据就是安全的。实际情况是在数据在CPU操作期间依然需要被解密。因此,需要密码和密钥才能启用数据加密和解密。除此之外,数据管理员还需要能够在用户丢失密码或密钥时恢复数据。总之,数据在解密状态期间,以及所有处于解密和加密状态转换期间,容易被黑客恶意利用。

让我们重点关注一下解密状态下的数据。用户的密码或密钥是最需要保护的数据。在某些特定时间点,这些数据将被解密并存储在计算机系统的数据缓存中。原则上,所有软件都实现了自己的缓冲区管理机制,包括分配和释放存储数据的缓冲区的协议。众所周知,软件应用程序由来自不同组织部门软件工程师,在软件生命周期中不同的阶段共同开发和修改。自然而然会有漏洞产生,并可能对内存管理产生严重影响。

一个关于内存管理错误的例子是谷歌最近宣布推荐用户更新Chrome浏览器(CVE-2019-5786)。这是一个“使用释放后内存”(UAF)错误,该错误会导致用户的计算机文件泄露。这种内存管理问题发生在相对复杂的控制流中并且跨越函数边界。最重要的是,引入漏洞的函数是一个开源API。简单来说,该错误是由特定时间窗口引起的,在错误时间窗口内,攻击者可以获取指向敏感数据的指针。找到这个机会窗口期并非易事,它带来了另一个关于开源软件的有趣观点。在过去的20年里,开源促进了互联网和移动软件的爆炸式增长。它为软件行业带来了巨大的价值,但并非没有缺点。它给黑客提供了机会去学习软件,并且开发出复杂的技术去探索软件的漏洞。

使用静态代码分析工具可以在源代码级别分析复杂的软件系统,以检测易受攻击的漏洞。许多静态分析工具仅仅在模式匹配这个级别工作,而高级工具可以使用基于编译器优化框架的分析引擎,这些编译器优化框架可以为高性能计算产生高度优化的代码。
在鉴释,我们开发了一种方法来模拟数据缓冲区的生命周期,从内存分配时到内存回收释放时再到后续生命周期。使用精确的内存对象模型,我们能够识别在释放缓冲区后引用数据的操作。

虽然我们可以检测软件错误,但开发人员最终负责编写高质量的代码。我建议养成一个在释放缓冲区后清除缓冲区的好习惯。是的,一些开源编译器可以通过选项来清除缓冲区。但是,必须记住,这些开源编译器只能识别标准内存分配函数。如果您有自己的自定义内存分配功能,它将无法执行此类操作。

在鉴释,我们始终会秉持 “质量第一” 和 “设计安全” 的态度!