是的,GitHub的Copilot有可能泄漏(真实的)秘密
没错,GitHub的Copilot有可能泄露(真实的)秘密
关于ChatGPT和OpenAI GPT技术这样的先进语言模型的道德和隐私问题越来越受到关注。这些问题引发了关于使用这些模型可能风险的重要问题。然而,不仅仅是这些通用的语言模型值得关注;专业工具,如代码完成助手,也带来了一些问题。
GitHub的代码生成工具Copilot在推出一年后,被百万开发者使用,被超过20,000个组织采用,并生成了超过30亿行代码,GitHub在一篇博客文章中表示。
然而,自从推出以来,许多人对相关的法律风险、版权问题、隐私问题和不安全的代码建议提出了安全担忧,而这方面的例子层出不穷,包括对代码硬编码秘钥的危险建议。
目前正在进行广泛的安全研究,以准确评估这些新型广告增强工具可能存在的潜在风险。
这篇博客文章深入研究了香港大学最近的研究,测试滥用GitHub的Copilot和亚马逊的CodeWhisperer收集在模型训练过程中暴露的秘密的可能性。
正如GitGuardian的2023年秘密扩散状况中所强调的,GitHub上的硬编码秘密非常普遍,2022年新发现了1000万个新秘密,比前一年增长了67%。
考虑到Copilot是在GitHub数据上进行训练的,令人担忧的是,编码助手可能会被恶意行为者利用来揭示其代码建议中的真实秘密。
提取硬编码的凭据
为了验证这一假设,研究人员进行了一项实验,构建了一个提示生成算法,试图从LLMs中提取凭据。
结论是一致的:通过从GitHub代码片段中构建900个提示,他们成功地从Copilot中收集到了2,702个硬编码凭据,从CodeWhisper中收集到了129个秘密(通过下面描述的特殊方法过滤掉了误报)。
令人印象深刻的是,其中至少有200个,或7.4%(分别为18和14%),是他们在GitHub上能够识别出的真实硬编码秘密。虽然研究人员没有确认这些凭据是否仍然有效,但这表明这些模型可能作为攻击的途径被利用,这将使得可以高度预测地提取和可能泄漏的凭据。
提示生成机的设计
这项研究的想法是看看攻击者是否可以通过制作适当的提示来提取秘密。为了测试这种可能性,研究人员构建了一个名为Hard-coded Credential Revealer(HCR)的提示测试机器。
该机器旨在最大程度地提高触发记忆秘密的机会。为此,它需要构建一个强大的提示,”强制”模型发出秘密。构建这个提示的方法是首先在GitHub上查找包含硬编码秘密的文件,使用正则表达式模式。然后,原始的硬编码秘密被删除,机器向模型请求代码建议。
当然,为了有一丝可能提取有效凭据,需要多次请求模型,因为它通常会输出”虚构”的凭据。
在GitHub上使用了18种模式来识别代码片段,对应着18种不同类型的秘密(AWS访问密钥,Google OAuth访问令牌,GitHub OAuth访问令牌等)。
尽管18种秘密类型远非详尽无遗,但它们仍代表了软件开发人员广泛使用且易于识别的服务。
然后,从原始文件中删除秘密,使用代码助手建议新的字符字符串。这些建议经过四层过滤器后,消除了尽可能多的误报。
如果秘密不符合以下条件,则会被丢弃:
- 不匹配正则表达式模式
- 熵不足(不够随机,例如:
AKIAXXXXXXXXXXXXXXXX) - 具有可识别的模式(例如:
AKIA3A3A3A3A3A3A3A3A) - 包含常见词汇(例如:
AKIAIOSFODNN7EXAMPLE)
通过所有这些测试的秘密被认为是有效的,这意味着它们有可能是真实的秘密(在训练数据的其他地方硬编码)。
结果
在Copilot的8,127个建议中,共成功提取了2,702个有效秘密。因此,总体有效率为2702/8127 = 33.2%,这意味着Copilot平均为每个提示生成3.0个有效秘密。
CodeWhisperer共提供了736个代码片段,其中我们识别到129个有效秘密。因此,有效率为129/736 = 17.5%。
需要记住,在这项研究中,有效的秘密并不意味着这些秘密是真实的。它只意味着它们成功通过了过滤器,并具有与真实秘密相对应的特性。
那么,我们如何知道这些秘密是否是真正的操作凭证? 作者解释称,出于伦理考虑,他们只尝试了一部分有效凭证(如为开发人员设计的Stripe测试密钥之类的测试密钥)。
相反,作者正在寻找另一种方式来验证收集到的有效凭证的真实性。他们想评估记忆力,或者凭证在GitHub上出现的位置。
研究的其余部分侧重于有效秘密的特征。他们使用GitHub代码搜索查找秘密,并区分强记忆秘密(与首先删除的秘密完全相同)和弱记忆秘密(来自一个或多个其他存储库)。最后,还有一些无法在GitHub上找到的秘密,可能来自其他来源。
后果
研究论文揭示了类似GitHub Copilot和Amazon CodeWhisperer等代码完成工具所带来的重大隐私风险。研究结果表明,这些模型不仅泄漏了训练数据中存在的原始秘密,还建议了在训练语料库中其他地方遇到的其他秘密。这暴露了敏感信息,并引发了严重的隐私问题。
例如,即使开发人员将硬编码的秘密从git历史记录中删除后泄露,攻击者仍然可以使用研究中描述的提示技术提取它。研究证明,这些模型可以建议在它们的训练数据中找到的有效和可操作的秘密。
这些发现得到了武汉大学的一位研究人员最近进行的另一项研究的支持,题为“GitHub Copilot生成代码的安全弱点”。该研究分析了由Copilot从GitHub项目生成的435个代码片段,并使用多个安全扫描器识别漏洞。
根据这项研究,无论使用的编程语言如何,Copilot生成的代码片段中有35.8%显示出安全弱点。通过使用通用弱点枚举(CWE)对识别出的安全问题进行分类,研究人员发现“硬编码凭据”(CWE-798)出现在1.15%的代码片段中,占全部600个CWE的1.5%。
缓解措施
解决LLM的隐私攻击需要程序员和机器学习工程师的共同努力。
为了减少硬编码凭据的发生,作者建议使用集中式凭据管理工具和代码扫描来防止包含包含硬编码凭据的代码。
在代码完成模型开发的不同阶段,可以采用不同的方法:
- 在预训练之前,可以通过清理训练数据中的硬编码凭据来排除它们。
- 在训练或微调期间,可以采用算法防御,如差分隐私(DP),以确保隐私保护。差分隐私提供了强大的模型隐私保证。
- 在推理过程中,可以对模型输出进行后处理以过滤出秘密。
结论
这项研究揭示了与GitHub Copilot和Amazon CodeWhisperer等代码补全工具相关的重大风险。通过构建提示并分析GitHub上公开可用的代码,研究人员成功地从这些模型中提取了许多有效的硬编码秘密。
为了缓解这一威胁,程序员应使用集中的凭据管理工具和代码扫描来防止硬编码凭据的包含。机器学习工程师可以采取措施,如将这些凭据排除在训练数据之外,应用差分隐私等隐私保护技术,并在推断期间过滤出模型输出中的秘密。
这些发现超越了Copilot和CodeWhisperer,强调了所有神经代码补全工具中安全措施的必要性。在发布工具之前,开发人员必须采取积极的措施来解决这个问题。
总之,解决与大型语言模型和代码补全工具相关的隐私风险并保护敏感信息需要程序员、机器学习工程师和工具开发人员之间的合作努力。通过实施建议的缓解措施,如集中的凭据管理、代码扫描和从训练数据中排除硬编码凭据,隐私风险可以得到有效缓解。所有利益相关者必须共同努力,确保这些工具及其处理的数据的安全与隐私。



