kenjohnscreates/safe-repo-review
GitHub: kenjohnscreates/safe-repo-review
一套四阶段沙盒化代码审查工作流,帮助开发者在隔离环境中安全地审查不受信任的 GitHub 仓库,防范恶意代码执行和凭据窃取。
Stars: 0 | Forks: 0
# 安全仓库审查
一个结构化、沙盒化的流程,用于在运行未知代码之前对其进行审查。专为技术评估、开源审计和不受信任的来源而设计。
## 快速开始
```
# 阶段 1:Triage(不 clone,无风险)
./scripts/triage.sh https://github.com/user/repo
# 阶段 2 和 3:Sandbox + scan(隔离环境)
./scripts/sandbox.sh https://github.com/user/repo
# 在 container 内部:
scan
```
请参阅 [QUICKSTART.md](QUICKSTART.md) 获取详细示例。
## 四阶段工作流
### 阶段 1:分诊(仅限浏览器侦察)
**耗时:** 5–10 分钟 | **风险:** 无 | **位置:** 仅限 GitHub API
通过 API 拉取关键文件(package.json、.env、Dockerfile、常见入口点)。在不克隆或信任任何代码的情况下筛选危险信号。
**决策点:**
- **停止:** 明显的恶意软件模式或内置凭据?归档调查结果并拒绝
- **进入沙盒:** 可疑但貌似合理。转入静态分析
- **放行:** 未检测到异常。仍需放入沙盒进行动态分析,但风险较低
### 阶段 2:静态分析(沙盒化,代码从不运行)
**耗时:** 10–15 分钟 | **风险:** 极低 | **位置:** 带 `--network none` 的 Docker container
克隆到没有网络访问权限的隔离 container 中。运行密钥扫描器、linter 和模式匹配,而不执行代码。
**工具:** `gitleaks`、`trufflehog`、`grep` + regex(恶意软件模式)、`npm audit`、`bandit`
**决策点:**
- **停止:** 泄露了真实凭据、明显的 RCE 向量,或拼写错误的依赖项?拒绝
- **进入动态分析:** 存在小问题或误报。值得运行以查看其实际行为
- **放行:** 未发现问题。在监控下运行是安全的
### 阶段 3:动态分析(执行代码,受监控)
**耗时:** 5–10 分钟 | **风险:** 低(网络仍然被阻止) | **位置:** 带 `--network none` 的 Docker container
在 container 内启动应用程序。观察以下内容:
- 意外的文件访问
- 密钥被写入日志
- 关于阻止网络调用的错误(揭示数据窃取尝试)
- 控制台输出和行为
```
node server.js
npm start
python main.py
```
如果代码尝试访问外部 API,它会静默失败或记录错误。您可以确切地看到它试图联系什么。
### 阶段 4:报告和归档
**耗时:** 5 分钟 | **位置:** `reviews/YYYY-MM-DD-repo-name/findings.md`(仅限本地;`reviews/` 已被 gitignore)
将调查结果记录在模板中。在本地将调查结果保密。
## 文件结构
```
safe-repo-review/
├── README.md # This file
├── QUICKSTART.md # Walked-through example
├── CHECKLIST.md # Print-ready task list
├── RED-FLAGS.md # Pattern reference guide
├── REPORT-TEMPLATE.md # Findings document template
└── scripts/
├── triage.sh # Phase 1: GitHub API recon
├── sandbox.sh # Phase 2/3: Docker setup + shell
├── scan.sh # Phase 3: Static analysis runner
└── Dockerfile.sandbox # Container definition
```
## 环境要求
- Docker Desktop(Mac、Linux、Windows),已安装并运行
- 终端 / Bash(Mac 或 Linux 原生;Windows 通过 WSL2)
- `curl`、`jq`、`git`(Mac 和 Linux 标准配置)
```
docker --version
docker run hello-world
curl --version
jq --version
```
## 危险信号速查表
完整列表请参阅 [RED-FLAGS.md](RED-FLAGS.md)。快速摘要:
| 模式 | 风险 | 示例 |
|---------|------|---------|
| `"prepare": "node server"` | `npm install` 时自动运行 | 恶意软件在您检查代码之前执行 |
| 代码中的 Base64 或 hex 字符串 | 混淆 | 解码为 API 调用或数据窃取 URL |
| 提交了带有真实密钥的 `.env` | 凭据泄露 | AWS / Stripe / API 密钥被提交到 git |
| 生产代码中的 `eval()`、`exec()` | RCE 向量 | 代码可以执行任意命令 |
| 拼写错误的依赖项(`lodash` → `lodash3`) | 供应链攻击 | 拉取恶意包 |
| 脚本中的 `curl`、`wget` | 数据窃取 | 下载并运行任意代码 |
## 安全说明
- **`--network none`** 阻止所有出站流量。即使是恶意代码也无法回传数据
- **container 是临时的。** 退出时一切都会被删除。没有持久的感染风险
- **container 内的密钥无法逃脱。** 除非您明确将其复制出去,否则它们对宿主 OS 是不可见的
- **这不是用于在生产环境中运行不受信任代码的沙盒。** 这是一个用于分析的临时隔离工具
## 起源
我构建这个工具是因为,之前有一个虚假的招聘人员给我发送了一个 GitHub 仓库,用于“编程评估”,结果证明这是一个窃取凭据的 payload。其模式与 2024 年至 2025 年记录的 Contagious Interview 活动相匹配,该活动被归因于针对 Web3 和加密货币候选人的 DPRK 关联威胁行为者。
该仓库有一个 `prepare` 生命周期脚本,在 `npm install` 时自动运行 `node server`,并将完整的 `process.env`(每个环境变量,包括 AWS / OpenAI / GitHub token)POST 到一个经过 base64 混淆的 Vercel endpoint。如果我在 Mac 上运行了 `npm install`,攻击者就会收到我 shell 中的每个凭据。
我发现了它,因为我最先构建了这个工作流。分享这个系统,希望能对其他人有所帮助。
如果您现在是 Web3 或加密货币求职者,请假设任何来自未经证实招聘人员的“评估”仓库都是窃取凭据的尝试,直到被证明并非如此。
## 许可证
[MIT](LICENSE)
## 贡献
欢迎提交 Issues、RED-FLAGS 模式补充和工具改进。如果您发现了一个活动并希望添加一个经过脱敏处理的参考(公共 README 中不要有活跃的 IOCs),请提交 PR。
标签:代码审查, 应用安全, 恶意代码分析, 沙箱环境, 请求拦截, 配置文件