基础设施即代码(IaC)与应用安全分析新利器:PoIEx 交叉点探索器

本文介绍了Doyensec发布的开源VSCode扩展PoIEx。该工具通过可视化代码与云基础设施配置的交互点,辅助安全工程师发现混合漏洞。它还集成了代码注释、团队协作和Semgrep扫描功能,显著提升了手动代码审计的效率。

引入 PoIEx - 交叉点探索器

2024年1月30日 - 作者:Francesco Lacerenza, Michele Lizzit

我们发布了一款先前仅供内部使用的工具,旨在改进基础设施即代码(IaC)分析,并增强 Visual Studio Code 的功能,使其能在手动代码分析活动中实现实时协作。我们很高兴地宣布,PoIEx 现已在 Github 上发布。

如今,云原生解决方案已不再是流行词,云提供商提供了日益智能的基础设施服务,功能范围从简单的对象存储到复杂的任务,如用户身份验证和身份访问管理。随着云基础设施的复杂性不断增加,应用程序逻辑与基础设施之间的交互开始在确保应用程序安全方面扮演着关键角色。许多近期备受关注的安全事件都源于 Web 与云相关技术的不安全组合,因此,关注它们交汇的点对于发现新的安全漏洞至关重要。PoIEx 是一款新的 Visual Studio Code 扩展,它通过枚举、绘制和连接所谓的“交叉点”来帮助测试人员分析代码与基础设施之间的交互。

引入交叉点 - IaC与应用分析的新方法

交叉点(Point of Intersection, PoI)标记了代码与底层云基础设施交互的位置,揭示了已实现的逻辑与定义所涉及云服务配置的基础设施即代码(IaC)之间的连接。在执行手动审计以寻找可通过诱使应用程序逻辑滥用底层基础设施服务来利用的混合云-Web漏洞时,枚举 PoI 至关重要。PoIEx 能够识别和可视化 PoI,使安全工程师和云安全专家能够更好地理解和识别云原生应用程序中的安全漏洞。

PoIEx:增强 VSCode 以支持代码审计

PoIEx 会同时扫描应用程序代码和 IaC 定义文件,利用 Semgrep 和自定义规则集,查找与 IaC 相关的代码段,并在一个美观且用户友好的视图中可视化结果。工程师可以浏览基础设施图,并快速跳转到使用所选基础设施资源的应用程序代码相关部分。

示例基础设施图生成和 PoIs 探索

如果你使用 VSCode 审计大型代码库,你可能已经注意到它的所有功能都是针对开发者社区的需求量身定制的。在 Doyensec,我们通过 PoiEx 解决了这个问题。该扩展通过高效执行代码审计所需的所有功能来增强 VSCode,例如高级协作能力、使用 VS Code 评论 API 记笔记以及与 Semgrep 的集成。即使不启用其 IaC 特定功能,也可将其用作独立的 Semgrep 和项目协作工具。

在 Doyensec,我们将 PoIEx 用作协作和审计增强工具。下面我们介绍其与 IaC 无关的功能以及我们的用例。

✍️ 笔记功能:组织化的主题讨论

PoIEx 为 VSCode 增加了评论功能。用户可以在任何代码位置放置便签,而无需编辑代码库。 在 Doyensec,我们通常使用涉及 VULN、LEAD、TODO 等前缀的命名规则来组织主题讨论。我们发现,当多名测试人员在同一项目上工作时,直接在代码库上放置共享注释能极大地提高效率。

示例:使用组织化主题讨论的笔记

在协作模式下,成员会为每个回复或新创建的讨论主题收到交互式通知,从而实现关于线索、笔记和漏洞的审阅者间实时同步。

👨‍💻 PoIEx 作为 VSCode 的独立 Semgrep 扩展

PoIEx 也可作为 VSCode 的独立 Semgrep 扩展。PoIEx 允许用户扫描整个工作区,并在 VSCode 的“问题”标签页中清晰地呈现 Semgrep 发现。 此外,通过右键单击某个问题,可以应用一个标志并更新其状态为:❌ 误报、🔥 热点或 ✅ 已解决。在协作模式下,该状态会同步,以避免重复检查。 扩展设置允许用户为 Semgrep 设置自定义参数。例如,我们目前使用 --config /path/to/your/custom-semgrep-rules --metrics off 来关闭指标并使用我们的自定义规则。 扫描可以从扩展侧边栏启动,结果可以通过 VS Code 的问题子菜单进行探索。用户可以巧妙地利用内置搜索功能来寻找有趣的线索。

示例:Semgrep 结果和通过表情符号标记的 PoIs 探索列表

🎯 面向项目的设计

PoIEx 允许与其他用户实时同步发现和评论。使用协作功能时,团队中的所有协作者需要共享一个 MongoDB 实例。 面向项目的设计使我们能够映射项目,并与分配到特定活动的测试人员共享一个加密密钥。此设计功能确保敏感数据在静态时处于加密状态。 评论和扫描结果会同步到 MongoDB 实例,而代码库保持本地化,并且每个审阅者必须共享相同的版本。

真实世界分析示例 - 使用 PoIEx 解决 Tidbits 第 1 集

如果你不熟悉,CloudSec Tidbits 是我们的博客系列,展示 Doyensec 在云安全测试活动中发现的有趣的真实世界漏洞。博文和实验可以在此仓库 中找到。

第 1 集描述了当用户输入用于实例化 AWS SDK 客户端时,影响应用程序逻辑的一种特定类型的漏洞。如果没有适当的检查,用户可能能够强制应用程序使用实例角色(而非外部凭证)来与 AWS 服务交互。根据具体功能,此类缺陷可能允许对内部基础设施进行不必要的操作。

下面,我们介绍在代码审计中,一旦使用 PoIEx 打开和探索代码库,如何识别该问题。 下载并在 VS Code 中打开 Lab 1 的代码库后,使用 PoIEx 运行 Semgrep,并通过选择 main.tf 文件来显示基础设施图。结果应类似于下图。

aws_s3_bucket.data_internal 上的通知代表该存储桶的两个发现。 点击它,会打开一个新标签页来查看它们。

第一组包含 PoI 和 Semgrep 发现,第二组包含所点击实体的 IaC 定义。 在这个例子中,我们看到在 app/web.go:52 有一个 S3 PoI。点击后,我们将跳转到 web.go#L50 定义的 GetListObjects 函数。虽然它只是列出 S3 存储桶中的文件,但 SDK 客户端配置和存储桶名称都是作为参数在其签名中传递的。 快速搜索它的用法将显示出易受攻击的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//*aws 配置初始化
aws_config := &aws.Config{}

if len(imptdata.AccessKey) == 0 || len(imptdata.SecretKey) == 0 {
	fmt.Println("Using nil value for Credentials")
	aws_config.Credentials = nil
} else {
	fmt.Println("Using NewStaticCredentials")
	aws_config.Credentials = credentials.NewStaticCredentials(imptdata.AccessKey, imptdata.SecretKey, "")
}
//列出所有对象
allObjects, err := GetListObjects(session_init, aws_config, *aws.String(imptdata.BucketName))

如果 aws_config.Credentials 因为输入中缺少密钥/密钥而被设置为 nil,则将使用凭证提供者链,并假设实例的 IAM 角色。在这种情况下,自动检索到的凭证对内部 S3 存储桶拥有完全访问权限。快速从 S3 存储桶结果标签页跳转到 Terraform 定义。 列出之后,执行 DownloadContent 函数(在 web.go 第 129 行),存储桶的内容将暴露给用户。 此时,审阅者知道,如果使用空的 AWS 密钥或密钥调用该函数,导入数据功能最终将使用实例的角色下载内容,从而允许内部存储桶名称作为输入。 要利用此漏洞,只需使用空凭证和内部存储桶名称访问 /importData 端点(解决方案见 Cloudsec Tidbits 第 2 集开头)。

敬请期待!

这个项目是在 Doyensec 研究岛上,由 Michele Lizzit 怀着热情为其在 ETH Zurich 的硕士论文完成的,并在 Francesco Lacerenza 的指导下进行。

快来查看 PoIEx 吧!从 GitHub 安装最新版本,并通过点赞、提交错误报告或建议来做出贡献。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计