cdxy.me
Cyber Security / Data Science / Trading

函数计算

函数计算(serverless functions)即在云厂商提供隔离的环境中运行用户的脚本代码,用户上传代码+暴露接口即可快速实现一个API服务,其弹性伸缩与底层安全隔离由云厂商实现。支持node,python,java,php等常见服务端开发语言。

本文仅讨论:物理机(IDC)、虚拟机(linux)、容器镜像(dockerfile)及其管理集群(k8s)均不可触达,用户仅通过上传代码来部署服务的业务形态。包括阿里云函数计算、AWS Lambda、Google Cloud Functions、Microsoft Azure Functions。

在此形态中,用户在云控制台选取代码运行环境,上传代码,配置环境变量,配置暴露API,即可创建一个服务。

模拟RCE

业务代码由用户自研,会暴露应用层风险如RCE、SSRF、越权、XSS等问题。接下来看看FC的WEB RCE与传统基于linux服务器的WEB RCE有何不同。

模拟创建一个WEB服务如下:

这个flask web应用实现了一个反弹shell的接口。我们模拟RCE之后反弹shell的行为,将FC的后端os shell反弹到我们的服务器。

这里是个低权限用户的隔离环境,植入容器渗透工具 CDK 搜集一下本地信息:

本地并没有K8s Pod痕迹,也没有已知的逃逸点。其中/code 是挂载进来的代码,只读。/var/fc/runtime/python3/var/log 是运行时的日志位置。

/tmp/var/fc/runtime/python3/var/log目录可写,可以用来存储临时的渗透工具,但是会被定期清除。

持久化与横向移动

由于FC backend的各种中间件(如数据库、文件存储、队列等)都是以接口形式通信的,FC业务部署时将其通过环境变量的方式传递到运行时,或者直接硬编码在代码里。可以通过env命令或者源码中查找AK进行横向移动。

ENV中一般情况下会同时存在FC IAM的AK以及用户自定义的AK。

由于FC执行存在超时时间(允许设定在0-600秒),一般情况下用户业务接口超时时间为秒级,因此通过function内部RCE反弹shell的生存时间很短,必须自动化操作。

总结

  1. 用户自研的业务代码漏洞是主要攻击面。
  2. 由于函数服务运行时timeout限制,因此RCE之后的利用需要尽可能自动化。
  3. 攻击目标:获取到AK与业务源码,横向攻击更多上下游服务。
  4. 从防御视角讲:
    1. 云厂商将FC backend容器运行时权限降至最低以避免系统层穿透。
    2. 用户需要在CI阶段收敛掉业务代码风险,同时严控管理FC服务的AK泄露。
    3. 针对业务层风险内置RASP做运行时防护,RASP可以直接集成进云厂商的serverless/function服务中来cover用户代码的业务层风险。
    4. 云厂商在统一接入层对AK调用的宏观异常行为审计,可以cover到FC被攻陷之后导致的业务AK泄露。