PoIEx:基础设施即代码与应用程序交互的智能探索工具

PoIEx是一款创新的Visual Studio Code扩展,专为安全工程师设计,用于分析代码与云基础设施之间的交互点。它结合Semgrep扫描、实时协作注释和基础设施可视化,帮助发现混合云与Web应用漏洞,提升代码审计效率。

介绍PoIEx - 交互点探索器

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

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

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

由于许多近期的高调事件源于Web和云相关技术的不安全组合,关注它们相遇的点对于发现新漏洞至关重要。PoIEx是一款新的Visual Studio Code扩展,通过枚举、绘制和连接所谓的交互点(Points of Intersection),帮助测试人员分析代码与基础设施之间的交互。

介绍交互点 - 一种新颖的IaC-应用分析方法

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

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

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

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

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

如果您使用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 上的通知代表该桶的两个发现。单击它,打开一个新选项卡以可视化它们。

第一组包含PoIs和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 config initialization
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, "")
}
//list of all objects
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 设计