软件漏洞之内存泄露

1.漏洞类型:内存泄漏_free()使用错误

代码段:

运行后报错。

原因与分析:

free()只能用来释放由用户动态分配的地址空间(堆内存),不能释放由系统维护的栈内存。

解决方法与思路:

(1)静态代码扫描。

2.漏洞类型:内存泄漏_重复释放内存

代码段:

运行后报错。

原因与分析:

第一次free时,已经将p所指的内存空间释放,所以完全有可能在第二次free前,p所指的内存空间又被重新分配,那么此时的free操作就是在影响其他程序的正常行为。

解决方法与思路:

(1)每次free后将指针置为NULL,free空指针并不会出现异常。

3.漏洞类型:内存泄漏_释放了错误的内存

代码段:

运行后报错。

原因与分析:

p所指的地址空间已经不再是系统所分配的地址空间,所以在释放过程中会访问其他地址空间,因而造成程序出错。一旦存有关键数据的地址被释放,就会造成内存泄漏。

解决方法与思路:

(1)从首地址开始释放内存

(2)保证至少有一个指针指向正确的地址,接着定义其他指针来操作内存。

4.漏洞类型:内存泄漏_引用已经释放的内容

代码段:

原因与分析:

使用了已经释放的指针,但编译器未做检查,从而使得指针指向了一个错误的位置,就是在访问一块已经被释放的,甚至可能被重新分配的地址空间,从而造成严重错误。

解决方法与思路:

(1)每次free后将指针指向NULL,每次使用指针指向指针前检查是否等于NULL。

5.漏洞类型:内存泄漏_使用后未释放内存

代码段:

原因与分析:

如果使用完后始终不释放p,那么内存中就有一块内存一直被占用。如果有大量的内存申请后未被释放,就会导致可用内存越来越少,设备运行越来越慢,最终导致设备无法正常运行。此外,由于内存始终未被释放,黑客也就可以直接读取该内存中的敏感数据,从而进一步实现攻击行为。

解决方法与思路:

(1)检查代码保证每块内存申请后必须被释放。

(2)配对使用malloc/free。

(3)设计程序结构,避免一块内存需要长期等待引用。

6.漏洞类型:内存泄漏_释放顺序出错

代码段:

原因与分析:

在释放动态申请的内存地址空间时,由于释放顺序出错造成的内存泄漏。如上代码段中,本应该先释放p->q再释放p,否则一旦释放p,就丢失了p->q所指空间的地址,也就造成了内存泄漏。如果有大量的内存申请后未被释放,就会导致可用内存越来越少,设备运行越来越慢,最终导致设备无法正常运行。此外,由于内存始终未被释放,黑客也就可以直接读取该内存中的敏感数据,从而进一步实现攻击行为。

解决方法与思路:

(1)检查内存释放顺序,按照先分配大空间再分配小空间,先释放小空间再释放大空间的原则。

7.漏洞类型:内存泄漏_未判断内存申请是否成功

代码段:

原因与分析:

计算机由于种种原因导致内存申请失败,但如果未做检查就引用指针p,显然会出错。

解决方法与分析:

(1)申请完后使用if(p!=NULL)来判断内存申请是否成功,如失败则不能引用指针p。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180530G20WEN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券