5 百万款应用揭示了 JavaScript 的秘密
Source: Bleeping Computer

概览
泄露的 API 密钥并不新鲜,但前端代码中问题的规模一直是个谜——直到现在。
Intruder’s 研究团队构建了一种新的机密检测方法,并扫描了 5 million 应用,专门寻找隐藏在 JavaScript 包中的机密。
我们发现,这揭示了业界在保护单页应用方面的巨大缺口。
42,000 个隐藏在明处的机密
在大规模应用我们的新检测方法后,结果令人震惊。仅输出文件就超过 100 MB 的纯文本数据,包含 超过 42 000 条泄露的令牌,涉及 334 种机密类型。
这些并非低价值的测试密钥或失效令牌。我们发现了嵌入生产代码中的活跃、关键凭证,实际上绕过了大多数组织依赖的安全控制。
下面是我们发现的最关键风险的分类。
代码仓库令牌
最具影响力的泄露是针对代码仓库平台(如 GitHub 和 GitLab)的令牌。我们共找到了 688 条令牌,其中许多仍然活跃并授予完整的仓库访问权限。
示例: 在 JavaScript 文件中硬编码的 GitLab 个人访问令牌。该令牌的作用域允许访问组织内的 所有私有仓库,包括下游服务(AWS、SSH 等)的 CI/CD 流水线机密。

项目管理 API 密钥
另一大泄露涉及 Linear(一款项目管理工具)的 API 密钥,直接嵌入前端代码中。

该令牌可不受限制地访问组织的整个 Linear 实例——内部工单、项目以及与下游 SaaS 服务的链接。
其他泄露的机密
我们在大量其他服务中识别出了机密:
- CAD 软件 API – 访问用户数据、项目元数据和建筑设计(包括一家医院)。
- 邮件平台 – 访问邮件列表、营销活动和订阅者数据。
- 聊天/自动化平台的 Webhook – 213 条 Slack、2 条 Microsoft Teams、1 条 Discord 和 98 条 Zapier webhook,全部处于激活状态。
- PDF 转换器 – 访问第三方文档生成工具。
- 销售情报与分析平台 – 访问抓取的公司和联系人数据。
- 链接缩短服务 – 能够创建和枚举短链接。
要点: 将机密嵌入源代码——尤其是前端资产——会形成巨大的攻击面。定期的自动化扫描、机密管理策略以及严格的 CI/CD 卫生是防止此类泄露的关键。
Source: …
为什么这些密钥会被漏掉?
传统扫描器不会“解析” JavaScript
传统的、全自动的应用密钥检测方法是:
- 搜索一组已知路径。
- 使用正则表达式匹配已知的密钥格式。
虽然有用,但这种方法显而易见地有限,无法检测所有类型的泄漏——尤其是需要扫描器爬取整个应用或进行身份验证的情况。
示例: Nuclei 的 GitLab 个人访问令牌模板
当扫描器收到一个基础 URL(例如 https://portal.intruder.io/)时,模板会:
- 对
https://portal.intruder.io/发起 HTTP GET 请求。 - 仅检查直接响应,忽略其他页面和资源(例如 JavaScript 文件)。
- 尝试识别 GitLab 个人访问令牌的模式。
- 若发现令牌,向 GitLab 公共 API 发起后续请求,以检查该令牌是否处于激活状态。
- 若激活,则生成问题。
当模板定义了许多常见的泄漏路径时,这一流程运行良好。但这正是 基础设施扫描器 的典型特征,它们 不 运行无头浏览器。因此,浏览器会请求的资源——例如 JavaScript 包 https://portal.intruder.io/assets/index-DzChsIZu.js——永远不会被抓取。
“构建过程”盲点
静态应用安全测试(SAST)工具通过分析源代码来发现漏洞,是在密钥进入生产环境前检测它们的主要手段。它们擅长捕获硬编码凭证。
然而,我们发现 SAST 并 未 覆盖全部情况:一些嵌入在 JavaScript 包中的密钥会在静态分析无法检测的空白处漏掉。
DAST 的困境
动态应用安全测试(DAST)工具通常在扫描应用时更为强大。它们可以:
- 爬取整个站点。
- 支持身份验证。
- 检测更广泛的应用层弱点。
理论上,DAST 应该是前端密钥检测的自然选择,因为它能够获取 JavaScript 文件并对其进行密钥扫描。实际上却:
- DAST 成本高,且需要大量配置。
- 通常只针对少数高价值应用使用。
- 许多组织并 未 为整个大型数字资产的每个应用配置 DAST 扫描器。
- 某些 DAST 工具缺少专用命令行密钥扫描器提供的完整正则表达式集合。
产生的缺口
以下因素的组合:
- 传统基础设施扫描器不抓取 JavaScript 资产,
- 对打包代码的 SAST 覆盖有限,
- DAST 部署不频繁或配置不足
导致了一个明显的盲区,密钥可以在此处未被发现。必须通过一种能够高效分析 JavaScript 包且不需要全规模 DAST 成本与复杂度的解决方案来弥补这一缺口。
保持你的机密安全
Shift‑left 控制很重要。SAST、仓库扫描和 IDE 防护栏能够捕获真实问题并防止整类泄露。但正如本研究所示,它们并未覆盖机密进入生产的所有路径。
在构建和部署期间引入的机密可以绕过这些防护措施,最终出现在前端代码中——在 shift‑left 控制已经运行之后很久。这一问题将随着自动化和 AI 生成代码的普及而加剧。
这就是为什么需要对单页应用(SPA)进行爬虫扫描,以在机密进入生产之前捕获它们。我们已在 Intruder 中构建了自动化的 SPA 机密检测,帮助团队真正捕获这些泄露。
作者
Ben Marr – Intruder 安全工程师
Ben 是 Intruder 的安全工程师,负责自动化进攻性安全扫描并进行安全研究。他的背景包括 OSWE 认证的渗透测试和 PHP 软件工程。
由 Intruder 赞助并撰写。