嘉定都市网

查看:2231 回复:0 发表于 2002-4-12 12:23
  • TA的每日心情
    郁闷
    2016-1-4 14:21
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    qrcode
    跳转到指定楼层
    楼主
    发表于 2002-4-12 12:23:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    如何发现安全漏洞 [复制链接]

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    如果一个程序有错误,并且只在某些特殊的情况下面出现,它并不是什么大问题。通常,你能够避开这些特殊的情况,使得程序中的错误故障不会发生危害。你甚至可以按照你的意愿,在你的程序中加入这些小小的“臭虫”。
        但是,有时有些程序处于安全界限的边缘位置。他们从另外的程序作为输入,但不是按照程序本来的存取方法。
      
        我们常见的一些例子:你从的邮件阅读器读取任何人给你发的邮件,然后显示在你的显示器上,而它们本不应当这样做的。任何被接在因特网上的计算机的TCP/IP栈都从因特网上的获得任何人的输入信息,并且能够直接存取你的计算机,而你的网上邻居们确不能这样。
      
        任何具有这种功能的程序都必须小心对待。如果在其中有任何的小错误,它就能在允许任何人-未被授权的人做任何的事情。具有这种特性的小“臭虫”被叫做“漏洞”或者更正式地被叫做“弱点”。
      
    这里有一些漏洞的共同特点。
      
    心理学上问题
      
        当你写软件的正常部分的时候,如果用户的操作是正确的,那你的目的是完成这件事。当你写软件的安全敏感部分的时候,你一定要使得任何没有被信任的用户都不可能完成操作。这意味着你的程序的很大部分必须在很多情况下功能正常。
      
        编制加密和实时程序的程序员精于此道。而最其程序员则由于他们的通常的工作习惯使得他们的于使他们的软件从未考虑安全的因素,换而言之,他们的软件是不安全的。
      
    变换角色漏洞
      
        很多漏洞是从不同的运行着的程序中发现的。有时是一个极小的错误或者及其普通的错误也会造成安全漏洞。
      
        例如,假设你有本来打算让你在打印你的文档之前想通过PostScript解释器预览它。这个解释器不是安全敏感的程序;如果你不用它,它一点也不会成为你的麻烦。但是一旦你用它来处理从别人那里得到的文件,而那个人你并不知道也不值得信任。这样你就可能招致很多麻烦。他人可以向你发送能删除你所有文件或者复制你所有文件到他人可以得到的地方的文档。
      
        这是大部分Unix TCP/IP栈的脆弱性的根源-它是在网络上的每个人都值得信任的基础上开发的,而被应用在这个并不如当初所想象安全的环境中。
      
        这也是Sendmail所发生的问题的根源。直到它通过审查,它一直是很多是漏洞的根源。
      
        再更进一步讲,当函数在合理的范围内使用时是安全的,如果不这样的话,他们将造成无法想象的灾难。
      
        一个最好的例子就是gets()。如果你在你控制输入使用gets()函数,而你正好输入比你预定输入大得多的缓冲区,这样,你就达到了你的目的。对付这个得最好的补丁就是不要做类似这样的事或者设定比原先大的多的缓冲区,然后重新编译。
      
        但是,当数据是来自非信任的数据源的时候,gets()能使缓冲器溢出,从而使程序能做任何事情。崩溃是最普通的结果,但是,你通常能地精巧地安排使得数据能象代码一样执行。
      
        这就是它所带给我们的...
      
    缓冲区溢出漏洞
      
        当你往数组写入一个字符串,并且越过了数组边界的时候,会发生缓冲器溢出。
      
    几个能引起安全问题的缓冲器溢出情况:
      
    1.读操作直接输入到缓冲区;
    2.从一个大的缓冲区复制到一个小的缓冲区;
    3.对输入的缓冲区做其他的操作。
      
        如果输入是可信的,则不成为安全漏洞,但也是潜在的安全隐患。这个问题在大部分的Unix环境中很突出;如果数组是一些函数的局部变量,那么它的返回地址很有可能就在这些局部变量的堆栈中。这样就使得实现这种漏洞变得十分容易,在过去的几年中,有无数漏洞是由此造成的。
      
        有时甚至在其他的地方的缓冲区都会产生安全漏洞——尤其是他们在函数指针附近。
      
    需要寻找的东西:
        没有任何边界检查的危险的函数:strcpy,strlen,strcat,sprintf,gets;
      
    带边界检查的危险的函数:
        strncpy snprintf--这些忽视字符串结尾标记的函数往往会把其他(可能是敏感的)数据复制到缓冲区中,这样就有可能破坏程序;strncat不存在这问题,但对于snprintf不敢肯定,而strncpy是绝对存在的;错误地使用strncat,这样会把一个空的字节放在数组的后面;
      
        安全-敏感程序的崩溃--任何崩溃都来自指针错误,而最多的这类错误来源于缓冲区溢出。
      
        尝试给安全敏感程序输入大的的输入——在环境变量中(如果环境变量没有被信任),在命令行参数中(如果命令行参数没有被信任),在未被信任的网络连接上读取了在未被信任的文件。如果他们把这些输入解释成为很多段,并试图利用这些庞大的数据段。这时,你就要当心系统或者程序的崩溃了。如果你遇到崩溃了,看看是否在你输入的地方发生。
      
        不正确边界检查。如果有好几百行代码都做边界检查,而不是被集中在两三处地方,那么其中出错的可能性会很大。
      
        一个全面安全解决方案是用带边界检查的编译系统重新编译所有的安全敏感程序。
      
        就我所知,Richard W. M. Jones 和Paul Kelly为gcc写的
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 转播转播 分享淘帖 支持支持 反对反对
    回复

    使用道具 打印 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    发表新贴 返回顶部