丰田GitHub密钥案——29万客户信息5年的教训

2023年10月,丰田汽车公司披露了一起重大数据泄露事件。一名安全研究人员在公开的GitHub代码仓库中发现了一个硬编码的访问密钥,该密钥可以访问丰田的T-Connect和G-Link车载信息服务系统的后端数据库。密钥在GitHub上公开暴露了整整五年之久,在此期间约有29万条客户信息可能被非法访问。这一事件是典型的企业代码安全管理疏漏案例,揭示了在软件开发流程中如果不对访问凭据和敏感信息进行严格管理,可能引发极其严重的数据泄露后果。

案件经过:一个密钥引发的连锁反应

案件起因于丰田将T-Connect车载信息服务系统的部分源代码上传至GitHub公开仓库。与其他需要严格保密的企业内部代码不同,丰田可能认为这些代码不包含核心商业机密,因此选择将其存放在公开的代码托管平台上。但问题在于,开发人员在代码中硬编码了一个用于访问后端数据库的认证密钥。密钥以明文形式直接出现在源代码文件中,任何有权访问该代码仓库的人都可以轻松提取并使用这个密钥。

密钥在GitHub上公开暴露后,被安全研究人员在例行扫描中发现。研究人员通过密钥成功访问了丰田的后端数据库,发现数据库中包含大量客户个人信息,包括姓名、地址、电话号码、电子邮件地址、车辆识别号和车载设备ID等。丰田在接到研究人员的报告后关闭了密钥的访问权限,并对该账户的相关访问记录进行了全面审计。审计结果确认密钥在过去五年间处于可被访问的状态,无法完全排除数据已被恶意获取的可能性。丰田最终确认最多有29万条客户信息受到影响,并逐一通知了可能受影响的客户。

企业软件开发的常见安全问题

丰田GitHub密钥案暴露了企业软件开发流程中普遍存在的安全问题。在开发过程中使用硬编码密钥是最常见也最危险的安全实践之一。开发人员为了方便调试和测试,将数据库密码、API密钥、加密证书和认证令牌等凭据直接写入源代码中。在项目后期这些硬编码凭据往往未被清理,随着代码一起被提交到代码仓库、打包到发布的版本中或上传到未经授权的服务器。一旦代码被公开,所有硬编码凭据就完全暴露给外界。在软件开发实践中应当遵循凭据不进入代码的原则和规则。所有访问第三方系统和服务所需的凭据应当通过环境变量、配置文件、密钥管理服务或专门的安全凭据管理平台进行管理,而不是直接写在代码文件里。

Git在版本控制中存储了代码、文档和配置文件的每次变更历史和提交信息。即使开发人员在发现硬编码密钥后将其从最新版本中删除,旧的版本历史中仍然保留了包含密钥的原始文件。这让"事后删除"几乎起不到任何作用,而使用专为历史版本重写设计的git filter-branch或BFG Repo-Cleaner等工具从所有历史提交中彻底移除密钥数据,操作复杂且容易导致提交历史冲突。依赖历史覆盖操作来解决密钥泄露问题只是权宜之计而不是根本解决方案,更可靠的路径是建立防止密钥进入代码仓库的前置审查机制。

代码托管平台的访问权限管理也是需要加强的环节。GitHub等公开代码托管平台默认仓库可见性为公开,任何匿名用户都可以查看和克隆仓库的全部内容。公开仓库意味着任何人都可以访问仓库的全部代码、版本历史和Issues讨论内容。企业的开发人员在创建仓库时应当谨慎确认仓库的可见性设置,仅将确需对外公开的项目设为公开仓库,所有涉及企业内部系统、业务逻辑和客户数据的代码应当存放在私有仓库或自托管的代码管理系统中。

企业如何构建安全的代码和密钥管理体系

企业应当建立软件开发全生命周期的安全管理体系,从根本上防范类似丰田密钥泄露案的风险。代码安全审查应当在代码提交前完成,而不是在发布后发现。企业应当将代码安全审查纳入软件开发流程,每次代码提交都经过自动化和人工双重安全审查。自动化安全审查通过静态代码分析工具扫描代码中的硬编码凭据、SQL注入漏洞、跨站脚本漏洞和已知依赖库漏洞等安全风险。对于发现的硬编码凭据,自动化工具应当阻止代码提交并通知开发者修正。人工安全审查重点关注自动化工具难以发现的业务逻辑安全问题、权限控制缺陷和数据保护措施的完整性。

密钥管理平台是企业集中管理所有访问凭据的基础设施。企业应当部署企业级的密钥管理平台,对数据库密码、API密钥、加密密钥和数字证书等所有访问凭据进行集中存储、定期轮换和访问审计。应用程序在运行时通过密钥管理平台的API获取所需的访问凭据,而不是直接从代码或配置文件中读取。密钥应当定期自动轮换,降低单个密钥泄露造成的损害时长。密钥的访问权限也应当严格限制,只有确实需要该密钥的应用程序和服务才能获取,开发环境和测试环境使用独立的凭据,与生产环境的凭据严格隔离。

企业应当建立敏感信息的自动检测和阻断机制。在代码提交到版本控制系统之前、代码推送到远程仓库之前和代码发布到生产环境之前,自动扫描所有文件内容,检测并阻断包含硬编码凭据、IP地址、个人身份信息和其他敏感信息的代码提交。检测规则库应当定期更新,覆盖最新的凭据格式和敏感数据类型。安全培训同样不可或缺。开发人员应当接受安全编码培训,学习如何正确管理访问凭据、如何处理敏感信息以及如何识别常见的安全风险。

如何发现代码仓库中已泄露的密钥?企业可以使用GitHub的Secret Scanning服务自动检测公开仓库中的已知凭据格式,或者部署第三方密钥扫描工具如GitLeaks和TruffleHog对历史提交进行深度扫描。发现密钥泄露后,应当立即执行以下流程:第一时间撤销或轮换泄露的密钥、确认泄露密钥的实际访问记录和使用范围、从代码仓库的历史记录中彻底清除该密钥、排查是否存在通过该密钥被非法获取的数据和文件、向相关人员通报事件并完善密钥管理的操作规范。从丰田案件中得出什么核心教训?第一,硬编码密钥是软件开发中最常见但最危险的安全问题,应当通过技术手段在代码提交环节直接阻断。第二,凭据信息的存储位置不能与使用代码的仓库处于同一访问层级,应当使用独立的密钥管理服务。第三,对公开仓库中的代码同样需要进行严格的敏感信息审查。