-
-
[翻译]安全代码审查的一个实用方法
-
发表于:
2017-4-5 08:19
4770
-
安全代码审查的一个实用方法
这篇文章是关于不同的代码审查技巧和它们在实际中的运用。
你将会学到:
什么是安全代码审查以及如何运用它来处理实际情况。
你需要了解:
基本的安全知识。
安全代码审查:
安全代码审查是一个发现存在潜在安全风险、最终导致应用不安全的代码段的过程。当漏洞在SDLC(软件开发生命周期)的早期被发现,将大大降低该漏洞带来的风险,而不像不安全代码在软件投入生产使用后才被发现。在SDLC过程中(图一),代码安全审查是在软件开发之后进行的,这意味着开发者可以在应用软件编写代码的过程中进行自我代码审查,或者由安全分析师来进行甚至两者都审查。开发者可能使用集成到IDE(Eclipse,MS等等)中的自动化工具同时进行代码编写和审计。除此之外,由于安全专家对安全问题有更为专业的视角,还可以请他们来审查被开发者遗漏的代码缺陷。
各种研究和调查表明,大约75%的攻击都是不安全应用内的不安全代码造成的。因此,代码审查是SDLC中必须严格进行的重要过程。过去,开发人员更多地注重软件的功能而忽视了安全问题。现在,随着日渐增多的攻击事件,他们代码审查意识逐渐增强。
图一
代码审查技术:
一般情况下,我们把代码审查分为两种:
1. 基于自动化工具的黑盒测试:
这种方法下,代码审计是通过使用不同的开源或商业工具进行。大多数软件开发者在编写代码时使用这些工具,安全分析师也时常使用。当进行组织化安全SDLC的代码审查和作为工具提供给开发者在开发过程中进行代码自我审查时,这些工具是非常有用的。此外,这些工具在分析代码库(包含数百万行代码)也是非常好用的。这些工具可以快速发现代码库里潜在的不安全代码,并提供给开发者或者安全分析师分析。
2. 手工白盒测试
这种方法,是手工对整个代码进行审查,一个单调乏味且烦人的过程。但是在这个过程中,一些自动化工具未能发现的漏洞可能被找出,例如商业逻辑问题。自动化工具主要能发现技术上的缺陷就像注入攻击,但是可能忽略其他安全漏洞例如授权问题。在白盒测试中,我们主要集中精力于存在潜在问题的代码而非逐行审查。那些潜在的脆弱代码将有更高的优先级。举个例子,C或C++中,如果我们要找复制功能的函数,便可检查是否存在strcpy()函数,因为我们都知道strcpy()易受到堆栈溢出攻击。我们也可能会检查软件中是否有定制的加密,这些通常都容易被自动化工具忽视由于它们只能辨别标准的算法。因此,要实现最好的效果,两者都必不可少,不过这还取决于代码量和审查的严格度。当下,众多复杂的应用软件被开发出来,我们不能无视上面提到的任何一点。
代码审查的优势:
网页应用中开发健壮的访问控制机制,众多的因素需要考虑。
1. 人力:在SDLC早期发现并解决安全漏洞所需的精力远少于后期进行维护的消耗。一旦带有漏洞的代码编译完成并且投入使用,后期的维护将会是一个极其烦人且耗时的工程。另外,在大型项目中最后时刻的修改可能会导致新的缺陷,进而影响软件整体的功能以及产品发布最后期限的确定。
2. 成本:成本直接与所需的人力成比例。同时,在生产环境下的漏洞修复需要更高的成本。当然,这是值得的,因为我们的费用的增多直接导致攻击者攻击成本的大幅提高。
3. 标准:一些标准,例如PCI,要求产品在安装前必须经过安全审查。因此,完全遵守SDLC的机构更有可能被认证。
4. 声誉:代码安全测试在早期消除了大量安全漏洞,这比单纯的黑盒测试安全的多。故此,产品被用户质疑及公司声誉由此损害的机率大大降低。
方法:
我的方法是基于标准流程的结合,不同的人,方法因人而异。
标准流程(图二)
图二
确定范围:
首先,你必须大概估计出进行审查的范围及所需花费的人力。同时,预算约束也应当确定。进行哪种审查?黑盒测试还是白盒测试?试着去理解软件的逻辑。记住你要找的漏洞类型,例如OWASP TOP10,SANS等等,你可以尽可能多地去尝试。这样,你就可以大概推断出哪些可以用工具挖掘,哪些用手工的方法更好。
漏洞分类:
你的优先考虑的是什么意味着你对哪些漏洞优先处理。举例来说,一个商业软件,你可能主要集中精力在其商业逻辑上并深入研究。由于自动化工具可以轻易地发现技术上的漏洞,可以优先处理这类漏洞。
下列是一些可供参考的分类:
授权
认证
注入漏洞
不恰当的错误处理/意料之外的缺陷
加密
审查和记录
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课