了解配置错误的 Lambda 函数 URL 的安全风险以及如何正确保护它们,原文:https://www.wiz.io/blog/securing-aws-lambda-function-urls/
AWS 最近推出了Lambda 函数 URL,这是一项新功能,允许云构建者为 Lambda 函数设置简单的专用应用程序端点。其他云服务提供商也支持类似的功能,例如GCP HTTP 云函数和Azure 函数 HTTP 触发器。
尽管 Lambda 函数已经可以通过API 网关和负载均衡器对外公开,但 Lambda URL 让 AWS 用户能够以最小的开销快速跟踪此过程,用于 webhook 处理程序等简单的用例。此外,可以在无服务器应用程序的开发和测试期间使用 Lambda URL,使开发人员可以专注于核心功能,并将验证和授权要求的处理推迟到开发的后期阶段。
使用 AWS Lambda 函数 URL 的不安全使用
Lambda 函数 URL 可能很简单,但与云环境中的任何其他外部公开资源一样,妥善保护它们很重要。
以下情况中,函数URL可能受到攻击:
- 攻击者在生产环境中发现了Lambda 函数 URL(我们将在下一节中对此进行扩展)
- 它已被错误配置为无需身份验证即可接受 HTTP 请求。
- 如果未配置身份验证,遵循默认配置:该函数的资源策略授权未经身份验证的主体调用。
- 攻击者对于所接收参数较为了解。
注:最后一个要求可能很棘手,取决于函数 API 的复杂性:
下图是有攻击风险的 Lambda 函数 URL:
在上述场景中,根据目标函数的作用,攻击者可能会对目标云环境构成多种风险:
任意数据读取和操作
如果目标函数对敏感或关键业务数据具有读取或写入权限,在某些情况下,攻击者可能会滥用该函数来查询、删除、覆盖或添加脏数据,影响其机密性和完整性。
权限提升
在极少情况下,目标函数旨在用于管理目的,例如创建新用户或角色、将用户添加到现有组、更改权限、修改策略、重置密码等,那么攻击者可以滥用该功能以获取对环境的访问权限或提升现有权限。
上马、挖矿
如果目标函数运行易受远程代码执行影响的软件的受影响版本,或者如果函数的代码本身恰好包含这样的漏洞,那么攻击者可能会发现这一点并利用它来运行恶意软件,例如挖矿,直到函数配置为超时,最长可达 15 分钟。
此外,即使没有完全理解函数的功能,也可以通过简单的自动重复调用函数便可破坏目标组织的运营,如下几种情况:
从发掘到利用
理论上,他们可以通过在被动 DNS 数据中查询匹配正则表达式的子域来枚举所有函数 URL 。注意:查询 TLS证书透明度日志是行不通的,因为 Lambda 显然只为每个区域使用一个通配符证书,而不是为每个唯一的子域颁发单独的证书。
攻击者可以尝试依次访问这些 URL,标记允许未经身份验证访问的 URL 以供进一步研究。
函数 URL 的另一个潜在来源是开发工件。攻击者可以搜索最初用于测试目的的函数 URL 的源代码,这些 URL 可能意外地留在生产代码中并且从未被禁用。
AWS Lambda 函数 URL 最佳安全配置
有多种方法可以保护 Lambda 函数 URL 并保护您的环境免受上述场景的影响。一般来说,最佳实践是始终要求对 Lambda 函数的调用进行身份验证和授权,并将其托管在 VPC 内的私有子网中。如果您的函数需要公共 Internet 访问,例如查询外部非 AWS API,那么您应该通过同一 VPC 内公共子网中的 NAT 网关公开它。
IAM认证
启用IAM 身份验证(身份验证类型设置为AWS_IAM,这是默认设置)后,函数 URL 本身仅接受由 AWS 访问密钥签名的 HTTP 请求,并且仅当该密钥属于具有有效lambda:InvokeFunctionUrl权限的委托人时。
这意味着对于同帐户访问,他们必须通过其身份策略授予此权限,而对于跨帐户访问,也必须由函数的资源策略授予,否则请求将被拒绝。实际上,这确保了只有经过身份验证的 AWS 用户才能通过其 URL 调用该函数
相反,如果通过 AWS 控制台禁用函数 URL 的 IAM 身份验证(身份验证类型设置为NONE)(不建议这样做),AWS 将自动附加授予公共访问权限的资源策略(即,*设置为lambda:InvokeFunctionUrl操作的委托人)。如果您确实决定允许通过其 URL 未经身份验证调用该函数,请确保该函数在您的环境中具有最小权限,以最大程度地降低风险。您还可以在函数本身内实施自定义身份验证方案作为 IAM 身份验证的替代方案,但这不是最佳实践。
IAM 授权
除了 IAM 身份验证之外,通过配置一个 IAM 资源策略来确定谁有权调用函数、在什么条件下以及是直接调用 ( lambda:InvokeFunction) 还是通过其 URL ( lambda:InvokeFunctionUrl),您可以白名单的方式限制特定委托人的调用,从而减少公众暴露的风险。
但是,您应该避免使用过于宽松的资源策略,例如直接通过 URL 将通配符(*)设置为调用主体,因为这将授权任何经过身份验证的 AWS 用户调用该函数,并且基本上任何人都可以创建 AWS帐户。
CORS
如果启用了跨域资源共享(CORS)配置,默认情况下函数 URL 将接受来自任何源(域)的 HTTP 请求,不建议这样做。
因此,您应该配置额外的 CORS 约束,例如只允许来自特定来源的 HTTP 请求,或包含特定标头和 HTTP 方法(GET、POST等)的请求。
注意:CORS 本身并不是一个强大的安全屏障,理论上,攻击者可以进行CORS欺骗来绕过你所做的约束。
预留并发
通过使用 URL 为每个函数保留并发性并将其限制为最大值,您可以确保即使某个函数 URL 被重复调用以试图造成中断的恶意行为者。选择最大值时,应根据函数的具体使用情况进行调整。将其设置得太低可能会缓解拒绝服务攻击,而将其设置得太高可能会导致拒绝钱包攻击。
使用 Wiz 保护 AWS Lambda 函数 URL
Wiz 为防御者提供跨计算和暴露选项的覆盖范围,因此您不必单独为每个风险建模 - 我们为您完成并在安全图上对其进行抽象。就 Wiz 而言,Lambda 函数 URL 只是另一个暴露路径。Wiz 通过提供预先构建的控制和配置规则来提醒您注意网络设计、资源配置、身份等的有害组合,从而帮助云构建者确保他们安全地使用 Lambda 函数 URL。