【摘 要】本文结合对应用系统设计、开发、测试、测评等建设过程的分析,总结了外包应用系统开发中存在的安全保密风险,并根据应用系统安全建设和测评经验,结合安全开发生命周期等安全开发管理理念,研究了应用系统外包开发中源代码安全风险管控技术和策略,以期从源头减少应用系统自身安全漏洞和风险,提升信息系统安全防御水平。
【关键词】应用系统 外包开发 安全保密风险
1 引言
应用系统是信息系统中信息分发、传递、共享的主要工具,同时是业务管理的数字化基本设施,在信息网络中处于信息传递的核心。随着企业数字化转型的不断推进,各单位为满足各种业务需要建设了各类业务应用系统,如财务系统、人力管理系统、项目管理系统等。但由于应用系统开发建设具有专业性、复杂性,一般需要专业的软件开发团队进行建设,而大部分单位不具备自行开发应用系统的能力,应用系统外包开发成为主流的建设方式。随着网络攻防技术的发展,越来越多的安全漏洞在各类应用系统中被发现,根据Forrester调研,仅Web类安全漏洞就占2021年发现安全漏洞的39%,由此可见应用系统已成为网络攻防双方的主战场之一。因此,如何管控外包开发应用系统源代码安全漏洞,从根本上有效减少安全漏洞,保障应用系统安全成为各单位信息化和网络安全管理部门面临的重要议题。
2 外包开发中的源代码安全风险分析
在对外包应用系统进行测评的过程中,存在以下风险。
(1)现行相关标准对安全要求较高,但对开发厂商的安全开发能力、开发质量缺少直观的考核和选择指标,导致部分开发厂商不注重安全开发能力的建设和开发质量的提升,一些应用系统的开发过程管理混乱,缺少源代码安全的管理与技术措施,甚至在互联网中开展代码管理,极易引入安全风险,部分应用系统安全质量没有保障。
(2)在编程实现阶段,随着开发技术的迅猛发展,部分中小厂商或建设使用单位为追求新技术应用,开发中大量采用未经安全检测的开源框架、开源组件等第三方代码进行快速迭代开发,对使用了哪些开源组件或开源组件的哪个版本并不了解。建设使用单位对使用开源组件、开源代码的情况缺少要求和限制,给应用系统带来不可控的安全风险。
(3)在验收和上线运行阶段,建设使用单位主要对应用系统业务功能进行测试验收,缺少对源代码安全漏洞、业务逻辑漏洞等的安全性测试,缺少开发人员参与的安全加固,往往不知道是否存在安全漏洞,对已发现的安全漏洞不知如何修复,导致应用系统“带病上线”“带病运行”。
3 对外包开发的安全风险管控措施实践
为保障应用系统源代码安全质量,微软提出从安全管理角度指导应用系统开发过程的安全开发生命周期(Security Development Lifecycle,SDL)理念,经过世界主流厂商多年实践和不断改进,发展成为安全—软件开发生命周期(Secure Software Development Lifecycle,S-SDLC)等方法论,其理念是将安全与软件开发全过程融合,通过在软件开发生命周期中每个阶段执行必要的安全实践,使安全风险最小化、安全威胁最少化。SDL的实施在一定程度上降低了发布运行后安全漏洞的数量,被各大软件厂商广泛采用。
但是,SDL、开发安全运维一体化(DevSecOps)等安全开发理念都主要是针对开发厂商的实施或实践方法,对应用系统建设使用的甲方单位,特别是在外包开发的场景下,甲方单位也迫切需要介入整个安全开发过程中。本文利用SDL安全开发理念,从建设使用单位的角度,针对外包开发全流程进行代码安全管控策略设计和技术保障措施研究,通过参与关键流程活动,协助开发出既符合安全要求又尽可能减少网络安全漏洞的应用系统。本文设计的建设使用单位针对外包开发过程中的安全实践措施和策略架构如图1所示。
图1 外包开发过程中的安全实践措施和策略架构
3.1 加强开发厂商的选择与安全培训
外包应用系统开发时,在厂商具有相应资质的基础上,建议应用系统开发管理的业务部门优先选择软件开发质量保障能力等级较高的企业,利用其更为规范的过程管理、版本管控、漏洞管理等制度和技术措施提高应用系统开发质量。
建设使用单位组织或参与开发厂商统一举行的安全防范意识培训,对系统设计、开发、部署、售后、运维和业务使用等各类人员进行必要的安全培训或再培训,宣传法律法规和标准知识、网络安全防范技能,建立常见安全漏洞的源代码防范措施、范例、框架,帮助相关人员特别是设计、开发人员提升安全开发能力。
3.2 开展安全保密风险分析
建设使用单位的业务使用人员、安全保密人员介入业务安全需求分析,和开发人员结合安全标准规范,从安全标准和最佳实践2个方面分析得出业务功能所需安全防护要求。安全需求分析工作的主要目的是为应用程序设计在计划运行环境中的运行确定最低安全要求。同时,在需求分析文档中包括安全保密协议相关内容:加强源代码安全管理,防止因源代码泄露、安全防范意识不足可能造成的安全风险,预防安全漏洞、后门;禁止应用系统开发相关文档、源代码等传输到互联网;禁止预置和保留隐藏的管理员账号、开发者账号、测试账号;禁止预置远程管理后门、远程升级后门、广告推广、漏洞和非授权的数据收集、传输等恶意功能。
3.3 强化安全防护功能设计与编码
建设使用单位的安全保密人员介入系统的安全设计阶段,与开发人员一起,根据业务安全需求分析,制定安全控制和防护措施,减小攻击面,防范常见安全漏洞、安全攻击方式,抵御或降低安全威胁。安全设计实践包括特权分离、数据验证、认证管理、会话管理、授权管理、日志审计、异常处理、配置管理、数据保护等安全功能设计,也包括对结构化查询语言(SQL)注入、反序列化、权限提升、文件上传、任意文件下载等安全漏洞的防范功能设计。编码实现时,需要考虑将要使用的开源代码、组件、模块、库和框架的安全性,禁止使用存在安全风险的软件成分。
存量应用系统新增功能、系统升级也需要编制新增功能部分的安全设计方案,对新增功能的安全威胁、安全功能设计和对原应用系统安全功能的影响进行深入分析。
3.4 完善代码安全测试与验收
建设使用单位在对应用系统业务功能进行验收测试时,先由业务使用团队和安全保密团队开展安全功能合规性测试,根据业务功能、安全要求设计安全测试用例进行测试,测试用例需要涵盖安全需求、安全设计中各项功能。
在安全功能测试基础上,建设使用单位安全团队应开展源代码安全性测试,从源头把控应用系统安全风险。源代码安全性测试一般采用自动化工具来降低人工检测的时间消耗和成本投入,提高检测效率,常见工具包括静态安全测试(SAST)、动态安全测试(DAST)、交互式安全测试(IAST)、模糊测试(FUZZ)和软件成分分析(SCA)几类技术。根据经验,建议配备交互式安全测试IAST工具和软件成分分析SCA工具。IAST技术融合了SAST技术和DAST技术的特征,通过在应用系统中部署测试插桩,分析应用系统运行时的源代码,检查业务数据传播路径,分析数据传播过程中的各功能代码的处理措施,根据已知安全漏洞发生的数据处理模式、发生场景分析可能存在的安全风险,在完成功能测试的同时自动开展并完成源代码层的安全性分析测试。相较于SAST、DAST和FUZZ,IAST测试工具具有对测试人员安全技能要求低、测试结果准确性高、测试过程速度快的优势,特别适合建设使用单位业务使用团队和安全团队等非专业开发人员用于开展源代码安全性测试。
为应对开源组件、开源代码引入的安全风险,SCA工具扫描分析应用系统的源代码和使用的模块、库、框架、程序包等代码文件,提取代码指令、代码结构、控制流图、函数调用关系等特征,再对特征进行识别和分析,获得各个部分的关系,然后根据已知的安全漏洞特征库、威胁情报库,识别可能潜藏的、存在的安全风险,避免开源代码、库、模块的使用引入安全漏洞。
3.5 开展安全上线
应用系统上线试运行时,安全保密团队应会同开发团队开展安全配置加固,先梳理业务应用系统使用的运行环境、语言环境、开源组件等,并建立系统成分清单,清单包括但不限于操作系统、数据库、运行中间件、运行容器及编排管理与调度组件、大数据组件、人工智能组件、开发框架、消息系统组件、数据库连接和管理组件、语言运行库、外部函数库/组件、开源组件等代码运行组件清单,详细记录各项名称、版本号,便于开展零日(0Day)漏洞预警排查和漏洞检测与应急响应。
应用系统完成部署后,建设单位定期利用漏洞扫描工具进行安全漏洞检测,或开展人工渗透测试发掘潜在漏洞,对发现的源代码缺陷导致的安全漏洞通知开发人员核实整改漏洞。加强应用系统升级管理,在大版本、小版本升级和应用系统间集成、漏洞修复等工作后,按照以上安全需求分析、安全设计与编码、安全测试的过程对变更部分源代码进行安全分析和测试,必要时对应用系统整体重新进行安全测试。
4 结语
应用系统在供应链、安全设计、代码编程实现、上线运行等全生命周期中面临各种各样的风险,只有加强应用系统源代码安全管控,才能从源头解决应用系统自身面临的安全风险。本文从建设使用单位的角度,研究应用系统外包开发建设中的源代码安全防护技术,针对安全需求分析、安全设计与实现、安全测试、升级管控等各阶段设计源代码管控策略和措施,有助于减少应用系统建设过程中源代码引入的安全风险,提升应用系统的安全防护水平。同时,该实践经验对应用系统自行开发、开源产品自行部署、商业产品购置实施等情形具有一定借鉴意义。
(原载于《保密科学技术》杂志2023年2月刊)