dinosn/leaklens
GitHub: dinosn/leaklens
LeakLens 是一款具备 Web 感知能力的密钥扫描器,专注于在代码、Git 历史及现代 Web 应用的 JavaScript 资产中发现泄露的敏感信息。
Stars: 45 | Forks: 4
# LeakLens
LeakLens 是一款具备 Web 感知能力的密钥扫描器,适用于源代码、Git 提交历史、本地文件、直接 URL 以及现代重度依赖 JavaScript 的 Web 应用程序。
该项目的想法源于最初的 [Praetorian Titus](https://github.com/praetorian-inc/titus) 代码库。LeakLens 保留了高性能的密钥扫描引擎和规则谱系,随后将这一基础扩展为围绕爬取、JavaScript 发现、source map 恢复、JS 情报产物以及 AI 辅助审查的 Web 应用工作流。
LeakLens 的爬取功能基于 [ProjectDiscovery Katana](https://github.com/projectdiscovery/katana),并在其上叠加了 LeakLens 特有的发现与修复逻辑。爬虫现在通过直接的 HTML 资产提取、JavaScript bundle 扩展、懒加载分块发现、同源 URL 修复、转义路径标准化以及下载资产镜像(在扫描前)来增强 Katana 的输出。JS 情报仍然是一个独立的信息层;LeakLens 的密钥发现依然来自于扫描器规则引擎。
请仅在您获得授权测试的代码库、存储库和网站上使用 LeakLens。
## 当前重点
- 针对文件、目录、Git 存储库、直接 URL 和爬取网站的 CLI 扫描。
- 带有可选实时验证的密钥检测。
- 基于 Katana 的 Web 爬取,具备 LeakLens 特有的 JS/JSON/source map 发现和 URL 修复功能。
- 针对被爬虫解析得过深的同源 JS 路径进行 URL 修复。
- 针对端点、source map、云 URL、子域名、依赖项的 JS 情报,以及可选的依赖混淆检查。
- 作为 Go 库使用,以便将扫描器嵌入其他内部工具。
## 安装
LeakLens 支持两种安装途径:
- 通过 `go install` 从源码安装。
- 使用可选的 Vectorscan/Hyperscan 加速进行本地构建。
### Go 安装
`go install` 直接从 GitHub 存储库安装,并将二进制文件写入 `$(go env GOPATH)/bin`。
请确保该目录在您的 `PATH` 中。
使用 `@main` 安装最新经过测试的 LeakLens 分支。
纯 Go 安装:
```
go install github.com/dinosn/leaklens/cmd/leaklens@main
```
使用 Vectorscan/Hyperscan 加速安装:
```
CGO_ENABLED=1 go install -tags vectorscan github.com/dinosn/leaklens/cmd/leaklens@main
```
### 本地构建
构建可移植的纯 Go 二进制文件:
```
make build-pure
```
二进制文件将写入:
```
dist/leaklens
```
使用 Vectorscan/Hyperscan 加速构建:
```
make build
```
默认的 `make build` 目标使用 CGO 和 `vectorscan` 构建标签。它要求具有兼容的本地库和 `pkg-config`。
安装本地依赖:
```
# macOS
brew install vectorscan pkg-config
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y pkg-config libhyperscan-dev
# Fedora/RHEL
sudo dnf install -y pkgconf-pkg-config hyperscan-devel
```
在 macOS 上,Homebrew 将 Vectorscan 安装在当前活动的 Homebrew 前缀下。如果 `pkg-config` 找不到 `libhs`,请导出包配置路径:
```
export PKG_CONFIG_PATH="$(brew --prefix vectorscan)/lib/pkgconfig:$PKG_CONFIG_PATH"
```
为 Go 和本地库使用匹配的架构。例如,x86_64 的 Go 工具链无法链接 arm64 的 Homebrew Vectorscan 库。如果架构不匹配,请安装匹配的 Go 工具链/本地库组合,或者使用 `make build-pure`。
在 Apple Silicon 上,如果出现此链接器错误,表示 Go 正以 `amd64` 运行,而 Homebrew Vectorscan 是 `arm64`:
```
ld: warning: ignoring file '/opt/homebrew/.../libhs.dylib': found architecture 'arm64', required architecture 'x86_64'
Undefined symbols for architecture x86_64: "_hs_*"
```
首选修复方案:使用 arm64 的 Go 工具链配合 arm64 的 Homebrew 库:
```
brew install go vectorscan pkg-config
export PATH="/opt/homebrew/bin:$PATH"
go env -u GOARCH
go env -u GOOS
export PKG_CONFIG_PATH="$(brew --prefix vectorscan)/lib/pkgconfig:$PKG_CONFIG_PATH"
CGO_ENABLED=1 go install -tags vectorscan github.com/dinosn/leaklens/cmd/leaklens@main
```
无本地加速的回退方案:
```
CGO_ENABLED=0 go install github.com/dinosn/leaklens/cmd/leaklens@main
```
## 版本与更新
检查已安装的构建版本:
```
leaklens version
```
检查 GitHub 上最新的 `main` 分支构建:
```
leaklens update
```
LeakLens 还会在命令启动时执行简短的 `main` 分支检查。自动通知会写入 stderr,因此扫描输出仍保持可解析状态。这与文档中记载的 `go install ...@main` 安装路径相匹配,并报告已安装的二进制文件是否基于最新的 `main` commit 构建。如果当前构建无法映射到某个 commit,常规扫描将保持静默,而 `leaklens update` 会明确报告该状态。
对于脚本化运行,禁用自动检查:
```
leaklens --no-update-check scan path/to/source
LEAKLENS_NO_UPDATE_CHECK=true leaklens scan path/to/source
```
## 快速开始
```
# 扫描文件
leaklens scan path/to/file.txt
# 扫描目录
leaklens scan path/to/source
# 扫描 Git history
leaklens scan --git path/to/repo
# 扫描直接 URL
leaklens scan https://example.com/static/app.js
# 从文件扫描 URL
leaklens scan --url-file urls.txt
# 爬取网站并扫描发现的 JS/JSON/source-map 文件
leaklens scan --crawl https://example.com
# 使用 JS intelligence 进行爬取
leaklens scan --crawl --js-intel https://example.com
# 通过 provider APIs 验证检测到的 secrets
leaklens scan path/to/source --validate
```
默认情况下,扫描结果以 human 格式打印并保存在内存中。当您需要数据存储以供后续报告使用时,请使用 `--output leaklens.ds` 或其他路径。
## 网站测试
默认的 Web 应用爬取配置:
```
leaklens scan --crawl https://example.com
```
此默认配置将启用:
- 不启动 Chrome 的标准爬取
- `--crawl-js-crawl=true`
- `--crawl-depth=3`
- `--crawl-concurrency=2`
- `--crawl-rate-limit=3`
- `--crawl-timeout=2m`
- `--crawl-extensions=js,json,map`
- `--crawl-scope=rdn`
要在扫描时将爬取的文件保存为可读的网站风格目录树:
```
leaklens scan --crawl https://example.com/app/ --download-dir downloaded-site
```
下载的 URL 内容保存在 `downloaded-site//` 下。查询字符串会保留在文件名中,因此 `app.js` 和 `app.js?v=63` 会分开存储。
仅在标准爬虫遗漏了浏览器渲染的资产时,才使用无头爬取:
```
leaklens scan --crawl --crawl-headless https://example.com
```
以获取更丰富的 Web 应用分类结果:
```
leaklens scan --crawl --js-intel https://example.com
```
对于 JavaScript 发现的相对路径被解析到错误目录下的应用程序,请显式设置应用程序根目录:
```
leaklens scan --crawl --js-intel \
--crawl-base-url https://example.com/app/ \
https://example.com/app/static/js/main.js
```
LeakLens 将爬虫发现的 URL 作为首选候选对象,然后尝试同源修复的候选对象。当回退成功时,human 格式的输出会显示 `repaired:` 行。
## JS 情报
通过以下方式启用 JS 情报层:
```
leaklens scan --crawl --js-intel https://example.com
```
此层报告辅助性的产物。它不会替换正常的 LeakLens 密钥规则。
| 产物 | 行为 |
| --- | --- |
| 端点 | 从 `fetch`、`importScripts`、HTTP 方法调用和 URL/路径属性中提取类似 URL 的值。 |
| 云 URL | 查找常见的 S3、GCS、Azure Blob 和 DigitalOcean Spaces URL。 |
| 子域名 | 从 JS/JSON 内容中提取类似域名的 host。 |
| 依赖项 | 从 `package.json`、lockfile 包路径、import、require 和 `node_modules` 引用中提取包名。 |
| Source map | 爬取模式会发现外部的 `.map` 文件,并为发现的 JavaScript 资产探测同级的 `.js.map` 文件。独立的 map 文件和内嵌的 `sourcesContent` 条目会使用正常的 LeakLens 规则重新扫描。启用后,JS 情报也会解码内联的 source map。 |
| 通用密钥启发式检测 | 可选的低置信度 JS 赋值启发式检测。值在 JS 情报输出中会被掩码处理。 |
| 依赖混淆候选对象 | 可选的主动 npm registry 检查。报告从配置的 registry 中返回 `404` 的包。 |
实用示例:
```
# 包含屏蔽的低置信度通用 JS assignments
leaklens scan --crawl --js-intel --js-intel-generic-secrets https://example.com
# 主动检查发现的 npm packages 是否在 public-registry 中缺失
leaklens scan --crawl --js-intel --js-intel-npm-check https://example.com
# 禁用 inline source-map 解析,同时保留其他 JS intelligence
leaklens scan --crawl --js-intel --js-intel-source-maps=false https://example.com
```
对于 `json` 和 `sarif` 扫描输出,源自 source map 的密钥匹配会通过正常的结果路径包含在内。信息性的 JS 情报目前仅在 human 输出中打印,因此机器可读的密钥输出保持稳定。
## 扫描命令
```
leaklens scan [target] [flags]
```
目标可以是:
- 本地文件或目录。
- 本地 Git 存储库。
- 直接的 HTTP(S) URL。
- GitHub 存储库引用,例如 `github.com/org/repo`。
- GitLab 项目引用,例如 `gitlab.com/group/project`。
### 核心标志
| 标志 | 默认值 | 描述 |
| --- | --- | --- |
| `--output` | `:memory:` | 输出数据存储路径。当您需要持久化数据存储时,请使用诸如 `leaklens.ds` 的路径。 |
| `--format` | `human` | 输出格式:`human`、`json` 或 `sarif`。 |
| `--rules` | | 自定义规则文件或目录的路径。 |
| `--rules-include` | | 包含匹配正则表达式模式的规则,以逗号分隔。 |
| `--rules-exclude` | | 排除匹配正则表达式模式的规则,以逗号分隔。 |
| `--git` | `false` | 将目标视为 Git 存储库并枚举提交历史。 |
| `--max-file-size` | `10485760` | 要扫描的最大文件大小(以字节为单位)。 |
| `--include-hidden` | `false` | 包含隐藏文件和目录。 |
| `--context-lines` | `3` | 匹配项前后的上下文行数。使用 `0` 禁用。 |
| `--incremental` | `false` | 跳过已扫描的 blob。 |
| `--validate` | `false` | 针对 provider API 验证检测到的密钥。 |
| `--validate-workers` | `4` | 并发验证 worker 数。 |
| `--workers` | CPU 核心数 | 并行扫描 worker 数。 |
| `--store-blobs` | `false` | 将文件内容存储在数据存储 blob 目录下。 |
| `--download-dir` | | 将下载的 URL 内容写入保留网站路径结构的目录中。 |
| `--url-file` | | 包含要扫描的 URL 的文件,每行一个。使用 `-` 表示 stdin。 |
| `--sqlite-row-limit` | `1000` | 启用提取功能后每个 SQLite 表的最大行数。使用 `0` 表示无限制。 |
### 提取标志
| 标志 | 默认值 | 描述 |
| --- | --- | --- |
| `--extract` | | 从二进制文件中提取文本。支持的值包括 `xlsx`、`docx`、`pdf`、`zip` 或 `all`。 |
| `--extract-max-size` | `10MB` | 每个提取文件的最大解压大小。 |
| `--extract-max-total` | `100MB` | 从单个归档中提取的最大总字节数。 |
| `--extract-max-depth` | `5` | 最大嵌套归档深度。 |
### 爬取标志
| 标志 | 默认值 | 描述 |
| --- | --- | --- |
| `--crawl` | `false` | 启用爬取模式。 |
| `--crawl-depth` | `3` | 最大爬取深度。 |
| `--crawl-concurrency` | `2` | 并发爬取 worker 数。 |
| `--crawl-rate-limit` | `3` | 每秒最大爬取请求数。 |
| `--crawl-host-rate-limit` | `0` | 每个 host 每秒的最大请求数。`0` 使用 `--crawl-rate-limit`。 |
| `--crawl-timeout` | `2m` | 最大爬取持续时间。 |
| `--crawl-headless` | `false` | 对重度依赖 JS 的网站使用无头浏览器。 |
| `--crawl-js-crawl` | `true` | 解析 JavaScript 文件以发现额外的端点。 |
| `--crawl-extensions` | `js,json,map` | 要收集和扫描的文件扩展名。 |
| `--crawl-scope` | `rdn` | 范围:`rdn`、`dn` 或 `fqdn`。 |
| `--crawl-base-url` | | 用于修复 JS 发现的相对路径的应用程序基础 URL。 |
| `--crawl-max-domain-pages` | `0` | 每个域名要爬取的最大页面数。`0` 表示无限制。 |
| `--crawl-chrome-data-dir` | | 用于保留会话的 Chrome user-data-dir。 |
| `--crawl-chrome-ws-url` | | 用于连接到现有浏览器的 Chrome DevTools websocket URL。 |
| `--crawl-system-chrome-path` | | Chrome 或 Chromium 的二进制文件路径。 |
| `--crawl-use-installed-chrome` | `false` | 使用已安装的 Chrome,而不是由 Katana 管理的 Chrome。 |
| `--crawl-no-incognito` | `false` | 在非隐身上下文中运行无头爬取。 |
| `--crawl-no-sandbox` | `false` | 使用 `--no-sandbox` 运行无头 Chrome。当 LeakLens 以 root 用户身份启动无头 Chrome 时会自动启用。 |
| `--crawl-automatic-form-fill` | `false` | 启用 Katana 的自动表单填充和提交功能。 |
| `--crawl-auth` | | 用于 Katana 自动登录的 `username:password`。 |
### JS 情报标志
| 标志 | 默认值 | 描述 |
| --- | --- | --- |
| `--js-intel` | `false` | 提取 JS 情报产物并重新扫描内联 source map 源。 |
| `--js-intel-source-maps` | `true` | 当启用 `---intel` 时,解析内联 source map 并扫描内嵌的源码。 |
| `--js-intel-generic-secrets` | `false` | 启用低置信度的 JS 风格通用密钥启发式检测。 |
| `--js-intel-npm-check` | `false` | 主动检查发现的 npm 包在公共 registry 中是否存在缺失。 |
### AI 辅助 JS 审查
LeakLens 可以在正常的确定性扫描之后运行可选的 AI 辅助审查。这旨在用于针对 JavaScript、TypeScript、JSON 和 source map 产物的授权验证和修复工作。扫描器规则仍然首先运行,并且依然是密钥发现的确定性来源。AI 层是一个第二阶段的分析师,负责审查收集到的文件、解释应用程序行为、提出额外的密钥候选对象,并编写面向所有者的测试计划。
AI 审查适用于爬取的网站、直接 URL 扫描、URL 文件扫描、本地文件、本地目录、本地 Git 存储库以及克隆的 GitHub/GitLab 目标。对于 URL 和爬取扫描,`--ai` 会自动启用下载文件存储。如果未提供 `--download-dir`,LeakLens 将在 AI 报告目录下创建一个。
Provider 配置仅通过环境变量进行,以确保 API 密钥不会在命令行中暴露:
```
export LEAKLENS_AI_PROVIDER=openai # openai or anthropic
export LEAKLENS_AI_MODEL=your-model-name
export LEAKLENS_OPENAI_API_KEY=...
export LEAKLENS_ANTHROPIC_API_KEY=...
export LEAKLENS_AI_TIMEOUT=5m # optional per provider request timeout
export LEAKLENS_AI_RETRIES=3 # optional transient provider retry count
export LEAKLENS_AI_CHUNK_CHARS=60000 # optional max redacted characters per AI chunk
export LEAKLENS_AI_CONCURRENCY=3 # optional parallel AI chunk reviews
```
示例:
```
leaklens scan --crawl --ai https://example.com
leaklens scan --ai --ai-mode secrets path/to/downloaded-site
leaklens scan --ai --ai-mode appsec --ai-report-dir reports/example path/to/app
leaklens scan --crawl --ai --ai-cloud-redaction expanded https://example.com
```
AI 标志:
| 标志 | 默认值 | 描述 |
| --- | --- | --- |
| `--ai` | `false` | 在扫描后运行 AI 辅助的 JS/JSON/source map 分析。 |
| `--ai-mode` | `all` | AI 分析模式:`secrets`、`appsec` 或 `all`。 |
| `--ai-report-dir` | | AI 产物的目录。默认值:`leaklens-ai/-`。 |
| `--ai-cloud-redaction` | `standard` | 云脱敏模式:`standard` 或 `expanded`。目标 URL 和 host 在两种模式下均会被脱敏。 |
| `--ai-progress` | `text` | AI 进度输出:`text` 或 `quiet`。始终会写入一个 JSON-lines 进度产物。 |
| `--ai-resume` | `false` | 从相同的 `--ai-report-dir` 重用已完成的 AI 响应检查点。 |
AI 产物:
| 文件 | 描述 |
| --- | --- |
| `leaklens-ai-report.md` | 包含范围、覆盖率、AI 发现、curl 风格验证思路、位置和修复说明的 Markdown 报告。 |
| `corpus-manifest.json` | 每个被选中进行 AI 审查的文件的本地清单,包含其经过云脱敏的路径、大小、行数和分块数。 |
| `ai-progress.ndjson` | 用于长时间运行 AI 分析的机器可读进度事件。 |
| `ai-redaction-map.json` | 仅限本地的映射,将脱敏后的云占位符映射回真实的来源、host 和文件路径。请勿将此文件上传给第三方。 |
| `ai-chunks/` | 用于已完成的概述和文件分块审查的带有检查点机制的 provider 响应。这些会被 `--ai-resume` 重用。 |
AI provider 弹性机制:
- 诸如请求超时、HTTP 408、HTTP 429 和 HTTP 5xx 响应之类的瞬时 provider 失败,会根据 `LEAKLENS_AI_RETRIES` 进行重试。
- 在构建本地语料库之后,失败的概述或文件分块不再会导致整个扫描中止。LeakLens 会写入一份部分 Markdown 报告,将失败的阶段记录在 `AI Failures` 中,并将成功的响应保留在 `ai-chunks/` 中。
- 要继续长时间的运行,请使用相同的 `--ai-report-dir --ai-resume` 重新运行相同的扫描。已完成的检查点会被重用,只有缺失的分块才会被发送给 provider。
- 文件分块会根据 `LEAKLENS_AI_CONCURRENCY` 并行审查。如果 provider 对运行进行了速率限制,请将其设置为 `1` 以进行串行 provider 调用或降低该值。
- 使用 `--ai-progress=text` 时,来自已完成的概述和分块响应的高价值 AI 观察结果将在完整报告仍在构建期间作为 `AI insight:` 行立即打印出来。
- 对于响应缓慢的 provider,请使用 `LEAKLENS_AI_TIMEOUT`;对于在大分块时会超时的模型或网络,请使用 `LEAKLENS_AI_CHUNK_CHARS` 来减小请求大小。默认的分块大小为 `60000` 个字符,与最初的 AI 分块行为保持一致。
云脱敏行为:
- 目标 URL 和 host 在提交给 provider 之前总是会被脱敏。这无法通过标志绕过。
- URL 路径会被保留,以便 AI 仍然可以对端点进行推理。例如,`https://www.example.com/api/admin/config` 将作为 `TARGET_ORIGIN_1/api/admin/config` 发送。
- 第三方来源也会被脱敏,例如 `https://cdn.vendor.com/lib.js` 将变为 `EXTERNAL_ORIGIN_1/lib.js`。
- 本地绝对路径在提交给 provider 之前会被替换为文件占位符。
`--ai-cloud-redaction standard` 会在提交给 provider 之前,对明显的凭证、Authorization header、cookie 值、携带密钥的查询值以及通用的商熵字符串进行脱敏。它保留了变量名、函数名、端点路径、HTTP 方法和结构上下文。
`--ai-cloud-redaction expanded` 依然会对目标来源、host、本地文件系统路径、Authorization header、cookie 值和明显的凭证赋值进行脱敏,但保留了 URL 端点路径以及更多非 URL 的 JavaScript 上下文。例如,`https://www.example.com/api/files/upload` 会作为 `TARGET_ORIGIN_1/api/files/upload` 发送和报告,而不是作为通用的已脱敏上传端点。当需要对 config 和字符串字面量进行更深入的 AI 推理时,请使用此模式。它不会禁用对目标来源或 host 的脱敏。
LeakLens 不会执行 AI 生成的 curl 命令。报告仅包含验证计划。后续可能会在一个单独的显式选项后添加主动测试功能。
## GitHub 和 GitLab
直接的存储库引用通过 `scan` 工作:
```
leaklens scan github.com/org/repo
leaklens scan gitlab.com/group/project
```
对于组织、用户、群组和基于 token 的工作流,请使用专用命令:
```
# GitHub repository
leaklens github org/repo
# GitHub organization
leaklens github --org my-org --token "$GITHUB_TOKEN"
# GitLab project
leaklens gitlab group/project
# GitLab group
leaklens gitlab --group my-group --token "$GITLAB_TOKEN"
```
重要标志:
| 标志 | GitHub | GitLab | 描述 |
| --- | --- | --- | --- |
| `--token` | 是 | 是 | API token。对于公开项目是可选的。 |
| `--git` | 是 | 是 | 扫描完整的 Git 提交历史。 |
| `--no-clone` | 是 | 是 | 通过 API 获取文件而不是克隆。需要 token 且不会扫描 Git 提交历史。 |
| `--org` | 是 | 否 | 扫描 GitHub 组织中的所有存储库。 |
| `--user` | 是 | 是 | 扫描某个用户的存储库/项目。 |
| `--group` | 否 | 是 | 扫描一个群组中的所有 GitLab 项目。 |
| `--url` | 否 | 是 | GitLab 的基础 URL。默认值为 `gitlab.com`。 |
| `--output` | 是 | 是 | 输出数据库路径。默认值为 `leaklens.db`。 |
| `--format` | 是 | 是 | 输出格式:`human` 或 `json`。 |
## 报告和探索
除非将 `--output` 设置为数据存储路径,否则扫描结果将保留在内存中。
```
# 来自 leaklens.ds 的人类可读报告
leaklens report
# JSON 报告
leaklens report --format json
# SARIF 报告
leaklens report --format sarif
# 来自特定 datastore 的报告
leaklens report --datastore path/to/leaklens.ds
# TUI 探索
leaklens explore --datastore path/to/leaklens.ds
```
## 规则
```
# 列出内置 rules
leaklens rules list
# 仅使用匹配的 rules 进行扫描
leaklens scan path/to/source --rules-include "aws,gcp"
# 排除嘈杂的 rules
leaklens scan path/to/source --rules-exclude "generic"
# 使用自定义 rules
leaklens scan path/to/source --rules path/to/rules.yaml
```
## Go 库
```
go get github.com/dinosn/leaklens
```
```
package main
import (
"fmt"
"log"
"github.com/dinosn/leaklens"
)
func main() {
scanner, err := leaklens.NewScanner()
if err != nil {
log.Fatal(err)
}
defer scanner.Close()
matches, err := scanner.ScanString(`aws_access_key_id = AKIAIOSFODNN7EXAMPLE`)
if err != nil {
log.Fatal(err)
}
for _, match := range matches {
fmt.Printf("%s at offset %d\n", match.RuleName, match.Location.Offset.Start)
}
}
```
## 输出格式
LeakLens 支持:
- `human`:按文件分组的输出并带有摘要。
- `json`:机器可读的匹配结果。
- `sarif`:工具名称为 `leaklens` 的 SARIF 2.1.0 输出。
示例:
```
leaklens scan path/to/source --format json
leaklens scan path/to/source --format sarif
```
## 验证
验证默认处于禁用状态。启用后,LeakLens 会针对支持的密钥类型尝试特定于 provider 的检查:
```
leaklens scan path/to/source --validate --validate-workers 8
```
验证可能会向 provider API 发出出站请求。仅在此行为适用于当前业务场景时才使用它。
## 构建和测试
```
# Pure-Go 便携二进制文件
make build-pure
# 安装兼容的 Vectorscan/Hyperscan 时加速构建
make build
# 静态二进制文件
make build-static
# Tests
go test ./...
```
如果在受限环境中 macOS 阻止了默认的 Go 缓存,请使用显式缓存:
```
GOCACHE=/private/tmp/go-build-leaklens \
GOMODCACHE=/private/tmp/go-mod-leaklens \
go test ./...
```
## 鸣谢
LeakLens 基于以下项目并在此致谢:
- [Praetorian Titus](https://github.com/praetorian-inc/titus):最初的扫描器基础和 Go 实现谱系。
- [NoseyParker](https://github.com/praetorian-inc/noseyparker) 和 [Kingfisher](https://github.com/mongodb/kingfisher):检测规则谱系。
- [ProjectDiscovery Katana](https://github.com/projectdiscovery/katana):`--crawl` 使用的爬取引擎。
- [PortSwigger js-miner](https://github.com/PortSwigger/js-miner):JS 情报概念的灵感来源,例如端点、依赖项、source map 和 JavaScript 产物发现。
LeakLens 在此存储库中独立维护。
## 许可证
本项目遵循此存储库的许可证。在重新分发衍生作品时,请保留上游的署名。
标签:EVTX分析, Go语言, StruQ, Web安全, 实时处理, 敏感信息扫描, 日志审计, 程序破解, 蓝队分析