在Serverless架构席卷云计算的今天,其轻量化、高弹性的特性背后隐藏着严峻的安全挑战——身份令牌正成为攻击者突破云环境的新入口。本文将深入解析三大云平台Serverless认证机制的脆弱环节,还原攻击者从SSRF漏洞利用到令牌窃取的全链条攻击路径,并给出防护方案。无论您是云安全工程师还是架构师,都能从中获得可直接落地的安全实践,帮助企业在享受Serverless技术红利的同时,筑牢云端最后一道防线。 注:本文翻译自Unit 42的文章《Serverless Tokens in the Cloud: Exploitation and Detections》[1],可点击文末“阅读原文”按钮查看英文原文。 全文如下: 本文概述了主流云平台Serverless认证机制的运行原理及安全影响。攻击者将Serverless函数作为目标,企图利用应用开发者部署不安全代码和错误配置云函数所产生的漏洞。成功利用这些弱点可使攻击者获取凭据并实施滥用。 Serverless计算函数通常与云身份相关联,这些身份通过认证令牌获取临时、限定范围的云服务和资源访问权限。窃取这些令牌可能导致云环境暴露于安全风险之中。 AWS Lambda[2]、Azure Functions[3]和Google Cloud Run Functions[4]等Serverless平台及函数均使用凭据体系,包括AWS中的身份与访问管理(IAM)[5]角色、Azure的托管身份[6]以及谷歌云平台(GCP)的服务账户令牌[7]。 理解这些服务的运行机制有助于制定有效策略,既可避免令牌暴露,也能检测可能导致云环境沦陷的令牌滥用行为。此类安全事件通常涉及权限提升、在环境中维持恶意持久化,以及窃取本应仅限合法身份访问的敏感信息。 Serverless计算是一种云服务模型,AWS(Lambda)、Azure(Functions)和谷歌云(Functions)等提供商负责基础设施管理、弹性扩展和运维工作。该模型使企业及其开发者能专注于代码开发,而云服务商处理后端任务。 Serverless函数基于事件驱动机制运行,通过HTTP请求、数据库变更或定时事件等触发器执行。函数服务的自动扩缩容功能可根据需求调整资源,云服务商仅按实际执行时间和资源用量计费,确保成本效益。 尽管Serverless计算简化了开发和部署流程,但必须认清与此类服务相关的潜在风险。部分风险源于开发者可为Serverless函数分配身份,这些身份以凭证集形式呈现,可供函数内执行的代码访问。此类凭证用于云操作的身份验证和授权。 这些凭证附带的权限集合决定了其使用范围。根据函数绑定身份所关联的权限,相关凭证可能被用于访问云资源和敏感数据。 攻击者瞄准Serverless函数的原因包括: 在使用Serverless函数时,必须充分考虑应用开发者向云函数部署不安全代码所带来的风险,并深入理解针对这些函数的威胁态势。 Serverless架构通过按需执行函数来部署应用,其核心优势在于可根据需求启停应用或特定组件,无需持续维护运行环境。 各主流云服务商的Serverless函数具有以下共性特征: AWS通过IAM服务管理用户、权限、群组和角色,控制对云账户/服务的访问权限。Lambda角色默认无权限,需通过IAM策略管理对其他AWS服务的访问授权。 为简化权限管理,AWS提供托管策略(如 这种机制通过运行时动态获取凭证,避免了长期硬编码凭证的风险。凭证权限范围受角色关联策略约束,包含访问密钥ID、秘密访问密钥和会话令牌三要素。Lambda运行时服务将这些凭证加载至函数执行环境,存储为 谷歌云函数使用服务账户令牌进行身份验证。服务账户是关联于项目的特殊账号,代表非人类实体身份。部署时可选择绑定自定义服务账户或默认服务账户[10]: 无组织架构的GCP项目中,默认服务账户具有编辑者Editor权限,允许在项目中创建、修改和删除资源;组织内项目则需显式分配角色权限,否则无任何权限。与传统VM实例类似,函数运行时通过位于 Azure托管身份为资源提供免硬编码凭证的安全认证方案,分为: 认证流程分五步: 该机制既保障了认证安全性,又避免了代码中存储敏感凭证的风险。 译者补充: 本节探讨Serverless函数使用中涉及的风险与威胁。开发者在开发和配置函数时,必须防范SSRF(服务端请求伪造)和RCE(远程代码执行)等攻击。若防护不足,攻击者可能操纵存在漏洞的函数向内部服务发起未授权请求,导致访问令牌、数据库内容或服务配置等敏感信息泄露。需特别强调的是,此类风险主要存在于公开暴露或处理外部输入的函数中。 SSRF攻击:攻击者诱使服务器(如Serverless函数)向本无权限访问的内外部资源发起HTTP请求。由于请求由服务器本身发出,可访问未暴露于互联网的内部服务。例如在GCP中,利用SSRF访问元数据服务器(IMDS) RCE攻击:允许攻击者在函数执行环境中运行任意代码。例如在AWS Lambda中,可通过RCE窃取环境变量中的 需明确,这些攻击向量并非云平台固有缺陷,而是源于开发者编写的存在SSRF/RCE漏洞的不安全代码。通过实施输入验证等安全编码实践可有效降低风险。 以下模拟演示攻击者如何在不同云平台窃取Serverless令牌并实施恶意操作,所有场景均基于开发者部署的不安全函数代码。 部署两个Google Cloud Run函数,从以下路径分别提取默认服务账户和自定义服务账户的令牌: 示例1:提取默认服务账户令牌 示例2:提取GCP自定义服务账户令牌 攻击影响: 在此模拟中,我们访问了 Lambda 函数的环境变量并从中提取了 译者补充:所有模拟攻击均证明,一旦攻击者获取函数身份令牌,即可在对应权限范围内实施数据窃取、横向移动或资源破坏。这凸显了实施最小权限原则和严格输入验证的重要性。 有效的检测机制对识别Serverless环境中的令牌窃取行为至关重要。这些机制主要通过行为异常分析来标记未授权活动,包含两个关键检测阶段: 详细步骤如下: GCP环境中,可通过分析日志中的 如图9日志示例所示,自定义服务账户 一个有效的检测策略是对曾委托权限给默认Serverless服务账户的所有服务账户进行画像分析,确保能识别绑定函数的非默认服务账户。 AWS环境检测特征: Azure环境检测特征: 在安全的云环境中,Serverless函数通常用于执行自动化、限定范围的任务(如响应API请求或处理事件),而非交互式操作。若攻击者获取函数环境或其身份权限,可能滥用其身份直接通过命令行工具(如gcloud CLI或curl)与云资源直接交互。 检测方法一:user agent分析 检测方法二:网络源地址分析 保障Serverless令牌安全需结合主动防御措施、安全状态管理和运行时监控,以降低攻击风险。首要原则是实施最小权限机制,为Serverless功能分配仅需的最低权限角色,从而限制令牌滥用可能造成的危害。 对于GCP和Azure的Serverless运行环境,应配置网络层控制策略并实施请求验证机制,严格限制对实例元数据服务(IMDS)的访问。同时强化输入验证与净化处理,防范攻击者利用SSRF等技术获取敏感元数据、令牌及API、数据库等云资源。 Serverless计算凭借其卓越的扩展性、成本效益和简化的基础设施管理,已成为现代应用开发的首选方案。然而,这些功能与云服务交互所使用的凭证既是关键安全要素,也是攻击者的主要目标。一旦凭证泄露,将导致未授权访问云资源和数据外泄等严重后果。 实施主动的安全状态管理和运行时监控防护,是保障云环境安全的核心策略。企业可通过以下方式加强Serverless环境防护:摘要
一、引言
二、主流云平台Serverless认证机制解析
2.1 AWS Lambda认证机制
AWSLambdaBasicExecutionRol
),开发者常直接绑定此类策略以快速启用基础功能。当Lambda函数关联IAM角色时,AWS安全令牌服务(STS)[8]会自动生成该角色的临时安全凭证[9]。AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
等环境变量供代码调用,确保函数安全交互AWS服务。2.2 谷歌云函数认证机制
<project_id>@appspot.gserviceaccount[.]com
)<project_number>[email protected][.]com
)hxxp://metadata.google[.]internal/
的实例元数据服务器(Instance Metadata Server,IMDS)[13]获取短期有效的服务账户令牌用于GCP服务认证。2.3 Azure函数认证机制
IDENTITY_ENDPOINT
(本地托管身份端点地址,用于请求令牌)和IDENTITY_HEADER
(防SSRF攻击的必需头)IDENTITY_HEADER
的HTTP GET请求 (有关请求结构的详细信息,请参阅 Azure 关于获取应用服务令牌的文档[14] )三、令牌窃取攻击向量分析
3.1 攻击原理剖析
hxxp://metadata.google[.]internal/
可获取短期有效的服务账户令牌,进而以函数身份执行越权操作。AWS_ACCESS_KEY_ID
、AWS_SESSION_TOKEN
等临时凭证。3.2 攻击模拟实验
3.2.1 模拟实验1:从GCP函数直接访问IMDS元数据
hxxp[://]metadata.google[.]internal/computeMetadata/v1/instance/service-accounts/default/token
3.2.2 模拟实验2:利用RCE窃取AWS Lambda环境变量凭证
AWS_ACCESS_KEY_ID
、 AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
。AWS_ACCESS_KEY_ID
等临时凭证(如图6所示)aws s3 ls
列举S3存储桶(如图7所示)3.2.3 模拟实验3:利用RCE从 Azure 函数的本地身份端点检索令牌
IDENTITY_ENDPOINT
和IDENTITY_HEADER
四、令牌窃取检测与防护
4.1 检测Serverless环境中的令牌泄漏
4.1.1 识别Serverless身份
serviceAccountDelegationInfo
字段识别绑定Serverless函数的服务账户。该字段揭示了服务账户的委托链特征——当服务账户绑定函数时,会将其权限委托给默认Serverless服务账户:service-<PROJECT_NUMBER>@serverless-robot-prod.iam.gserviceaccount[.]com
)service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount[.]com
)sa-test@<project-id>.iam.gserviceaccount[.]com
将其权限委托给Cloud Run服务代理。其中:authenticationInfo.principalEmail
字段指明实际使用的服务账户sa-test[@]xdr-analytics.iam.gserviceaccount[.]com
serviceAccountDelegationInfo
字段显示第一方主体(即默认Serverless服务账户,本例中为 service-<PROJECT_NUMBER>@serverless-robot-prod.iam.gserviceaccount[.]com
),证明该身份运行在Cloud Functions或Cloud Run等Serverless环境中
Lambda函数通过IAM角色获取临时凭证,可通过角色名称识别Lambda身份。
Azure Function Apps使用绑定的托管身份进行认证,需监控相关身份的使用模式。4.1.2 识别Serverless身份的异常行为
4.2 防护策略
五、总结
引用链接
[1]
《Serverless Tokens in the Cloud: Exploitation and Detections》:https://unit42.paloaltonetworks.com/serverless-authentication-cloud/[2]
AWS Lambda:https://aws.amazon.com/lambda/[3]
Azure Functions:https://learn.microsoft.com/en-us/azure/azure-functions/functions-overview?pivots=programming-language-csharp[4]
Google Cloud Run Functions:https://cloud.google.com/functions?hl=en[5]
身份与访问管理(IAM):https://docs.aws.amazon.com/whitepapers/latest/introduction-aws-security/identity-and-access-control.html[6]
托管身份:https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview[7]
服务账户令牌:https://cloud.google.com/iam/docs/service-account-creds[8]
安全令牌服务(STS):https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html[9]
临时安全凭证:https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html[10]
默认服务账户:https://cloud.google.com/iam/docs/service-account-types#default[11]
用户管理的帐号:https://cloud.google.com/compute/docs/access/service-accounts#user-managed[12]
根据版本:https://cloud.google.com/run/docs/functions/comparison[13]
实例元数据服务器(Instance Metadata Server,IMDS):https://cloud.google.com/run/docs/container-contract#metadata-server[14]
Azure 关于获取应用服务令牌的文档:https://learn.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=portal%2Cdotnet#using-the-rest-protocol[15]
Microsoft Entra ID:https://learn.microsoft.com/en-us/entra/fundamentals/whatis[16]
Azure Key Vault:https://learn.microsoft.com/en-us/azure/key-vault/general/overview[17]
存储帐户:https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview[18]
基于角色的访问控制(role-based access control,RBAC):https://learn.microsoft.com/en-us/azure/role-based-access-control/overview[19]
资源特定策略:https://learn.microsoft.com/en-us/azure/key-vault/general/secure-your-key-vault#access-policies-vs-azure-rbac[20]
AWS:https://docs.aws.amazon.com/whitepapers/latest/security-overview-aws-lambda[21]
Azure:https://docs.aws.amazon.com/whitepapers/latest/security-overview-aws-lambda[22]
GCP:https://cloud.google.com/iam/docs/best-practices-service-accounts#limit-service-account-privileges