0x00 漏洞描述

Source Map(源码映射)是前端开发中使用的一种调试文件,主要用于将经过压缩、合并或编译的代码映射回原始源代码,方便开发人员定位问题。

在生产环境中,如果 Source Map 文件未进行访问限制,可能导致外部人员直接获取前端源码。

常见文件形式:

main.js
main.js.map

app.js
app.js.map

如果映射文件包含完整的原始源码,可能造成以下信息泄露:

  • 前端源码泄露:暴露业务逻辑、模块结构及代码实现。

  • 接口信息泄露:暴露 API 地址、请求参数及接口结构。

  • 内部路径泄露:暴露项目目录、模块名称及文件路径。

  • 敏感配置泄露:可能暴露误写入前端代码的密钥、内部地址等信息。

需要注意:Source Map 文件公开不一定构成漏洞,实际风险取决于文件包含的内容。

0x01 漏洞原理

前端项目通常会通过 Webpack、Vite 等构建工具,对 JavaScript、TypeScript 等文件进行编译和压缩。

Source Map 用于建立生成代码与原始源码之间的映射关系。

例如,JavaScript 文件末尾可能存在:

//# sourceMappingURL=main.js.map

该注释用于指定对应的 Source Map 文件。

Source Map 通常采用 JSON 格式,其中几个重要字段如下:

字段

作用

version

Source Map 版本

file

对应的生成文件

sources

原始源码文件路径

mappings

源码与生成代码的位置映射

sourcesContent

原始源码内容(可选)

重点关注 sourcesContent: 如果该字段包含源码内容,就可能直接暴露前端原始代码。

0x02 漏洞产生原因

常见原因主要有以下几种:

  1. 生产环境开启 Source Map:构建时生成映射文件,并随前端资源一起发布。

  2. 发布文件未清理:部署时直接上传整个构建目录,导致 .map 文件被一并公开。

  3. 部署流程配置不当:CI/CD 未过滤不需要公开的调试文件。

本质上是生产环境未合理管理前端调试文件。

0x03 漏洞复现

在自有项目或授权测试环境中进行验证。

1. 检查 JavaScript 文件

查看前端 JS 文件末尾是否存在:

//# sourceMappingURL=main.js.map

2. 检查对应映射文件

在本地测试环境中访问:

http://localhost:5173/assets/main.js.map

如果能够正常返回 JSON 内容,继续检查文件中的 sources 和 sourcesContent 字段。

3. 判断泄露情况

检查结果

风险判断

.map 文件无法访问

未发现公开访问问题

文件可访问,但不包含源码

可能暴露文件路径等信息

包含 sourcesContent

可能存在前端源码泄露

源码包含敏感配置或有效凭据

需要进一步评估并及时处理

4. 浏览器验证

打开浏览器开发者工具(F12),进入 Sources 面板,检查是否能够查看映射后的原始源码。

开发者工具
↓
Sources 面板
↓
查看映射文件
↓
检查原始源码是否暴露

0x04 修复建议

1. 关闭生产环境 Source Map

vite

export default {
  build: {
    sourcemap: false
  }
}

Webpack:

module.exports = {
  devtool: false
}

2. 清理公开目录

生产环境发布前,删除不需要公开的 .map 文件,避免调试文件随构建产物一起部署。

3. 限制文件访问

如果业务需要保留 Source Map,应将其存储在受控环境中,或通过 Web 服务器限制外部访问。

4. 处理已泄露信息

如果源码中存在真实密钥或敏感凭据,应及时轮换或吊销,并排查相关访问日志。

0x05 总结

Source Map 本身不是漏洞,生产环境不合理地公开源码映射文件才是问题。

当 .map 文件包含 sourcesContent 时,可能直接暴露前端源码,进一步泄露接口信息、业务逻辑和敏感配置。

因此,建议生产环境默认关闭不必要的 Source Map,发布前检查构建产物,避免调试文件被公开访问。

0x06 About 作者

仅用于技术学习和授权环境下的安全测试。