AWS - Abusing Lambda Extensions
Lambda Extensions
Lambda extensions 通过集成各种 监控、可观察性、安全和治理工具 来增强功能。这些扩展通过 .zip 存档使用 Lambda 层 或包含在 容器镜像部署 中添加,运行在两种模式下:内部 和 外部。
内部扩展 与运行时进程合并,使用 特定语言的环境变量 和 包装脚本 操作其启动。这种自定义适用于一系列运行时,包括 Java Correto 8 和 11,Node.js 10 和 12,以及 .NET Core 3.1。
外部扩展 作为独立进程运行,与 Lambda 函数的生命周期保持操作一致。它们兼容各种运行时,如 Node.js 10 和 12,Python 3.7 和 3.8,Ruby 2.5 和 2.7,Java Corretto 8 和 11,.NET Core 3.1,以及 自定义运行时。
外部扩展用于持久化、窃取请求和修改请求
这是这篇文章中提出的技术摘要:https://www.clearvector.com/blog/lambda-spy/
发现 Lambda 运行时环境中的默认 Linux 内核编译了 “process_vm_readv” 和 “process_vm_writev” 系统调用。所有进程都以相同的用户 ID 运行,即使是为外部扩展创建的新进程。这意味着外部扩展可以完全读取和写入 Rapid 的堆内存,这是设计使然。
此外,虽然 Lambda 扩展具有 订阅调用事件 的能力,但 AWS 不会向这些扩展透露原始数据。这确保了 扩展无法访问通过 HTTP 请求传输的敏感信息。
Init (Rapid) 进程在 http://127.0.0.1:9001 监控所有 API 请求,而 Lambda 扩展在执行任何运行时代码之前初始化并运行,但在 Rapid 之后。
变量 AWS_LAMBDA_RUNTIME_API
指示 IP 地址和 端口 号给 子运行时进程 和其他扩展。
通过将 AWS_LAMBDA_RUNTIME_API
环境变量更改为我们有访问权限的 端口
,可以拦截 Lambda 运行时中的所有操作(中间人攻击)。这是可能的,因为扩展与 Rapid Init 具有相同的权限,并且系统内核允许 修改进程内存,从而可以更改端口号。
因为 扩展在任何运行时代码之前运行,修改环境变量将影响运行时进程(例如,Python、Java、Node、Ruby)在启动时。此外,在我们之后加载的扩展,依赖于此变量,也将通过我们的扩展进行路由。这种设置可能使恶意软件能够完全绕过安全措施或直接在运行时环境中记录扩展。
工具 lambda-spy 被创建来执行 内存写入 并 窃取敏感信息 从 lambda 请求、其他 扩展请求 甚至 修改它们。
参考资料
Last updated