网络安全 频道

安全C函数—预防缓冲区的简洁解决方案

  【IT168 资讯】以“互联网安全新思维”为主题的OWASP2011亚洲峰会在11月8日-9日成功举办。本届大会以“网络安全产品测评”、“OWASP应用安全技术”“业务安全发展新思路”“云安全”等多个角度展开深入的讨论。来自思科的李建蒙做了《安全C函数—预防缓冲区的简洁解决方案》演讲。

安全C函数—预防缓冲区的简洁解决方案
▲思科CSG安全团队核心成员李建蒙演讲

  李建蒙介绍到,“缓冲区溢出导致程序以奇怪的方式运行,被注意的一些恶意的代码,改变了运行逻辑,程序有可能彻底失败,从而使得整个数据彻底不工作,还有一种站上局部变量对整体程序运行没有什么影响,但是危害还是很大的。简单看一下关于缓冲区溢出有哪些比较有名的攻击。它所造成的危害,有些攻击者注入一些恶意代码,做任何想做的事情,危害非常严重的。”

  这是我们曾经做过的产品统计,缓冲区域溢出问题很严重,怎么预防?比如说CPU厂商会提供一些功能支持数据指令保护,同时需要操作系统进行相应的支持,有人通过编译器可以通过一些选项,数据指定保护,指定恶意代码是不可以的,在站上插入一些随机数,如果你把随机数破坏掉了,函数返回的时候会用站上的地址和保存地址进行比较,不同的情况下,节会监测到缓冲器区域发生,监测到之后所做的工作把这个程序终止,它只是最后一道防线,如何进行有效的预防,你不用C语言,使用Java语言。如何写正确的代码,必须建立在安全库的基础上,如果库不安全很容易出错,我就很难写正确的代码,比如C++可以写标准语言库,比如C语言安全C的库。

  我们使用免费开源软件首先看License,它可以免费的复制、修改,唯一的限制在你复制版本或者发布的版本里面有版权的声明就可以。下面我们简单看一下安全C和标准C在整体上有什么不同,第一,返回值不同,返回值没有什么作用的,不知道你到底有没有错误发生,安全C提供了返回值,知道有没有错误发生。加了下划线进行识别。

  标准C主要为了方便用,速度非常快,它的弱点非常明显的,它没有做输入认证,容易产生一些缓冲区域溢出问题,API没有标识输出过程中有错误发生。安全C的版本优点,它做了输入认证,可以主动避免缓冲区域溢出问题。它有返回值,如果有错误发生可以主动探测到错误的发生。它的速度比安全C速度差一点,它写代码不像标准C那么方便。既然各有优点和劣势,我们为什么还要用安全C呢?它可以主动预防缓冲区溢出问题,不会自我截断一些字符段,它提供了统一的错误处理方案。

  我简单列了一些标准C和安全C的列表,函数名加后缀线和IS。通过复制字符串来介绍怎么预防缓冲区溢出问题,对于安全C必须在调用之后必须检查一下结果是成功还是失败。

  这段字码像目标缓冲区为20个缓冲区里面我们复制20个字符,导致截止符没有地方存放,将你的目标缓冲区清空,可以避免没有截止符的字符串,安全C会主动检测,你的目标缓冲区是否有足够的长度,足够的空间容纳复制的内容,如果没有的话可以将字符串清空本次操作失败。

  我们得出简单结论,安全C会主动检测你的内存是否有重叠,如果有重叠可以将你的目标清空。微软提供了一些安全C的版本,可以做一下测试进行比较,大家对这个地方进行比较,相同的情况下,第八个版本里面有一个断言声明,将进程终止掉,你使用微软安全C的时候,要注意默认处理方式终止进程,你要注意改变它默认的处理过程。

  系统方面的比较,蓝色的是安全版本的,红色是标准版本的。通过这个图可以看出我们运行是百万级别以上的,差别只有十几毫米,性能差一点,但是整体情况还好。

  字符串API怎么避免缓冲区域溢出问题,如果探测到问题可以将字符串清空,哪些问题导致问题?主要是复制链接,哪些情况下会做将目标缓冲区清空,主要是内存重叠还有字符串没有截至符,没有足够的空间容纳你所要填充的内容。默认行为将第一个字节清成空字符,整个目标缓冲区变成工作端,将所有的缓冲区清空的话你要重新进行编译。关于内存操作分析也容易一些出现问题。

  内存API操作的时候如何避免缓冲区域溢出,主要是移动内存或者复制内存,在什么情况下做这些操作呢?你传入参数不正确的情况下,你的内存不够的情况下,你内存空间有重叠的情况下,默认的情况会将所有的字节清成零。

  标准版本和安全C性能方面基本上一样的,安全C提供了其他类型的函数,Void、Unit16、Uint32,我做了一下测试,通过结果看出,void类型和Unit32类型差不多,Unit32内存不是很多的情况下,操作最快的,Unit16比较慢的,4K内存的时候,发现Void最快,Unit32稍微慢一点,两个版本测试中Unit16最慢的。使用过程中根据自己的需要选择不同的API。安全C提供了统一的处理方式。

  首先要定义安全C提供的API无,将自己定义的API设置成默认的处理方式,我们目前已经用到windows、MAC、Linux等系统。

  安全C命名方式和标准C不同,安全C含有case的时候,表明函数不区分大小写。大家可以看到红色的参数表示长度,黄色的长度表示初始化内容,标准C是相反的。使用过程中不注意的话,会导致函数的操作无效。这与安全C的统一习惯有关,安全C所有的目标紧跟在缓冲区后面。

  下面我们注意事项安全C,之所以安全有一个目标缓冲区强度检测到是否产生溢出,如果缓冲区长度传的不一样的情况下,传的长或者短了都会导致错误,如何避免发生错误呢?在使用之前要采用统一的培训,让所有的开发都了解如何使用它,一旦使用的注意事项,跟踪一些使用中常犯的错误,将错误总结经验经过培训和分享,使所有开发认识到使用安全C过程中哪些注意事项,如何正确使用。

  这是我们关于安全C使用统计,08、09、10年,08年很多,10年缓冲区域溢出问题降到原来的零头都不到。

  通过前面的介绍,我们看出这个方案虽然简单,确实很简单,但是它给我们第一点提示,当我们我在做渗透测试或者扫描工具代码的时候,有些问题不可能主动扫描的,如果从源头上做了一些测试,就可以保证很好的效果。第一点,从源头上避免缓冲区域溢出才是最有效的。第二点,无论做什么样的安全问题,还是SQL注入也好,我们想办法从源头避免这些问题最有效的。


  相关链接:

  OWASP2011演讲PPT下载专辑http://topic.it168.com/factory/owasp_2011/index.html
  OWASP2011专题报道http://safe.it168.com/topic/2011/11-7/OWASP2011/index.html

0
相关文章