从GCP云函数窃取访问令牌
在身份和访问管理(IAM)中,策略是一组定义访问控制的规则,通过指定谁可以对哪些资源执行什么操作来管理权限。这些策略帮助管理员在环境中有效管理权限。
在Google云平台(GCP)中,策略通常包含三个主要组件:
- 成员 - 通常是用户、服务账户和群组
- 角色/权限 - 定义成员可以对特定资源执行的操作
- 资源 - 策略应用的实际资产,如项目、云函数、存储桶、计算实例等
这些IAM策略中的任何配置错误如果允许意外访问,都可能导致安全风险。
在本博客文章中,我们将探讨一个场景:云函数IAM策略中的配置错误使攻击者能够窃取服务账户的访问令牌。该场景假设我们已经获得了GCP环境的访问权限。
理解云函数
GCP中的云函数类似于AWS Lambda,是由事件驱动操作触发的代码块。这些无服务器函数允许开发人员自动化流程,如图像调整大小、将文件上传到存储桶或在数据库记录修改时发送通知。
我们可以通过不同方式触发云函数:直接使用gcloud functions call命令调用、使用Google云控制台,或向函数的URL发送GET或POST请求。
更新云函数的IAM策略变更
过去,任何分配了cloudfunctions.admin或cloudfunctions.developer角色的用户或服务账户都能直接对函数进行更改。但Google更改了IAM策略,现在只有服务账户可以更新函数。
要更新函数:
- 服务账户必须具有cloudfunctions.developer角色或cloudfunctions.admin角色
如果用户想要更新函数,他们需要iam.serviceAccountUser角色或iam.serviceAccounts.actAs权限。这使他们能够模拟具有管理员或开发者角色的服务账户并进行更新。
利用步骤
1. 使用服务账户进行身份验证
首先使用gcloud auth命令进行身份验证,并提供服务账户JSON文件进行认证。
|
|
2. 枚举IAM策略
访问环境后,我们开始枚举过程,使用gcloud projects get-iam-policy命令检查分配项目的IAM策略。
|
|
3. 检查自定义角色的权限
由于自定义角色具有特定的权限集,我们需要检查分配了哪些权限。
|
|
4. 列出可用函数
接下来,我们检查可访问的资源,如函数。要列出可用函数,可以使用gcloud functions命令。
|
|
5. 查看函数详细信息
获得可用函数列表后,我们可以使用describe命令获取每个函数的更多详细信息。
|
|
6. 检查每个函数的IAM策略
接下来,我们使用gcloud get-iam-policy命令检查每个可访问函数的IAM策略。
|
|
7. 调用函数
此时,我们可以通过向函数元数据中找到的URL发送GET或POST请求来触发函数。
|
|
访问令牌在一小时后过期。
8. 验证访问令牌
获得访问令牌后,我们可以通过访问以下URL并粘贴访问令牌来验证其有效性。
|
|
缓解策略
- 重新配置IAM策略,移除allUsers和allAuthenticatedUsers调用函数的权限
- 通过审查函数代码确保访问令牌永远不会被记录、打印或以任何方式暴露
- 如果需要访问令牌,使用密钥管理器安全地存储和检索
如本文所示,资源级别(如云函数)的错误配置IAM策略允许所有用户调用函数。这种错误配置使我们能够运行函数并检索访问令牌,即使我们用于身份验证的服务账户只有具有有限权限的查看者角色。