PoIEx交叉点探索器 - 基础设施即代码安全分析新利器

本文介绍Doyensec开源的PoIEx工具,该工具通过识别代码与云基础设施的交互点,帮助安全工程师发现混合型云安全漏洞。工具集成于VSCode,支持实时协作注释和Semgrep扫描,提升代码审计效率。

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

如今,云原生解决方案已不再只是流行语,云提供商提供越来越智能的基础设施服务,处理从简单对象存储到用户身份验证和身份访问管理等复杂任务。随着云基础设施复杂度的增加,应用程序逻辑与基础设施之间的交互在确保应用安全方面起着关键作用。

随着最近多起高调事件源于Web和云相关技术的不安全组合,关注它们交汇的节点对于发现新漏洞至关重要。PoIEx是一款新的Visual Studio Code扩展,通过枚举、绘制和连接所谓的"交叉点"来帮助测试人员分析代码与基础设施的交互。

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

交叉点(PoI)标记了代码与底层云基础设施交互的位置,揭示了实现逻辑与定义所涉及云服务配置的基础设施即代码(IaC)之间的连接。在执行手动审查以寻找可通过诱骗应用程序逻辑滥用底层基础设施服务来利用的混合云-Web漏洞时,枚举PoI至关重要。

PoIEx识别并可视化PoI,使安全工程师和云安全专家能够更好地理解和识别云原生应用中的安全漏洞。

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

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

如果您使用VSCode审计大型代码库,您可能已经注意到其所有功能都是针对开发社区的需求量身定制的。在Doyensec,我们通过PoIEx解决了这个问题。该扩展使用执行代码审查所需的所有功能增强VSCode,例如使用VS Code Comments API的高级协作功能、注释记录以及与Semgrep的集成,使其也可以用作独立的Semgrep和项目协作工具,而无需任何IaC特定功能。

在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问题子菜单浏览。用户可以智能使用内置搜索功能查找有趣线索。

🎯 面向项目的设计

PoIEx允许与其他用户实时同步发现和评论。使用协作功能时,团队所有协作者之间需要共享MongoDB实例。

面向项目的设计允许我们映射项目并与分配给特定活动的测试人员共享加密密钥。此设计功能确保敏感数据在静态时加密。

评论和扫描结果同步到MongoDB实例,而代码库保持本地,每个审查员必须共享相同版本。

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

CloudSec Tidbits是我们的博客系列,展示Doyensec在云安全测试活动中发现的有趣真实漏洞。博客文章和实验室可以在此存储库中找到。

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

下面,我们介绍在使用PoIEx打开和探索代码库时在代码审查中识别问题。

一旦下载并在VS Code中打开,通过使用PoIEx运行Semgrep并选择main.tf文件显示基础设施图来检查Lab 1的代码库。结果应类似于以下内容。

通知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("使用Credentials的空值")
	aws_config.Credentials = nil
} else {
	fmt.Println("使用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桶结果选项卡快速跳转到TF定义。

列出后,执行DownloadContent函数(在web.go第129行)并将桶的内容暴露给用户。

此时,审查员知道如果使用空的AWS密钥或秘密调用函数,导入数据功能最终将使用实例角色下载内容,从而允许内部桶名称作为输入。

要利用该漏洞,使用空凭证和内部桶名称点击端点/importData(解决方案在Cloudsec Tidbits第2集开头)。

保持关注!

这个项目是在Doyensec研究岛上由Michele Lizzit为他在苏黎世联邦理工学院的硕士论文制作,由Francesco Lacerenza指导。

查看PoIEx!从GitHub安装最新版本,并通过星标、错误报告或建议做出贡献。

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