课题研究 云安全与容器安全 子课题04 · 第04页 / 共8页
04子课题 · Serverless与函数计算安全

Serverless与函数计算安全第04页:函数代码与运行时安全

函数时代的注入以"间接注入"为主形态:攻击者经S3对象键、消息属性、Webhook体等合法事件通道投递载荷,完全不触碰HTTP入口。本页给出六类代码风险与函数场景注入路径的映射及基线防护,基于NSDI 2020等公开文献评估隔离技术谱系(从V8 isolates到Firecracker microVM),并将平台执行约束(只读文件系统、900秒超时、/tmp、无入站连接)转化为防护原语。同时覆盖冷启动缓解的安全副作用——SnapStart官方"唯一性"警告、热环境复用风险——以及以"出站目的地基线"为核心的函数行为检测方法,并以Denonia挖矿事件深度剖析收束。

Serverless事件注入SSTI反序列化SSRF隔离机制FirecrackergVisorV8 isolatesSnapStart运行时弃用行为检测Denonia研究状态:研究中
所属专题互联网基础设施安全 › 云安全与容器安全
目标受众应用开发者、平台工程/SRE、检测规则工程师、云安全研究人员
本节要点六类注入路径 / 隔离技术选型矩阵 / 执行约束防护化 / 出站基线检测 / Denonia剖析

01 · 函数代码层风险谱系

1.1 注入:函数时代的"间接注入"为主形态

OWASP Serverless Top 10将注入(SAS-01)列为函数首位风险,其形态与传统Web应用有本质差异:传统注入的输入来自HTTP参数,而函数输入来自事件对象——攻击者可以经由S3对象键名(PutObject时控制键名)、SQS消息属性、EventBridge事件detail字段、定时事件的常量输入、第三方Webhook体等"合法"事件通道投递恶意载荷,完全不触碰HTTP入口。文献中这类手法被称为"事件注入"(Event Injection)。防御纵深必须覆盖每条事件链路:

风险类型函数场景注入路径基线防护
命令注入事件字段拼接入shell命令、系统调用或子进程参数禁止shell拼接;参数数组化;白名单命令集
模板注入(SSTI)事件字段进入服务端模板引擎(如用户可控文件名进入报表模板)模板与数据严格分离;用户输入只作为渲染数据进入上下文
反序列化消息体触发危险反序列化(如Java原生反序列化、pickle类机制)禁用危险反序列化器;JSON Schema强校验后再映射对象
SSRF事件字段被用作URL(如"从该地址拉取文件处理"型函数)出站URL白名单;解析后校验IP范围;阻断链路本地与元数据地址
路径穿越对象键/文件名拼接本地路径(/tmp写入场景)规范化路径后校验前缀;禁止..序列;固定目录沙箱
数据访问注入事件字段拼接NoSQL查询条件(DynamoDB/Firestore查询注入)参数化条件表达式;禁止字符串拼接查询;键名白名单

1.2 输入治理的统一方法

  • Schema先行:为每类事件定义JSON Schema并在函数入口校验;EventBridge等托管总线支持事件模式(Event Pattern)注册——模式本身是廉价的输入合约。
  • 白名单优于黑名单:允许字符集、键名集合、取值枚举应显式声明;黑名单在编码变形面前无效。
  • 最小权限兜底:注入防护失效时,受限执行角色决定爆炸半径——代码安全与权限安全互为纵深(第3页)。
  • 输出与错误治理:SAS-10(不当错误处理)要求生产函数隐藏堆栈与配置细节,避免错误响应回显环境变量、内部ARN与查询语句。

02 · 运行时与执行环境安全

2.1 隔离技术谱系与强度评估

函数平台处理"不可信多租户代码"的隔离强度,决定了逃逸与侧向影响的理论上限。下表基于公开技术文献(Firecracker NSDI 2020论文、Cloudflare工程博客、各平台官方文档)整理:

隔离机制采用平台隔离强度与特点已知局限与研究关注点
V8 isolates(语言沙箱)Cloudflare Workers同进程内隔离舱,毫秒级启动、极高密度;无独立内核面侧信道敏感性受公开研究关注;不适合需要完整系统调用的负载
共享内核容器早期Lambda、部分开源FaaScgroups/namespace隔离,启动快与宿主机共享内核,运行时漏洞(如runc逃逸类)影响面大
gVisor用户态内核Google Cloud Run(官方文档说明采用gVisor沙箱)系统调用在用户态Sentry拦截重放,内核攻击面显著收缩兼容性开销与性能损耗(尤其系统调用密集型负载)
Firecracker microVMAWS Lambda(NSDI'20论文披露)硬件虚拟化级隔离,论文披露启动时延低至125毫秒、单microVM内存开销低于5MiB学术界持续研究其攻击面(如设备模拟与快照机制);密度与启动优化仍是研究热点
机密计算(TEE)研究阶段/云厂商预览能力使用中数据加密(内存级),面向高敏感负载性能开销、远程证明生态成熟度待提升
函数隔离技术演进路径
隔离强度随演进路径递增;选型需权衡密度、时延与生态
说明:各机制事实依据见NSDI'20论文、Cloudflare工程博客与平台官方文档;本节不提供攻击实现细节。

2.2 平台执行约束的防护化利用

官方执行约束本身就是免费的防护原语,应在架构中显式利用:

  • 只读文件系统(除/tmp):天然阻断持久化写入型攻击;确保代码不依赖写系统目录;/tmp写入内容在调用间可能短时保留,敏感临时文件须主动清理并禁止信任其中残留数据(第2页已述)。
  • 超时与内存最小化:执行时长上限900秒;按真实需求配置超时与内存(128MB—10,240MB)——约束越小,注入后的可用窗口与算力越小,成本护栏越有效。
  • 无入站连接模型:函数不接受入站连接,攻击者无法反连控制——但这也意味着"回调类"恶意逻辑必须经出站通道实现,出站审计即成为检测命门(第5、7页)。
  • 并发上限:账户级默认1,000并发/区域;函数级预留并发既是资源保障也是熔断手段(第7页)。

2.3 冷启动、快照与"唯一性"安全

冷启动是Serverless的标志性工程问题,其缓解手段引入新的安全注意点:

  • 预置并发/预热实例:消除冷启动但常驻实例扩大了"热环境"窗口——长驻执行环境中缓存的密钥与连接须按常驻资产管理。
  • SnapStart(快照启动):Lambda于2022年re:Invent面向Java运行时发布;发布函数版本时完成初始化并打快照、调用时恢复。AWS官方文档明确提示"唯一性"风险:依赖唯一状态生成的代码(随机种子、UUID生成、一次性令牌)在快照恢复后可能产生重复值——此类逻辑必须经快照兼容性审查。
  • 执行环境复用:热启动复用同一进程——全局变量、内存缓存、临时文件均跨调用存活;绝不可将"本请求"的敏感数据放入可跨调用残留的位置。

2.4 扩展(Extensions)的权限治理

Lambda Extensions是运行在执行环境内的伴生进程(官方文档:Lambda extensions),用于遥测、监控与密钥缓存。安全要点:①扩展与函数代码共享同一执行环境与执行角色凭证——第三方扩展在函数权限下可执行任意操作,引入前须按对待函数代码同等的标准审查;②优先使用AWS托管或经社区审计的开源扩展(如上述Parameters and Secrets扩展);③扩展的日志与出站长存于执行环境生命周期内,应纳入出站基线审计范围(第03节)。

2.5 运行时版本与补丁治理

  • 托管运行时弃用纪律:AWS官方发布运行时弃用时间表(deprecation schedule),弃用后函数仍可运行但不再获得补丁——运行时已弃用函数等同于长期暴露的未修补资产,治理目标是弃用运行时占比为零(第8页度量指标)。
  • 自带运行时与容器镜像函数:自定义运行时与容器镜像(2020年12月起支持)将补丁责任完全转移给客户;镜像须固定digest、限定可信基础镜像来源(第6页)。
  • 统一语言基线:组织级函数模板应固化语言版本、依赖升级策略与安全头/日志规范,避免"每个开发者一个版本"。

03 · 函数行为检测

3.1 检测数据源组合

函数默认不可登录、无Agent,检测必须组合平台遥测:CloudWatch日志与指标、AWS X-Ray跟踪、GuardDuty(提供针对Lambda函数的保护能力,可检测异常网络行为,官方文档可查)、VPC Flow Logs与DNS解析日志(函数位于VPC时)、CloudTrail管理事件与数据事件(Lambda Invoke数据事件需显式开启)。Azure与GCP对应能力为Defender for Cloud、Azure Activity Log与Cloud Audit Logs、Security Command Center。

3.2 行为基线与高危信号

检测场景信号特征数据源
加密货币挖矿出站连接矿池域名/IP;CPU持续打满;/tmp落盘ELF二进制执行DNS日志、GuardDuty、CloudWatch CPU指标
DNS隧道/DoH规避函数解析器不使用平台DNS而直连外部DoH端点(Denonia特征)出站443流量至DoH服务、VPC Flow Logs
凭证与数据外泄出站目的地偏离基线(新域名/新区域)、单次调用数据量异常NAT出口日志、GuardDuty exfiltration类发现
注入利用尝试事件字段出现命令分隔符、路径穿越序列、模板语法函数日志(经检测规则/正则)、WAF日志
持久化动作新增事件源映射/定时规则、函数代码在非部署窗口更新CloudTrail(CreateEventSourceMapping/PutRule/UpdateFunctionCode)
计费面异常调用量/并发/时长偏离基线;单函数费用突增Cost Anomaly Detection、CloudWatch指标

出站基线方法是函数检测的核心抓手:绝大多数函数的正常行为是"接收事件→访问少数几个托管后端端点→返回"。为每个函数建立出站目的地基线(域名+端口+区域),偏离即告警——这一方法同时覆盖挖矿、外泄与C2回调三类最典型滥用,且误报率远低于通用规则。

04 · 深度剖析:Denonia挖矿事件(2023)

维度事实与分析(来源:Cado Security官方披露,2023年1月)
样本性质首个公开针对AWS Lambda执行环境的恶意软件样本:x86_64架构ELF二进制,含Lambda环境探测逻辑(识别执行环境特征后激活行为)
恶意行为运行XMRig门罗币挖矿程序,占用函数算力产生加密货币收益
规避手法通过DNS over HTTPS(Cloudflare与Google公共DoH端点)解析矿池域名,绕过基于传统DNS解析日志的检测——函数检测不能假设"看得到DNS"
进入途径披露方推测为云凭证泄露后部署(符合"凭证泄露→批量部署函数→挖矿"的公开报告常见链路)
防护映射①凭证治理与短期凭证(第3页)压缩入侵面;②出站基线检测覆盖DoH端点与矿池连接(本节);③GuardDuty与账单异常双告警(第7页);④函数级预留并发限制挖矿算力上限(第7页)

本节参考来源(第4页)

以下均为真实可查的权威来源,用于支撑本页事实性表述。

[1]

OWASP Serverless Top 10(SAS-01注入、SAS-06依赖、SAS-10错误处理):owasp.org/www-project-serverless-top-ten。

[2]

Agache et al.《Firecracker: Lightweight Virtualization for Serverless Applications》(NSDI 2020,启动时延与内存开销数据出处):USENIX NSDI'20。

[3]

Cloudflare工程博客:基于V8 isolates的无容器计算模型:Cloud computing without containers。

[4]

Google Cloud Run官方文档(容器运行时契约,含gVisor沙箱说明):Cloud Run container runtime contract。

[5]

AWS Lambda官方文档(SnapStart及"唯一性"注意事项):Improving startup performance with Lambda SnapStart;运行时弃用时间表:Lambda runtimes。

[6]

AWS GuardDuty官方文档(对Lambda函数的保护能力):Amazon GuardDuty User Guide。

[7]

Cado Security:Denonia恶意软件分析(2023年1月):Cado Security官方博客。

[8]

Oakes et al.《SOCK: Rapid Task Provisioning with Serverless-Optimized Containers》(USENIX ATC 2018,冷启动优化经典文献):USENIX ATC'18。