尽管像银行、大型电商以及政府等大型机构在确保程序员写出最安全的软件上付出了巨大的努力:比如雇佣最有经验的程序员,使用昂贵的代码分析工具等等。但是媒体头条上还是经常可以看到大型组织出现的安全事故。
这的确让很多企业非常沮丧,管理者都可能在想同样的问题:为什么付出这么多努力还是不能确保系统安全呢?是什么原因导致这样的情况发生呢?本文从6个方面来解释为什么编写安全的代码只能解决安全的一小部分问题:
1,确保自己代码安全只是冰山一角
现代软件尤其是大型的银行系统软件都是由自己的编写的代码、开源软件、第三方提供的组件以及软件开发框架组成,现在几乎没有纯粹使用自己的编写的软件就能完成一个系统,这无论从软件思想和ROI方面考虑都是不现实的。研究标明通常一个现代软件里完全由本公司程序员编写的代码只占所有代码的10%到30%。所有即使是公司制定了最严格的代码安全规范同时每个程序员都有能并完美执行了安全编码规范,也只能解决最多20%的潜在问题。 这些仅仅只是冰山一角。
2,应用系统大部分代码安全不可控
根据金融机构的统计数据,大部分银行最少也有一般的软件系统都是从第三方买来的,有可能在买来的系统中做一些定制化的修改。这些软件通常是不提供源代码,所以企业也很难确保这些买来的软件的开发过程遵守安全代码开发最佳实践。正如我们所看到的,过去两年,许多知名度非常高的安全事故都是攻击第三方应用和IT供应量的漏洞。这个趋势会越来越明显。
3,想修补了已经为时已晚
在项目启动就制定并执行最佳代码安全实践效果是最理想的,但是不幸的在大部分大型项目开发,等意识到需要代码安全并制定规范和标准的时候,大部分功能都已经实现了,每个经历过大型项目的人都太熟悉这个场景了。这个时候想修复想通过重构代码去修复漏洞几乎不可能,重构大型软件需要非常程的时间,这在开发周期和人力成本都是不可承受的,带病上线是非常正常的事情。这些带着已知漏洞运行的系统只能寄希望虚拟防火墙补丁甚至是运气来防止灾难性的安全事故发生。
4,代码安全规范控制非常艰难
现代大型系统都已经告别小作坊的方式,大型系统通常需要很多程序员一起通力合作才能完成,这些程序员的能力,资历以及性格各方面都有非常大的区别,项目外包也是一大趋势,还有的大型公司的程序员工作在不同的地域,时区,文化,语言,国家,这些都给代码安全规范的统一完整实施带来巨大的困难,代价非常的大。
5,应用程序运行环境也存在漏洞
即使企业有非常强大的整合能力,能确保自己编写的程序和所有外部购买的程序都没有漏洞,但是应用程序还是得部署到各种运行环境里,比如 Java 程序需要 JVM,同时需要运行在各种 Web 容器里(比如 Apache Tomcat, WebLogic, JBoss, WebSphere 等等),这些环境漏洞是企业没有办法控制的,只能将所用到环境跟新到最新的版本。其他的漏洞只能听天由命了。
6,每个人都可犯迷糊的时候:
理想来说是每个人在写每一行代码的时候都能够遵循安全编码的最佳实践,这个本身就是违背基本规律的,每个人都有犯迷糊的时候,同时项目的进度,排期,以及各个部门的协调都会造成各种错误的发生。
尽管我们在这里详细的描述了仅仅通过安全编码是不能完全杜绝安全事故发生,但是安全编码对任何公司都是非常重要的,毕竟安全无小事,公司应该为开发者和安全编码制定政策和程序,提供安全意识培训,并结合各种代码扫描、分析工具,尽可能的减少代码漏洞的数目,对能承受修复漏洞需要付出的成本的大公司来说还是非常有意义的,它能有效的减少受到攻击的可能性。
大型为了确保安全还可以采用渗透测试和分析公司 Gartner 提出来的一项新兴技术,称运行应用程序自我保护功能 RASP 。这种方法实现在程序运行时进行安全检测和保护的能力,对防范零日攻击和 APT 有非常好的效果。