使用 CodeWhisperer 来识别问题,并利用建议来改善你 IDE 中的代码安全性 安全博客
使用 CodeWhisperer 识别问题并利用建议提升 IDE 中的代码安全性
重点内容
DevSecOps 强调在开发早期关注安全性,能节省时间和成本。CodeWhisperer 提供实时安全扫描和代码建议,帮助开发者改善代码安全性。本文将通过 PyCharm 的 AWS Toolkit 演示如何使用 CodeWhisperer 进行代码扫描。在我刚开始软件开发的过程中,构建东西让我感到兴奋,但我对安全性的关注却不够。起初,我觉得代码的安全性并不那么重要,但在项目结束时经历了安全审核的折磨之后,我意识到在开发早期强调安全性,可以为省时、省力并减少不少挫折。
这种在开发初期关注安全性的做法被称为 DevSecOps,通过这种方式,可以早期识别并改善安全问题,避免不必要的重新工作,降低在线系统的漏洞。使用 Amazon CodeWhisperer 的安全扫描功能,在编码时可以识别您集成开发环境 (IDE) 中潜在的安全隐患。解决潜在问题后,CodeWhisperer 会提供建议,帮助您在最后一刻修改代码前,尽早改善代码的安全性。
在本文中,我将演示如何通过使用 AWS Toolkit for JetBrains 扩展在 PyCharm 中开始使用 CodeWhisperer 的代码扫描功能,识别潜在的弱哈希算法,并运用 CodeWhisperer 的建议来提升代码安全性。
CodeWhisperer 概述
CodeWhisperer 理解用自然语言英语编写的注释,并能实时生成多个代码建议,帮助提升开发者的生产力。其建议基于经过训练的大型语言模型LLM,该模型使用了亚马逊及公开可用的代码,并在训练过程中剔除了已识别的安全漏洞。有关详细信息,请参阅 Amazon CodeWhisperer FAQs。
目前,安全扫描功能在 VS Code 和 JetBrains 中支持 Java、Python、JavaScript、C#、TypeScript、CloudFormation、Terraform 以及 AWS 云开发工具包 (AWS CDK,支持 Python 和 TypeScript)。AWS CodeGuru Security 利用检测引擎和结合逻辑回归与神经网络的机器学习模型,找寻代码中的关系与路径。CodeGuru Security 可以检测常见安全问题、日志注入、机密信息和不安全的 AWS API 和 SDK 使用。检测引擎使用一个 检测器库,提供描述、示例和额外信息,帮助您理解 CodeWhisperer 为何突出显示某段代码,您是否需要采取行动。
CodeWhisperer 代码扫描流程
为了说明 PyCharm 与 Amazon CodeWhisperer 和 Amazon CodeGuru 的交互,下面的序列图概述了 PyCharm 与 AWS 之间的交互。有关此交互的更多信息,请查看 Amazon CodeWhisperer 文档。
PyCharm 与 CodeWhisperer 之间的通信通过 HTTPS 认证并使用授权头中的持有者令牌。如下图所示,当您在 PyCharm 中手动启动安全扫描时,流程如下:
PyCharm 向 CodeWhisperer 请求一个预签名的 Amazon 简易存储服务 (Amazon S3) 上传 URL,这会触发 CodeGuru 请求一个上传 URL。CodeWhisperer 将 URL 返回给 PyCharm。PyCharm 将打开的 PyCharm 标签页中的代码以及链接的第三方库归档到一个 gzip 文件,并直接上传该文件到 S3 上传 URL。存储代码的 S3 存储桶在静态状态下进行加密,并施加严格的访问控制。PyCharm 向 CodeWhisperer 发起扫描请求,CodeWhisperer 创建一个与 CodeGuru 的扫描作业并返回生成的扫描作业 ID。CodeGuru 从 Amazon S3 下载代码并启动代码扫描。PyCharm 向 CodeWhisperer 请求扫描作业状态,CodeWhisperer 从 CodeGuru 获取扫描状态。如果状态为待处理,PyCharm 将继续查询,直到扫描作业完成。当 CodeWhisperer 响应扫描作业状态为完成时,PyCharm 请求安全发现的详细信息,包括文件路径、行号和发现的详细信息。发现的详细信息在 PyCharm 代码编辑器窗口和 CodeWhisperer 安全问题窗口中显示。操作指南
接下来,您将开始配置 PyCharm 以使用 AWS Toolkit for JetBrains。随后,您将创建一个 AWS Builder ID 来验证扩展与 AWS 的连接。最后,您将扫描被 CodeWhisperer 识别为潜在弱哈希算法的 Python 代码,并学习如何找到更多细节,最终使用 CodeWhisperer 提升代码安全性。
前提条件
在进行此操作指南前,请确保您具备以下前提条件:
PyCharmJetBrains 产品Python 310 及以上版本pip3
安装并验证 AWS Toolkit for JetBrains
本节提供逐步安装和验证 JetBrains IDE 的说明。如果您已经配置了 JetBrains 或使用其他 IDE,请跳过到“使用 CodeWhisperer 安全扫描识别潜在弱哈希算法”部分。
在此步骤中,您将安装最新版本的 AWS Toolkit for JetBrains,创建一个新的 PyCharm 项目,注册 AWS Builder ID,并将该 ID 用于工具包与 AWS 的身份验证。要完成与 AWS 的身份验证,您需要一个 AWS Builder ID、AWS IAM 身份中心 用户详情,或 AWS IAM 凭证。创建 AWS Builder ID 是最快的入门方法,无需 AWS 账户,因此我将在此说明该方法。
安装 AWS Toolkit for JetBrains打开 PyCharm IDE,在左侧导航窗格选择 插件。在搜索框中输入 AWS Toolkit。在搜索结果中选择 AWS Toolkit 并点击 安装。创建新项目打开 PyCharm IDE。从菜单栏选择 文件 gt 新建项目,然后选择 创建。身份验证 CodeWhisperer 与 AWS 的连接在导航窗格中选择 AWS 图标 ()。在 AWS Toolkit 部分,选择 开发者工具 标签页。在 CodeWhisperer 下,双击 开始 图标 ()。 在 AWS Toolkit 添加连接 部分,选择 使用个人电子邮件注册并使用 AWS Builder ID 登录,然后选择 连接。在 通过 AWS Builder ID 登录 对话框中,选择 打开并复制代码。在打开的浏览器窗口中,在 授权请求 部分,将先前步骤中复制的代码粘贴到 代码 字段中,然后选择 提交并继续。在 创建您的 AWS Builder ID 页面上,进行如下设置:在 电子邮件地址 中,输入一个有效的当前电子邮件地址。选择 下一步。在 您的姓名 中,输入您的全名。选择 下一步。检查您的收件箱,查看是否收到来自 noreply@signinaws 的标题为 验证您的 AWS Builder ID 电子邮件地址 的电子邮件,并复制其中的验证码。在浏览器的 电子邮件验证 页面上,对于 验证码 字段,粘贴您复制的验证码,然后选择 验证。在 选择您的密码页面 输入 密码 和 确认密码,然后选择 创建 AWS Builder ID。在 允许 AWS Toolkit for JetBrains 访问您的数据吗? 部分,选择 允许。为确认身份验证成功,在 PyCharm IDE 导航窗格中选择 AWS 图标 ()。在 AWS Toolkit 窗口中,确保显示 已连接到 AWS Builder ID。使用 CodeWhisperer 安全扫描识别潜在弱哈希算法
接下来的步骤是创建一个使用 SHA224 哈希算法的文件。CodeWhisperer 将此算法视为潜在的弱算法,并引用 通用弱点枚举 (CWE)328。在此步骤中,您将使用此弱哈希算法,而不是推荐的 SHA256 算法,以便查看 CodeWhisperer 如何标记此潜在问题。
创建使用弱哈希算法 (SHA224) 的文件在您的 PyCharm 项目中创建一个名为 apppy 的新文件。复制以下代码片段并粘贴到 apppy 文件中。在此代码片段中,使用 PBKDF2 和 SHA224,而不是推荐的 SHA256 算法。
pythonimport hashlibimport os
salt = osurandom(8)password = secretencode()
vpn节点不合规:使用了潜在弱算法。
derivedkey = hashlibpbkdf2hmac(sha224 password salt 100000)derivedkeyhex()
启动安全扫描在 PyCharm 的 AWS Toolkit 部分,双击 运行安全扫描 旁边的播放图标 ()。这将打开一个名为 CodeWhisperer Security Issues 的新选项卡,显示扫描已成功启动,如图 9 所示。解读 CodeWhisperer 安全扫描结果
现在您可以解读安全扫描的结果。
解读 CodeWhisperer 结果当安全扫描完成时,CodeWhisperer 会在主代码编辑器窗口突出显示代码的一行。要查看识别问题的描述,只需将光标移动到高亮显示的代码上。在我们的示例中,所显示的问题是 CWE327/328,如图 10 所示。问题描述表明高亮代码中的算法可能较弱。pbkdf2hmac 函数的第一个参数如图 10 所示是 SHA224,因此我们可以推测这是所突出显示的问题。CodeWhisperer 强调了 SHA224 作为潜在问题。然而,要了解您是否需要进行更改以提高代码安全性,您必须进一步调查。一个好的起点是 CodeGuru 检测器库,该库为 CodeWhisperer 的扫描能力提供支持。检测器库中关于 不安全的哈希 的条目提供了示例代码和链接至额外信息。
这些附加信息说明 SHA224 的输出是被截断的,且比 SHA256 短 32 位。由于输出被截断,SHA224 更容易受到 碰撞攻击。SHA224 的安全性为 112 位,而 SHA256 为 128 位。碰撞攻击是一种查找另一个输入的方法,该输入会生成与原输入相同的哈希。图 10 中不安全哈希的 CodeWhisperer 问题描述指出了这一潜在问题,这也就是 CodeWhisperer 标记代码的原因。然而,如果哈希结果的大小对您的用例很重要,SHA224 可能是正确的解决方案,如果是这样,您可以忽略此警告。但如果您没有特别理由使用 SHA224 而不是其他算法,那么您应该考虑 CodeWhisperer 提供的替代建议,我将在下一节中描述。
利用 CodeWhisperer 建议帮助解决安全问题
CodeWhisperer 会根据您现有的代码和注释实时自动生成建议。建议的范围从完成一行代码到生成完整的函数都可以。然而,由于 CodeWhisperer 使用的是经过大量数据训练的 LLM,您可能会收到不同的建议。这些建议可能会随时间变化,即使您给 CodeWhisperer 的背景信息相同。因此,您需要自行判断这些建议是否正确。
替换算法在前一步中,您发现 pbkdf2hmac 函数的第一个参数包含了可能存在漏洞的算法 SHA224。要发起其他算法的建议,请删除函数中的参数。CodeWhisperer 的建议是将算法从 SHA224 更改为 SHA256。然而,由于 LLM 的特性,您也可能获得不同的建议算法。若要应用此建议并更新代码,请按 Tab 键。图 11 显示了 PyCharm IDE 中建议的样子。验证 CodeWhisperer 建议的有效性
虽然 CodeWhisperer 的机器学习模型已经识别了并移除了安全漏洞,但某些建议仍可能包含安全漏洞。因此,请确保您完全理解 CodeWhisperer 的建议