PoIEx:基础设施即代码与应用程序交互分析利器

PoIEx是一款创新的VS Code扩展工具,专注于基础设施即代码(IaC)与应用程序的交互分析。它通过识别和可视化代码与云基础设施的交汇点,帮助安全工程师发现混合型云漏洞,并集成Semgrep扫描、实时协作注释和项目管理功能。

介绍PoIEx - 交汇点探索器

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

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

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

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

介绍交汇点 - IaC-App分析的新方法

交汇点(PoI)标记了代码与底层云基础设施交互的位置,揭示了实现逻辑与定义相关云服务配置的基础设施即代码(IaC)之间的连接。

在执行手动审查时,枚举PoI对于发现混合云-Web漏洞至关重要,这些漏洞可通过诱骗应用程序逻辑滥用底层基础设施服务来利用。PoIEx识别并可视化PoI,使安全工程师和云安全专家能够更好地理解和识别云导向应用程序中的安全漏洞。

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

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

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

如果您使用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 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 设计