Web安全专家访谈
作者:Rob Kenworthy(罗布·肯沃)
翻译:紫郢剑侠,2015-09-28第1版
Web安全专家谢里夫·库萨(Sherif Koussa)的观点可能会改变你对web应用程序安全性的许多想法。
大多数开发人员可能都知道一些安全常识,他们天真地认为凭这些就足以保障自己开发的应用程序安全。直到大约一年前我还不愿承认这一点。除非开放Web应用安全项目(Open Web Application Security Project,OWASP),跨站脚本(Cross-site Scripting),注入(Injection),缓解因素(Mitigating Factors),动态和静态代码分析(Dynamic and Static Code Analysis)和渗透测试(Penetration Testing)等诸如此类的术语经常从你的嘴里冒出来,你可能也不愿承认。
在近期的网络安全话题中,黑客丑闻甚嚣尘上,其中就包括Impact Team的黑客,他们窃取了AshleyMadison.com的数据并在互联网上发布。在刚刚过去的这个星期里,我获得了与我的同事、网络安全专家谢里夫·库萨交流的机会。谢里夫从事安全业务已有8年,为富国银行(Wells Fargo),德信银行(Desjardins),卡尔顿大学(Carleton University),发现(Discover)这样的大客户和大量加拿大政府客户提供服务。他也是GIAC的GSSP-JAVA和GSSP-NET考试指导委员会的一员。此外,谢里夫曾撰写过一些SANS课程和GIAC考试的课件。如果这些仍然不够份量,谢里夫还领导着OWASP的渥太华分会,并且是OWASP的WebGoat5.0的主力。换句话说,当谢里夫会谈论安全时,我需要聚精会神地倾听......你也应该这么做。为此,我将我们的交流对话整理发表出来,以便其他人可以从中受益。
最常见的攻击是什么? 这实际上取决于你看问题的角度。从应用程序安全的角度来看,OWASP漏洞列表top 10似乎仍是我们在不同应用程序中发现的漏洞的真实反映。与.NET之类的其它语言平台不同,SQL注入和命令注入攻击,特别是跨站点脚本注入攻击,对Java应用程序影响很少,这是因为Java平台不像.NET或Ruby-on-Rails那样自动支持其他平台。
换一个角度来看,恶意软件似乎是一个日益危险和日益复杂化的问题。攻击者使用常见的方式来投递恶意软件载体,如电子邮件附件,电子邮件中的链接,游戏等,而这些载体通常攻击那些尚未修补的知名漏洞或没有可用补丁的零日漏洞。
是不是任何一个语言/平台都有软肋? 是的,有些平台提供了更多的开即用的安全保护和功能。新平台似乎比旧的好。例如,node.js提供的堆栈似乎超过了Ruby on Rails,Ruby on Rails的似乎超过了.NET,.NET的似乎又超过了Java等。但这并不是真正的优势,因为总有办法来关闭这些功能,或者绕过这些限制。因此,更进一步来看,.NET附带了一些防止跨站点脚本的开即用保护。这项保护不是很大,却足以让一些跨站点脚本攻击源失效,但我们看到许多开发者禁用这项保护,因为它打乱了他们的一些特性。另外一个例子,.NET提供了一个非常简单的CSRF缓解功能,但没有吸引到多少开发者来使用。即使在Java中,PreparedStatement使用非常普遍,99%的开发者都在用,但你猜怎么着,攻击者会发现使用串连接语句而不PreparedStatement的那1%,并充分利用这一点,访问未经授权的敏感信息,甚至危及整个网络。请记住,防御者始终处于劣势。因为防御者必须解决所有的漏洞,而攻击者只需要一个漏洞。当开发者知道他们正在保护什么,为此需要做些什么,什么平台提供了与此相关的开即用功能,以及需要做什么来弥补差距时,开发者们开始具有优势。这结合对攻击者的方法和思维方式的了解,如此他们才能夺回优势,并掌控他们的应用程序和数据,而不是被控制。
你对没有应用安全专家的IT企业有什么建议?
虽然不是所有的IT企业都拥有内部应用程序的安全专业知识,这并不意味着他们不能编写安全的应用程序。安全的代码可以与高质量代码媲美。要发布没有错误的高质量代码,你不仅必须拥有可以编写出好代码的开发人员,而且必须拥有好的质量保证工程师来测试代码,或一个真正坚实广泛的测试用例集,而不仅仅只是编写和发布代码。你不能只依赖于质量保证工程师来发现一切。这同样适用于安全性。软件开发人员必须编写安全的代码 - 使用预备语句,过滤器,并净化用户输入等。然后由应用程序安全专家来查缺补漏。安全专家的作用是找出那些漏网的漏洞或测试应用程序对最新出现的威胁和攻击的防御能力。为了营造内部稳固的安全实践,企业应该从提高安全攻击和企业风险意识开始。随后,遵循下列这些简单的步骤:
1.为SDLC(Systems Development Life Cycle 系统开发生命周期 或 Software Development Life Cycle软件开发生命周期) 增加低维护成本的安全接触点,例如安全设计审查,可以是轻量级的安全检查列表或安全特性静态代码分析工具。
2.逐步地提高安全漏洞的门槛,这可以通过自定义安全准则或公司的常规代码审查来实现。
3.Appointing someone as a security champion for people to ask questions helped a lot of organizations.
3.将提出的问题对组织帮助很大的人任命为安全捍卫者(security champion)。
这些都只是一些例子,企业组织不需要额外招聘工作人员或预算拨款就能实施。当然,具体措施取决于每个组织当前的进展以及目标。
在做好咨询工作之余,你还从事其他研究吗? 我们目前正在研究的工作中有一个很酷的东西,是一个帮助企业对使用不同开源组件和库带来的风险进行比较的工具。如果你要选择一个新的开放源代码段,它也可以帮助你选出最安全的软件,让你了解其中的风险来自何处,最终如何处理它。
最后,你可以描述一下作为一名安全顾问,一天的生活通常是怎么样呢? 作一名安全顾问的乐趣和挑战之一是各种各样的工作。大多数客户要求做评估工作,但他们都有不同的技术数据(即不同的基础架构,编程语言,框架,网络与手机等)。评估工作通常包括安全代码审查(其中包括静态代码分析和手工代码审查)和动态评估(包括漏洞扫描和渗透测试)。除了评估工作,我还进行了自己的安全研究,创建和更新培训材料,当然也发表这些培训材料。