首页
社区
课程
招聘
[翻译]安全代码审查的一个实用方法
发表于: 2017-4-5 08:19 4630

[翻译]安全代码审查的一个实用方法

2017-4-5 08:19
4630

安全代码审查的一个实用方法

这篇文章是关于不同的代码审查技巧和它们在实际中的运用。

你将会学到:

什么是安全代码审查以及如何运用它来处理实际情况。

你需要了解:

基本的安全知识。

安全代码审查:

安全代码审查是一个发现存在潜在安全风险、最终导致应用不安全的代码段的过程。当漏洞在SDLC(软件开发生命周期)的早期被发现,将大大降低该漏洞带来的风险,而不像不安全代码在软件投入生产使用后才被发现。在SDLC过程中(图一),代码安全审查是在软件开发之后进行的,这意味着开发者可以在应用软件编写代码的过程中进行自我代码审查,或者由安全分析师来进行甚至两者都审查。开发者可能使用集成到IDEEclipseMS等等)中的自动化工具同时进行代码编写和审计。除此之外,由于安全专家对安全问题有更为专业的视角,还可以请他们来审查被开发者遗漏的代码缺陷。

各种研究和调查表明,大约75%的攻击都是不安全应用内的不安全代码造成的。因此,代码审查是SDLC中必须严格进行的重要过程。过去,开发人员更多地注重软件的功能而忽视了安全问题。现在,随着日渐增多的攻击事件,他们代码审查意识逐渐增强。

图一

代码审查技术:

一般情况下,我们把代码审查分为两种:

1.  基于自动化工具的黑盒测试:

这种方法下,代码审计是通过使用不同的开源或商业工具进行。大多数软件开发者在编写代码时使用这些工具,安全分析师也时常使用。当进行组织化安全SDLC的代码审查和作为工具提供给开发者在开发过程中进行代码自我审查时,这些工具是非常有用的。此外,这些工具在分析代码库(包含数百万行代码)也是非常好用的。这些工具可以快速发现代码库里潜在的不安全代码,并提供给开发者或者安全分析师分析。

2.  手工白盒测试

这种方法,是手工对整个代码进行审查,一个单调乏味且烦人的过程。但是在这个过程中,一些自动化工具未能发现的漏洞可能被找出,例如商业逻辑问题。自动化工具主要能发现技术上的缺陷就像注入攻击,但是可能忽略其他安全漏洞例如授权问题。在白盒测试中,我们主要集中精力于存在潜在问题的代码而非逐行审查。那些潜在的脆弱代码将有更高的优先级。举个例子,CC++中,如果我们要找复制功能的函数,便可检查是否存在strcpy()函数,因为我们都知道strcpy()易受到堆栈溢出攻击。我们也可能会检查软件中是否有定制的加密,这些通常都容易被自动化工具忽视由于它们只能辨别标准的算法。因此,要实现最好的效果,两者都必不可少,不过这还取决于代码量和审查的严格度。当下,众多复杂的应用软件被开发出来,我们不能无视上面提到的任何一点。

代码审查的优势:

网页应用中开发健壮的访问控制机制,众多的因素需要考虑。

1.  人力:SDLC早期发现并解决安全漏洞所需的精力远少于后期进行维护的消耗。一旦带有漏洞的代码编译完成并且投入使用,后期的维护将会是一个极其烦人且耗时的工程。另外,在大型项目中最后时刻的修改可能会导致新的缺陷,进而影响软件整体的功能以及产品发布最后期限的确定。

2.  成本:成本直接与所需的人力成比例。同时,在生产环境下的漏洞修复需要更高的成本。当然,这是值得的,因为我们的费用的增多直接导致攻击者攻击成本的大幅提高。

3.  标准:一些标准,例如PCI,要求产品在安装前必须经过安全审查。因此,完全遵守SDLC的机构更有可能被认证。

4.  声誉:代码安全测试在早期消除了大量安全漏洞,这比单纯的黑盒测试安全的多。故此,产品被用户质疑及公司声誉由此损害的机率大大降低。

方法:

我的方法是基于标准流程的结合,不同的人,方法因人而异。

标准流程(图二)

图二

确定范围:

   首先,你必须大概估计出进行审查的范围及所需花费的人力。同时,预算约束也应当确定。进行哪种审查?黑盒测试还是白盒测试?试着去理解软件的逻辑。记住你要找的漏洞类型,例如OWASP TOP10SANS等等,你可以尽可能多地去尝试。这样,你就可以大概推断出哪些可以用工具挖掘,哪些用手工的方法更好。

漏洞分类:

  你的优先考虑的是什么意味着你对哪些漏洞优先处理。举例来说,一个商业软件,你可能主要集中精力在其商业逻辑上并深入研究。由于自动化工具可以轻易地发现技术上的漏洞,可以优先处理这类漏洞。

下列是一些可供参考的分类:

   授权

   认证

   注入漏洞

   不恰当的错误处理/意料之外的缺陷

   加密

   审查和记录

   与时间相关的漏洞(时间管理)

   不安全的配置

几点建议:

作为安全分析师,滤除工具产生的错误结果,确保找到的都是有效的安全漏洞,这是我们的职责所在。代码审查完成后,你应当把发现的安全缺陷记录在综合报告上并附带漏洞分类及解决方案。你还可以更进一步,推荐安全代码。我个人习惯在报告尤其是Excel文件中附上一小段代码。

这就是我自己做代码安全审查的步骤。下面的观点是到目前为止我在代码审查的经验之谈。我仍然还有许多需要学习的地方,因此,在某些情况下,有些观点可能不准确。

手工审查不可少:

   自动化代码审查是运行像RationalOunce LabsParasofton的扫描工具批量产生结果的过程。扫描工具基于对漏洞代码的感知而标记该代码。接下来区分扫描结果的正确和错误,这是审计员的工作。这就是痛苦的开端,由于你并非熟悉每一种编程语言。这时候参考每一种语言的具体资源就显得非常有必要了。现在,我已经熟悉了主流语言(.NETJavaPHP)的各种安全缺陷。在黑盒测试中,你无法预测哪里会是问题所在。

首先和开发者沟通:

在审查中,开发者参与的越多,审查就越有效。一方面,基于对代码的正确理解,无论你做什么,你都将感到自信。另一方面,开发者也将因为你让他们放心(而不是直接公布漏洞)而感到愉快。

手头准备笔记本和笔:

理解软件的工作流程。推断出的问题来源以及其在代码中的实现对于找出真正的漏洞至关重要。例如,看到代码段负责软件的输入并且影响软件的其他部分,这并非意味着存在跨站脚本漏洞。这里,再次与开发者交流,他们或许采取了输入集中过滤或者确认机制。因此,别急于下结论。

使用高级文本编辑器:

文本编辑器应当能在整个代码库中搜索字段。例如Notepad++,该编辑器搜索并高亮显示所有相关字段,这将帮助你把各个片段连接成一个整体视图。

准备充足的时间:

   为了找到真正的漏洞,需要在不同的地方运用不同的思路,因此,尽量要求你的客户提供足够的时间来完整的完成审查。

保持网络链接:

   代码审查中遇到一些从未见过的令人厌烦的术语,函数,方法,Google等网络手段将极大地帮助你理解同时节省时间。

在应用程序的上下文中找到漏洞:

你不仅要找出真实有效的漏洞——减少问题的总数,还要提出合理的对策。那将使开发者高兴和放心。扫描器会将问题分别标记为高、中、低危险等级,根据应用程序的实际情况,确定它们的实际级别是你的责任。

每个人都爱惜自己的程序:

   程序就像是程序员的孩子。别一味地指责他们的缺点,对其中健壮的安全机制不妨赞赏一二。这样,你和开发者们将更友好的相处、交流,他们也将更愿意配合你一起审查代码,两者皆欢。

培训程序员:

   最后但并非最不重要的,在实践中向开发者培训漏洞相关知识。给他们提供培训,鼓励及让他们参与软件投入生产前的代码审查。让他们体会到代码审查的好处。如果有可以作为插件安装到IDE的扫描工具,给他们的机器都安装上。这样他们就能在开发的同时进行代码审查了。

实例(Owasp WebGoat项目):


String username = “”;
String password = “”;
username = s.getParser().getRawParameter(USERNAME);
password = s.getParser().getRawParameter(PASSWORD);
……………..
………..……
String query = “SELECT * FROM user_system_data WHERE user_name = ‘”
+ username + “‘ and password = ‘” + password + “‘”;
ec.addElement(new StringElement(query));


通过getRawParameter获得用户输入,并将其赋值给‘username’‘password’两个变量,同样的,他们未经检查便直接的代入SQL查询以及动态查询中。因此,我们如果要找到数据库(本处为getRawParameter)的所有入口,我们可以先检查注入点。即使我们查找的SQL查询语句被用于代码中,只要它代入动态查询,依然可能存在SQL注入。

 

参考网址:

https://www.owasp.org/index.php/Category:OWASP_Code_Review_Project

https://www.owasp.org/images/2/2e/OWASP_Code_Review_Guide-V1_1.pdf

 

 

 

 

原文:http://resources.infosecinstitute.com/secure-code-review-practical-approach/

                                                                                                                                     / 看雪翻译小组 StrokMitream



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
好东西。。谢谢分享
2017-4-5 09:47
0
游客
登录 | 注册 方可回帖
返回
//