$('.search-form-inner .searchdisplayico').click(function(event) { var evt = evt || event; evt.stopPropagation(); $(this).siblings('.search-col').addClass('active'); }); $('.search-form-inner .search-col').click(function(event) { var evt = evt || event; evt.stopPropagation(); $('.search-form-inner .search-col').addClass('active'); }); $(document).click(function() { $('.search-form-inner .search-col').removeClass('active'); }); -->
投稿 做源头上的安全:内建安全源码保障
360代码卫士
一、信息化建设的核心要素
当今社会,信息技术已经成为人们生产生活中不可或缺的内容,世界大多数国家都把加快信息化建设作为发展战略。信息化建设涉及的范围、领域非常广泛,但大致可以分为国家层面和企业层面。其中,国家层面建设的主要是关键信息基础设施,指一旦遭到破坏,可能严重危害国家安全、国计民生、公共利益的信息系统;企业信息化建设指通过信息技术的部署来提高企业的生产运营效率,增加企业收益和持续经营的能力。因此,这些信息系统对于国家或企业的发展至关重要,其安全性更是不容忽视。
虽然信息化建设涉及的领域很多,但总体而言,主要包括硬件设备、软件程序和信息数据三大部分,但对于硬件设备的控制、对于信息数据的操作处理也需要软件来实现,因此软件是系统的“灵魂”,而程序代码是软件的具体呈现形式,难怪Gartner公司简意赅地指出:“基础设施即代码” 。可见,代码是信息化建设中的核心要素,是信息系统或基础设施中安全防护的重点。
信息技术采购全球化的发展态势使得国家或企业信息系统的产品来源更加多元化,信息技术供应链更加复杂。软件构建方面更是如此。许多情况下,软件系统是来自世界各地的代码组合起来的,包括自主开发的、商业购买的、开源提供的、外包开发的等。VeraCode公司曾统计过,30%-70% 包含自主开发软件的代码也含有第三方代码,并多以开源组件、商业或外包共享库/组件的形式存在。这种方式提高了软件开发的效率,但对其安全性和可控程度无疑是巨大的挑战。尤其近年来Struts2、 OpenSSL等应用非常广泛的基础开源组件高危漏洞频现,伊朗“震网”、乌克兰“黑暗能量”等基于基础软件漏洞的恶意程序肆意侵入工控系统,让国家和企业对软件供应链、开源软件、关键信息基础设施中软件安全性的关注程度逐渐提高,某些内容在国家法规和战略中已有所体现。
为了保障软件安全,能够“尽早、尽快”发现并修复软件系统中漏洞的方法是急迫所需的,这正是内建安全(BuildSecurity In,BSI)的开发方式提倡的。源码作为软件的原始形态,具备丰富的语义信息,对于它的保障能够尽早且较为全面的发现软件中的问题,符合 BSI的原则,越来越多的机构和个人也意识到了其在高效保障软件系统安全方面的作用。
二、内建安全的体系化方法
目前,企业针对信息系统的安全措施仍主要集中在临近上线时的渗透测试或安全审计,以及上线后的防火墙等被动防御方法。这种方式使得漏洞发现的时机较晚,造成修复代价高昂,而且一些基于业务逻辑的攻击在上线后也难以发现。
上述将安全与开发割裂的做法被证明越来越不适应信息系统建设对安全性的需求,由于大量安全措施都应用在开发过程之外,问题不能及时反馈给开发人员。针对这些局限性,10多年前,BSI的思想被提出,具体而言就是把各种安全实践内建到软件开发的各个关键环节之中,利用自动化技术从源头上尽早、尽快、持续、以团队共同协作的方式发现安全缺陷,提高解决安全问题的效率。 BSI通过开发团队中已有的角色实施安全措施,利用自动化安全分析和测试技术快速地发现安全问题,以达到全方位的安全开发。但是,由于资金和意识等方面的限制,目前能够深刻理解BSI并实际运用的企业还很少。
微软提出的安全开发生命周期(SecurityDevelopment Lifecycle,SDL)无疑是BSI 思路的最佳实践之一,微软已将其作为强制策略应用于自己产品的开发中。SDL从漏洞产生的根源上解决问题,通过对软件工程的控制,保证产品安全性。SDL将安全实践贯穿于软件开发和运维的 7个阶段:在培训阶段,对开发、测试人员、项目经理、产品经理等进行安全知识培训;在需求分析阶段,确定安全要求、Bug列表,并进行安全风险和隐私风险评估;在系统设计阶段,详细考虑安全和隐私问题,进行攻击面和威胁建模分析;在编码实现阶段,选择安全性更高的编译器,禁用不安全的 API,并在工具辅助下对源代码进行静态分析,对结果进行人工审计;在测试验证阶段,进行模糊测试、渗透测试等动态分析,并对之前的威胁模型和攻击面分析结果进行验证;在发布和响应阶段,将软件存档,确立事件响应计划,并进行最终的安全评析。具体如下图所示。

<img alt="israbye FreeBuf.COM" src="http://image.3001.net/images/20171011/15077025915927.png!small" width="558" height="127"></p>
SDL是一种针对传统瀑布型开发方式的安全模型,随着对软件开发质量和效率要求的不断提高,以DevOps为代表的敏捷开发方法得到推崇。在此基础上,Gartner 公司于2012年推出了DevSecOps的概念,旨在将安全融入敏捷过程中,即通过设计一系列可集成的控制措施,增大监测、跟踪和分析的力度,优化安全实践,集成到开发和运营的各项工作中,并将安全能力赋给各个团队,同时保持“敏捷”和“协作”的初衷,架构如下图所示。
网友评论