在软件安全系列选题的上一篇,我们分析了软件产品在需求设计阶段面临的安全风险和应对方式,根据软件开发生命周期,下一阶段将进入开发测试这一关键时期。该阶段的目标,是通过遵循一系列安全编码标准和流程,规范管理软件产品的开发过程,并通过各种深度验证手段,找出和解决所有的功能、质量和安全问题,以保证软件产品在部署时能够稳定安全地运行。
实施安全编码实践 生产安全健壮易用的代码
软件开发过程中,开发团队通过编写代码,以创建功能并实现项目的业务需求。代码作为软件的原始形态,其中潜藏的弱点漏洞和后门是导致安全事件频繁发生的根源,制定一套符合行业标准和最佳实践的编码规范,是确保软件安全的基础。
首先,黑客和网络犯罪分子不断改进他们的技术,利用软件和系统中的漏洞,如果没有安全编码规范,这些漏洞很容易被利用,导致未经授权的访问、数据篡改及泄露,以及经济损失或法律风险。其次,安全编码不仅关注软件的安全性,还强调代码的质量和可维护性,更高效、更易读的代码意味着未来的源代码更加健壮、缺陷更少,并有助于实现代码的复用,同时稳定的软件系统能够为用户提供更好的服务,降低运维成本。
通过遵循一些已经建立的安全编码标准,可以帮助开发团队避免或缓解大多数常见的安全问题。
目前,国际上影响力较大的包括CERT正在维护的针对C、C++、Java、Perl四种编程语言的安全编程指南;OWASP发布的《OWASP安全编码规范快速参考指南》,提供了一种综合的清单模式,从输入验证、输出编码、身份验证和密码管理、会话管理、访问控制、加密规范等十多个方面给出规范要求;国际标准《ISO27034 应用安全标准》,从软件开发组织和应用程序两个层面定义框架和流程,组织标准框架建立了一个应用安全生命周期参考模型,定义了各种上下文、流程、规范和职责,并且提供应用安全控制库,应用规范框架是每个应用的相关组织标准框架信息,保存了开发过程中的安全问题,并且验证应用安全的各种控制。
在国内,由CNCERT牵头起草的《GB/T 38674-2020应用软件安全编码指南》于2020年11月获批通过,从程序安全和环境安全两个方面提出了应用软件的安全编程通用规范。程序安全部分定义有关资源使用、代码实现、安全功能等方面的安全编程规范,环境安全部分定义应用软件的安全管理配置规范。此外,对于能够自动化验证的标准内容,可配合源代码合规性检测工具,对程序的合规性进行检查,从而切实帮助开发者提升软件的安全性。该标准独立于具体编程语言,提出通用的在编程时应采取的能够显著降低软件安全风险的解决方案,具有更强的普适性。
采取有效安全测试策略 评估验证软件的质量及安全性
除了安全编码,安全测试同样是这一关键阶段必不可少的步骤。这是对软件应用程序进行安全风险评估的过程,主要关注软件应用程序在面临潜在威胁和攻击时的表现,以及其抵御这些威胁的能力。通过软件安全测试,可以发现并修复潜在的漏洞、缺陷和弱点,以及不良编码实践,提高软件应用程序的安全性,确保其在运行过程中不会受到恶意攻击或数据泄露等风险。
安全测试技术经过多年的发展,目前业界常用的主要包括动态应用程序安全测试DAST、静态应用程序安全测试SAST、交互式应用程序安全测试IAST,以及模糊测试Fuzzing等方式。
DAST又被称作“黑盒测试”,是目前应用最广泛、使用最简单的一种安全测试方法,不需要访问源代码,测试人员无需具备编程能力,无需了解应用程序的内部逻辑结构,不区分测试对象的实现语言,通过在应用程序外部利用自动化工具模拟黑客攻击和恶意行为,采用攻击特征库来做应用程序运行时的漏洞发现与验证,具有较高的真实性,能发现大部分的高风险问题。还可以测试第三方组件、库和API,对于大型、复杂的应用程序具有较高可扩展性,但因更关注应用程序的功能而非代码质量和安全,不太适用于早期测试。
SAST又被称作“白盒测试”,基于静态代码分析技术,在不执行应用程序的情况下检查源代码、字节码或二进制文件中的安全漏洞和代码缺陷,对代码具有高度可视性,能够检测更丰富的问题。其优势在于可以在开发过程的早期就提供安全问题的预警,以减少漏洞修复的成本,而且测试对象更全面,除Web应用程序之外还能够检测APP的漏洞,可以通过持续集成/交付(CI/CD)工具自动化集成到DevOps流程中,也可以手动集成到开发工具中,集成度较高,支持多种编程语言的扫描和分析,可以满足不同项目的需求。
IAST结合了SAST的代码级别分析和DAST的运行时验证,因此被称作“灰盒测试”,漏洞检出率很高、误报率较低,同时可以定位到API接口和代码片段,通常通过代理模式、流量镜像模式或插桩模式来实现对应用程序的监控和分析。其通常需要对应用程序进行一些修改或配置,会增加开发和部署的复杂性,且由于需要在应用程序运行时进行分析,对运行环境有一定的依赖性,同时可能会对应用程序的性能产生一些影响。
Fuzzing是一种自动化测试技术,也被称作“随机测试”,通过向软件应用或系统组件注入大量随机或者特定的数据,以测试其对于错误、无效或异常输入的反应,以发现潜在的漏洞和其他类型的问题,方式包括黑盒模糊测试,还衍生出灰盒和白盒模糊测试。其容易实施且适用范围广,但需要大量的计算资源,同时需要处理大量的输出数据,当随机数据不能正确模拟真实使用场景时,也可能产生误报。
不同的安全测试技术本身没有优劣之分,不同的技术能够解决不同场景下的问题,需要开发团队能够因地制宜地选择对应的技术解决对应的问题,比如开发阶段代码检测适合使用SAST技术,DAST技术比较适合用于线上运行环境的监控,测试阶段适合使用IAST技术,Fuzzing可作为对其他测试技术的补充,降低软件维护成本并提升客户满意度。一个健壮的安全测试策略应该包括自动化和手动测试方法,以及常规和迭代测试的混合。
传统技术局限性成落地阻碍 AI应用前景凸显
在各种测试技术工具化落地应用的过程中,一些缺陷和瓶颈也慢慢浮现,随着软件开发流程的敏捷度和复杂度不断提高,传统技术的局限性被进一步放大,相关工具的高漏报、高误报、高门槛甚至成为其在市场推广中的最大阻碍。
在安全419与业内各软件安全领域厂商的交流中,我们观察到,AI技术的发展与应用,正在很大程度上弥补甚至革新传统技术的能力和效率。在代码检测方面,利用大模型的语义理解和推理能力,可以实现自动化的代码审查和漏洞检测,有效减少工具的错误,并可根据当前实际代码分析漏洞成因、利用方法和修复方案。通过对代码上下文的关联分析,能够智能地补全和生成符合最佳安全实践的代码,有效减少不良编码实践导致的代码质量和安全性问题。
举例来看,传统的SAST工具,普遍采用规则引擎,基于事先定义的规则集来检测潜在的漏洞,一般会出现30%以上的误报,本质原因是软件缺陷的高复杂性难以通过静态的形式化规则完全描述,此时只能通过专家修改规则来降低误报率,但是由此可能增加新的漏报。
海云安研制的开发者安全智能助手D10,通过大语言模型对源代码检测平台的检测结果进行自动化的误报判断,有效降低误报率,并且结合用户实际业务代码,生成针对性的缺陷成因解释,使用户可以更加直观地理解缺陷产生的原因,再结合缺陷的具体情况和上下文生成可直接应用于缺陷修复的代码修复方案,能够帮助用户更快速、高效地解决问题。
酷德啄木鸟推出一款CodePecker AI代码审计助手,利用大语言模型处理能力,可以快速地对大量的代码审计结果进行分析和评估,节省审计人员的时间和精力,降低对人才的专业能力要求,做到智能识别、智能分析、智能修复并提供修复建议。
又如传统的Fuzzing工具,面临测试驱动开发难度大、种子变异效率低,以及安全缺陷修复成本高等挑战,云起无垠对此提出了基于“微调代码模型+代码详细结构+反馈”的驱动生成方案,核心思路如下:专家模型训练,根据驱动生成训练语料,训练专用于驱动生成的代码大模型;驱动生成,通过静态分析引擎提取被测函数的上下文信息,构造生成测试驱动的提示词,再通过强化学习后的代码大模型输出测试驱动代码;反馈优化,运行生成的驱动,监控运行情况,获取反馈信息,优化生成驱动的提示词,最终实现更高的验证通过率。
经过Google benchmark验证,云起无垠的生成策略生成了24个测试驱动,仅有22%无效驱动,优于Google的方案,表现出更高的可编译驱动比例和更低的无效驱动比例。
尾 声
总之,开发测试阶段是软件安全开发流程中极为重要的环节,软件应用程序的绝大部分功能、性能、质量、安全问题需要在这个阶段发现并解决,从而评估系统面临的各种潜在威胁和攻击时的安全性,并保障整个系统的稳定性和可靠性,同时还在于增强开发团队和用户的安全意识和风险意识,加强系统的安全性保护和管理。而除了本篇讨论的自研编码情形,如今对开源组件以及AI生成代码的大量应用,也引入了大量新生风险,导致了影响巨大的供应链安全事件,我们将在后续的篇章中展开分析。