硬件供应链的保密管理大家谈得比较多,软件供应链的安全问题却经常被低估。而实际上,软件供应链的泄露风险一点也不比硬件小,有时候甚至更隐蔽、更难防范。

一家做企业级SaaS服务的公司就吃过这个亏。他们把一个核心功能模块的开发外包给了一家第三方软件公司。软件公司按照需求做完了开发,但交付的时候把代码直接压缩打包发了邮件。这封邮件被软件公司内部一个离职人员转发到了自己的个人邮箱里,不久后市场上出现了功能和界面都非常相似的竞品。这家公司花了将近一年时间做版权诉讼,但对方的技术已经迭代了好几轮,追责的效果并不理想。

软件供应链的安全管理可以从几个方面入手。

首要,源代码的分割外包策略。代码外包时不要把完整的代码仓库交给外包公司。比较好的做法是按照模块拆分开,每个外包商只做其中一部分,最后由企业自己的团队完成集成和测试。这样做的好处是任何一家外包商都没有企业产品的完整代码,即使发生泄露,损失也是局部的。

有些企业会觉得这种做法增加了集成难度,但从安全角度来看,代码分割的成本远低于代码全部泄露的代价。而且在当前的开发工具环境下,模块化开发已经是常见的技术实践,集成并没有想象中那么困难。

第二,代码仓库的访问管控。外包开发人员的代码仓库访问权限要严格控制和定期审查。具体做法包括:给外包商人员开通专用的代码仓库账号,账号使用临时令牌认证,权限随项目结束自动撤销。外包人员只能访问自己负责的功能模块,不能查看其他模块的代码。代码的下载和导出操作需要双人审批。

有一个简单且有效的做法是在代码仓库中设置防护规则,防止代码被批量导出。当检测到短时间内大量下载文件、或者有人试图复制整个仓库时,系统自动告警并暂时锁定账号。

第三,代码交付流程的安全管控。外包公司完成开发后交付代码,这个环节往往是管理最薄弱的。像前面提到的案例那样,直接把代码压缩包发邮件或者上传网盘,非常不安全。

标准做法是使用受控的代码交付平台,外包商把代码推送到企业专属的代码仓库中,企业做代码审查和合并。所有的提交记录都有时间戳和人员标识,形成完整的审计链条。如果外包商没有使用约定的代码管理工具,企业可以搭建统一的代码接收网关,对外包商提交的代码做自动化的安全扫描。

第四,开发环境的安全隔离。外包开发人员的本地开发环境也是泄密的渠道。有些外包人员会在自己的云存储上同步代码文件,把企业代码和个人资料混在一起。还有的外包人员用未加密的USB设备拷贝代码到不同环境之间传输。

建议在合同中明确规定外包开发人员的数据存储和传输规范。核心代码必须在受控的代码仓库中开发,不得在本地电脑上留存完整代码副本。强制要求开发环境使用全磁盘加密,USB接口做权限控制。

第五,代码中的安全漏洞和恶意代码检测。软件供应链里的风险不只是泄露,还包括外包商可能在代码中植入后门或者安全漏洞。这种风险虽然比较少见,但一旦发生影响会非常大。

企业在外包代码交付后应做第三方的安全审计和代码审查。使用自动化工具做静态代码分析和安全漏洞扫描。对于安全等级较高的项目,建议人工走查关键模块的代码逻辑。发现可疑代码时及时与外包商沟通并要求整改。

软件供应链安全正在成为越来越多人关注的话题。随着开源组件和第三方代码的广泛应用,企业需要投入更多的精力来管理这些看不见的风险。与其等到代码泄露后再处理,不如在开发的每一个环节都把安全管理的意识贯穿进去。