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、部分开源FaaS | cgroups/namespace隔离,启动快 | 与宿主机共享内核,运行时漏洞(如runc逃逸类)影响面大 |
| gVisor用户态内核 | Google Cloud Run(官方文档说明采用gVisor沙箱) | 系统调用在用户态Sentry拦截重放,内核攻击面显著收缩 | 兼容性开销与性能损耗(尤其系统调用密集型负载) |
| Firecracker microVM | AWS Lambda(NSDI'20论文披露) | 硬件虚拟化级隔离,论文披露启动时延低至125毫秒、单microVM内存开销低于5MiB | 学术界持续研究其攻击面(如设备模拟与快照机制);密度与启动优化仍是研究热点 |
| 机密计算(TEE) | 研究阶段/云厂商预览能力 | 使用中数据加密(内存级),面向高敏感负载 | 性能开销、远程证明生态成熟度待提升 |
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页)
以下均为真实可查的权威来源,用于支撑本页事实性表述。
OWASP Serverless Top 10(SAS-01注入、SAS-06依赖、SAS-10错误处理):owasp.org/www-project-serverless-top-ten。
Agache et al.《Firecracker: Lightweight Virtualization for Serverless Applications》(NSDI 2020,启动时延与内存开销数据出处):USENIX NSDI'20。
Cloudflare工程博客:基于V8 isolates的无容器计算模型:Cloud computing without containers。
Google Cloud Run官方文档(容器运行时契约,含gVisor沙箱说明):Cloud Run container runtime contract。
AWS Lambda官方文档(SnapStart及"唯一性"注意事项):Improving startup performance with Lambda SnapStart;运行时弃用时间表:Lambda runtimes。
AWS GuardDuty官方文档(对Lambda函数的保护能力):Amazon GuardDuty User Guide。
Cado Security:Denonia恶意软件分析(2023年1月):Cado Security官方博客。
Oakes et al.《SOCK: Rapid Task Provisioning with Serverless-Optimized Containers》(USENIX ATC 2018,冷启动优化经典文献):USENIX ATC'18。