这些天来,我对软件安全感兴趣。当我阅读论文时,我看到有许多攻击,研究人员正在尝试为软件发明新方法以获得更安全的系统。
这个问题可以是一个普遍的问题,包括所有类型的攻击。SO中有很多经验丰富的程序员,我只是想了解使用什么来检查您的代码以防止这些攻击?有没有你使用或不关心的工具?
例如,我听说过静态/动态代码分析和模糊测试。
- SQL注入攻击
- 跨站脚本
- 缓冲区溢出攻击
- 逻辑错误
- 任何类型的恶意软件
- 隐蔽通道
- ……
谢谢
这些天来,我对软件安全感兴趣。当我阅读论文时,我看到有许多攻击,研究人员正在尝试为软件发明新方法以获得更安全的系统。
这个问题可以是一个普遍的问题,包括所有类型的攻击。SO中有很多经验丰富的程序员,我只是想了解使用什么来检查您的代码以防止这些攻击?有没有你使用或不关心的工具?
例如,我听说过静态/动态代码分析和模糊测试。
谢谢
我将在这里专注于 Web 应用程序的安全性......
真的,您想习惯于手动浏览网站/应用程序并使用各种参数等。因此代理工具很有帮助(它们允许您在表单到达服务器之前捕获并与之交互):
LiveHTTPHeaders - FireFox 插件。
Burp 代理- 基于 Java。
显然,手动爬取整个网站变得相当耗时/乏味,这就是自动扫描工具可以提供帮助的地方。
黑盒子:
WebSecurify - 没有使用它,但它是由一个著名的网络应用程序安全专家创建的。
Skipfish - 谷歌最近发布了这个,所以它可能值得一看。
还有许多其他商业工具:WhiteHat Sentinel、HP Web Inspect 以及可能还有很多我不记得的工具。
白盒:
我看到的很多学术研究都与静态代码分析工具有关;我没有使用任何,因为它们都只专注于 PHP 并且有一些限制。
其他资源:
ha.ckers.org - 很棒的博客,有一个与 web app sec 相关的活跃论坛。 OWASP - 如前所述,这里有很多有见地的文章/指南/教程。
如果您想了解有关手动攻击网站的更多信息,Damn Vulnerable Web App是一个不错的学习项目。我的意思是,它是一个故意编写不安全的 Web 应用程序,因此您可以合法地测试您对 Web 应用程序安全漏洞的了解。
我在第三年的论文中用 Perl 编写了一个黑盒扫描仪,这是一个非常有趣的项目。如果你想自己构建一些东西,它实际上只包括:
你没有提到但我认为很重要的东西:代码审查。
当您只是想尽可能快地实现某些东西时,很容易忽略安全问题。第二双眼睛可以发现许多问题或潜在问题,尤其是在审阅者在发现典型安全漏洞方面经验丰富的情况下。
我相信在很多情况下可以在没有特殊工具的情况下进行手动代码审查。只需坐在同一台计算机上,甚至打印出代码并在纸质副本上进行审查。但是由于您特别要求工具,因此可以帮助进行手动代码审查的工具是Rietveld。我自己没有使用过,但它基于 Google 内部使用的相同想法(由同一个人编写,他也恰好是 Python 的作者)。
安全性绝对是一个问题,开发人员至少应该了解常见的漏洞(以及如何避免它们)。以下是一些我觉得有趣的资源:
有两种类型的软件缺陷会导致安全问题:实现错误和设计缺陷。
实现错误通常出现在代码中的特定区域,它们相对容易检测并且(通常)修复起来不太复杂。您可以使用执行静态代码分析的自动化工具(如 Fortify 或 Ounce 之类的工具)检测(大多数)这些工具,尽管这些工具很昂贵。话虽如此,您仍然必须记住没有“灵丹妙药”,并且您不能盲目地仅依赖工具输出而无需进行某种手动代码审查来确认/了解工具报告的问题背后的真正风险。
另一个问题是设计缺陷,那是另一回事。它们通常是复杂的问题,不是代码错误的结果,而是应用程序设计或架构中的错误选择。这些无法通过自动化工具识别,实际上只能通过代码/设计/架构审查手动检测。通过设计阶段来修复它们通常非常困难且昂贵。
因此,我建议,检查您的代码是否存在可能影响安全性的实施错误(使用 Fortify/Ounce 等自动化工具进行代码检查 + 手动检查工具结果)并检查您的设计是否存在安全漏洞(无需为此使用任何工具)由了解安全的人提供)。
要深入了解软件安全性和设计安全软件背后的复杂性,请查看软件安全性:构建安全性,作者 Gary McGraw(亚马逊链接)
我使用工具来帮助寻找漏洞,但你不能只是启动一些测试并假设一切正常。当我审核一个项目时,我会查看代码并尝试了解程序员的风格和技能水平。如果代码看起来很乱,那么他们很可能是新手,他们可能会犯新手错误。
识别项目中的安全相关功能并手动审核它们很重要。 Tamperdata对于手动审计和漏洞利用开发非常有帮助,因为您可以构建自定义 http 请求。手动审计 PHP 的一个很好的例子是:他们是在使用mysql_real_escape_string($var)
还是在使用htmlspecialchars($var,ENT_QUOTES)
来停止 sql 注入?(ENT_QUOTES 不会停止反斜杠,这与 mysql 的引号一样危险,mssql 是另一回事。)安全功能也是“逻辑错误”出现的地方,没有工具能够检测到这一点,这需要人工审核。
如果您正在进行 Web 应用程序测试,那么Acunetix是您可以使用的最佳测试工具。Wapiti是一个非常好的开源替代品。尽管任何工具都可能被不当使用。在进行 Web 应用程序测试之前,请确保打开了错误报告,并确保您没有抑制 sql 错误,例如使用 try/catch。
如果您正在对缓冲区溢出等漏洞进行自动静态代码分析,那么Coverity是您可以使用的最佳工具(Fortify 与 Coverity 几乎相同)。Coverity 的成本高达数万美元,但国土安全部等知名人士使用它。 大鼠是一种开源替代方案,尽管 Coverity 是一种复杂得多的工具。这两种工具都会产生大量的误报和漏报。RATS 寻找讨厌的函数调用,但不知道它是否仍然安全。因此 RATS 将报告对 strcpy() strcat() sprintf() 的每次调用,但如果您只是复制静态文本,这些可能是安全的。这意味着您将不得不挖掘很多废话,但如果您正在进行同行评审,那么 RATS 通过缩小手动搜索的范围有很大帮助。如果您试图在大型代码库(如 Linux)中找到单个可利用的漏洞,那么 Rats 不会有太大帮助。
我使用过 Coverity,他们的销售团队会声称它将“检测到您代码库中的 ***ALL**** 漏洞”。但我可以从第一手经验告诉你,我发现基于 vanilla 堆栈的缓冲区溢出了Coverity 没有检测到的桃子。(但是,RATS 确实发现了这些问题,以及 1,000 多个其他安全的函数调用......)如果你想要一个安全的应用程序或者你想找到一个可利用的缓冲区溢出,那么 Peach 是你可以用来构建的平台工具您需要的工具。
如果您正在寻找更奇特的内存损坏问题,例如悬空指针,那么Valgrind会有所帮助。
工具不知道您的代码是否不安全。
只有你这样做(和攻击者)。
该工具最多只能在您的代码中发现一些类型的漏洞,并让您意识到您从未针对该类型的漏洞进行保护,但您仍然需要清理该工具遗漏的所有实例。