0156.Netlify身份验证令牌在MozillaCI公共日志中泄露

admin 2026-04-29 05:08:13 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档披露了MozillaCI系统公共日志中Netlify身份验证令牌泄露的安全事件。泄露的令牌具有对MozillaITWebSRE账户的完全访问权限,可导致金融盗窃、网站篡改、数据泄露等严重后果。关键发现包括令牌暴露的具体URL路径和验证方法,并建议立即撤销令牌、审计CI/CD日志记录实践、增强令牌安全措施。 综合评分: 88 文章分类: 漏洞分析,数据安全,云安全,应用安全,安全建设


cover_image

0156. Netlify 身份验证令牌在 Mozilla CI 公共日志中泄露

原创

Rsec Rsec

Rsec

2026年4月27日 11:50 贵州

在小说阅读器读本章

去阅读

来源:Hackerone报告

编号:2915647

严重程度:Critical (10.0)

汇报者:samirsec0x01

类型:信息泄露

产品介绍(可以先跳过这部分)

Mozilla CI

Mozilla CI 是 Mozilla 公司为其核心产品(尤其是 Firefox)搭建的一套庞大、高度自动化的持续集成系统,这套系统是确保 Firefox 这类拥有数千万行代码的软件在快速迭代下仍能保持质量与稳定的基石。其规模宏大,每月例行执行超过 700 万个任务,最高可同时处理 35 万个任务。

它由几个核心部分组成:

🛠️ 任务执行框架: Taskcluster:Mozilla 自主研发的 CI 核心引擎,可根据需求灵活定制任务执行流程,不仅支撑着整个 Firefox CI 的运行,也以开源形式提供。

🏗️ 核心实例: Firefox CI:面向 Firefox 等核心产品,由专业的发布工程团队维护,是绝大多数构建和测试任务的实际运行环境。

🧩 任务定义器: Taskgraph (Python库):开发者主要在此通过声明式方式定义 CI 任务,Taskgraph 会将其转为有依赖关系的任务图并提交给 Taskcluster。

📊 可视化仪表盘: Treeherder:开发者查看任务状态的“驾驶舱”,用于监控运行状态、分析日志和追踪失败原因。

Netlify

Netlify 是一个为了简化现代 Web 项目部署而生的综合性平台。它将代码从 Git 仓库到线上环境的复杂流程,自动化成简单操作,让开发者可以专注于编码本身,被誉为 JAMstack 架构的先行者和推动者

开始

我们发现了一个严重漏洞,该漏洞涉及公开日志中泄露的 Netlify 身份验证令牌。该令牌赋予了 Mozilla IT Web SRE Netlify 账户的完全访问权限,绕过了所有限制。该令牌的权限涵盖了所有者、开发人员、计费管理员、审核员、发布者和内容编辑等角色,从而赋予了对站点管理、部署、计费和内容配置的完全控制权。这个泄露的 API 密钥构成了重大的安全风险,使未经授权的用户能够随意操纵账户及其关联资产。

关键信息:

  • 已曝光令牌: ███

  • 暴露来源:

  • 公开网址:https://firefox-ci-tc.services.mozilla.com/tasks/d5NRF8FdQamV9XdPO_mTBQ/runs/0/logs/public/logs/live.log

  • 文件:live.log

  • 用于验证的 API:

    Netlify API 文档

  • 网站面临风险:

    https://crash-pings.mozilla.org

  • 风险账户:

    Mozilla IT Web SRE

#

重现步骤:

  1. 访问公共日志:
  • 在浏览器中打开以下网址: Mozilla CI Logs 。
  1. 找到暴露的令牌:
  • 在日志文件中搜索关键字 auth:
  • 提取 Netlify 令牌(例如 ███ )。
  1. 验证令牌有效性:
  • 使用该令牌查询 Netlify API。例如:
curl -X GET https://api.netlify.com/api/v1/accounts -H "Authorization: Bearer ████" -s | jq
  • 查看包含有关 Netlify 帐户站点的敏感信息的响应
[  {    "name": "Mozilla IT Web SRE",    "slug": "mozilla-it",    "role": "Developer",    ...    ...    "selected_access_site_ids": [      "5a05c659-aa54-4184-bdbe-7faa4dd497b5"    ],    "billing_name": "it-sre",    "billing_email": "[email protected]",    "billing_details": null,    ...    ...    "roles_allowed": [      "Owner",      "Developer",      "Billing Admin",      "Reviewer",      "Publisher",      "Content Editor"    ],    "created_at": "2019-06-26T13:57:19.242Z",    "updated_at": "2024-07-08T18:56:21.541Z",    "has_site_password": false,    "site_sso_login": false,    "site_sso_login_context": "all",    "site_jwt_secret": null,    "saml_config": {      "idp_entity_id": "urn:auth.mozilla.auth0.com",      "idp_sso_target_url": "https://auth.mozilla.auth0.com/samlp/hj3jYIhcrgvPWTpnFoHWLPx57t6KKqhA",      "idp_slo_target_url": "https://auth.mozilla.auth0.com/samlp/hj3jYIhcrgvPWTpnFoHWLPx57t6KKqhA/logout",      "idp_cert_fingerprint": "2F:C4:72:FC:FE:1C:69:A6:6E:8B:A7:FA:72:AA:3D:08:B0:A0:6A:F8"    },    "saml_session_expiration": 604800,    "deploy_notifications_per_repo": true,    "payments_gateway_name": "zuora_production",    "lifecycle_state": "active",    "lifecycle_state_reason": null,    "weeks_past_due": null,    "days_until_disabled": null,    "current_billing_period_start": "2024-12-26T00:00:00.000-08:00",    "next_billing_period_start": "2025-01-26T00:00:00.000-08:00",    "current_usage_period_start": "2024-12-01T00:00:00.000-08:00",    "next_usage_period_start": "2025-01-01T00:00:00.000-08:00",    ...    ...    "type_name": "Enterprise",    "type_id": "58f792a3d6865d698b6879bd",    "type_slug": "enterprise",    "monthly_seats_addon_dollar_price": "0.0",    "owner_ids": [      "60be48126deb9594c56ad4a0",      "60c285a4fa8ef00f41b7a171",      "60eda0538f4cf6540569b4b5",      "62548540b51a811561330ed7",      "62c5e063fe09d502f8dc2519",      "62f22a000c27a1187e2be65b",      "62ffe60780a012285fb7d36f",      "63b429858592e6679549e622",      "650deaef51dc692b41f8b3f2",      "658210e2646ba26e2d050ff4"    ],    "saml_enabled": true,    "org_saml_enabled": false,    "org_mfa_enabled": false,    "default": false,    "cancellable": false,    "has_builds": true,    "enforce_saml": "enforced_strict",    "team_logo_url": null,    "can_start_pro_trial": false,    "on_pro_trial": false,    "can_start_enterprise_trial": false,    "on_enterprise_trial": false,    "security_contacts": [],    "gitlab_self_hosted_config": null,    "github_enterprise_config": null,    "bitbucket_self_hosted_config": null  }]
  1. 确认完全访问权限:
  • 执行其他 API 请求,例如部署、删除或修改站点。
  • 例如,访问敏感日志、环境变量或站点配置。
  • 您可以在 Netlify API 文档中测试所有端点: https://open-api.netlify.com

建议

  1. 撤销令牌:
  • 立即撤销已泄露的令牌,并通知所有受影响的利益相关者。
  1. 审计日志记录实践:
  • 检查所有 CI/CD 流水线,确保敏感数据(例如身份验证令牌)已被屏蔽。
  1. 增强令牌安全性:
  • 实施 OAuth 权限范围或 IP 白名单来限制令牌的使用。
  • 监控可疑的 API 使用情况,以检测可能的漏洞利用。

#

影响

泄露的身份验证令牌提供了对 Netlify 账户的完全访问权限,从而导致以下风险:

  1. 金融盗窃:修改 billing_email,将所有款项转入攻击者控制的账户。
  2. 受损网站:修改、删除或部署关联网站( https://crash-pings.mozilla.org )上的恶意内容。
  3. 数据泄露:访问环境变量、日志和其他敏感配置数据。
  4. 名誉损害:利用被盗用的账户托管恶意内容或发起网络钓鱼攻击。
  5. 永久失控:删除所有站点和配置,造成不可逆转的损害。

#

#

思考:

1.获取子域名:https://firefox-ci-tc.services.mozilla.com,该子域名并不在Mozilla的赏金漏洞范围中,所以要自行挖掘。

#

2.发现url:通过扫描、前端代码审计、公开的资源、搜索引擎等方式发现该url。

https://firefox-ci-tc.services.mozilla.com/tasks/d5NRF8FdQamV9XdPO_mTBQ/runs/0/logs/public/logs/live.log

#

3. 发现令牌:如果觉得麻烦,可以喂给AI。担心AI出错,也可以同时使用工具审计。

#

4.识别令牌作用:并且能实际利用令牌:log文件中应该会提到关键词,有了关键词根据令牌搜索调用方式就可以。

curl -X GET https://api.netlify.com/api/v1/accounts -H "Authorization: Bearer ████" -s | jq

#

如果您觉得这篇文章有用,请点个赞👍

#

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Rsec Rsec Rsec《0156. Netlify 身份验证令牌在 Mozilla CI 公共日志中泄露》

评论:0   参与:  0