现在我们知道了,很多 Serverless 的用户代码都跑在一个个容器内。不同应用的代码运行于不同的容器之上,依靠容器原本的能力进行资源回收和隔离。由于 Serverless 应用的代码会进行相应的结构化解耦,且每个应用容器的底层环境相对来说是一致的。所以其实,根据应用漏洞获取更多应用类 Serverless 容器不仅困难而且在内网渗透中作用相对较为有限,能做的事情也相对较少。
但其实在不同的 Serverless 架构中,都有多类持久化且公用的容器以实现程序调度、代码预编译、代码下载运行等逻辑。
这类容器一般拥有获取所有用户代码、配置和环境变量的能力,同时也比较容易出现 Docker IN Docker 或大权限 Service Account 的设计。
如何控制这类型的容器呢?以下是我们在攻防过程中遇到的场景:
- 在下载源代码时,使用 git clone 进行命令拼接,导致存在命令注入;
- 在安装 node.js 依赖包时,构造特殊的 package.json 利用 preinstall 控制公用容器。
- 配置指向恶意第三方仓库的 pip requirements.txt,利用恶意 pip 包获取依赖打包容器的权限,同类的利用手法还可以作用于 nodejs、ruby 等语言的包管理器。
- 因为容器镜像里的打了低版本 git、go 等程序,在执行 git clone, git submodule update(CVE-2019-19604), go get 时所导致的命令执行,
下图为 CVE-2018-6574 的 POC 可参考: https://github.com/neargle/CVE-2018-6574-POC/blob/master/main.go。
最后编辑: kuteng 文档更新时间: 2022-06-01 16:24 作者:kuteng