Karmona/Fenceline
GitHub: Karmona/Fenceline
通过 Docker 沙箱隔离包安装过程并多维度验证其行为,从执行层面阻断恶意依赖对开发机的威胁。
Stars: 0 | Forks: 0
# Fenceline
[](https://github.com/Karmona/Fenceline/actions/workflows/ci.yml)
[](LICENSE)
[](https://python.org)
[](CHANGELOG.md)
**专为开发者机器设计的依赖防火墙。**
在 Docker 沙箱中运行包的安装过程,监控网络连接、DNS 查询、HTTP 行为和文件系统变更,只有在一切正常的情况下,才会将生成的产物提升到您的主机。不受信任的代码永远不会在您的机器上运行。
## 快速开始
```
pip install fenceline # or: pip install -e . from source
# 激活 dependency firewall
fenceline wrap --enable
npm install express # automatically sandboxed via Docker
# 或者运行一次性沙箱安装
fenceline install --sandbox npm install express
# 尝试示例项目
cd examples/safe-project && ./test.sh
```
需要 Docker。执行 `wrap --enable` 后,所有的 npm/yarn/pnpm/pip install 命令都会自动路由通过沙箱执行。非安装命令(如 `npm test`、`npm run` 等)将原样透传,不受影响。
```
fenceline wrap --status # see what's wrapped
fenceline wrap --disable # restore originals
```
## 问题背景
运行 `npm install` 会在您的机器上执行不受信任的代码。仅在 2025 到 2026 年间,被植入恶意代码的 axios、chalk、debug 和 LiteLLM 等包就攻陷了成千上万台开发者的机器——这一切都发生在安装或导入阶段。其他工具最多只能告诉你一个包*可能*存在风险。**而 Fenceline 会强制要求这些包先自证清白。**
## 工作原理
```
fenceline install --sandbox npm install
┌──────────────────────────────────────────────┐
│ Docker Container (--cap-add=NET_ADMIN) │
│ │
│ iptables LOG: capture every TCP SYN + DNS │
│ │
│ Stage 1: npm install │
│ → real-time netstat polling (0.5s) │
│ → iptables post-hoc sweep (zero-miss) │
│ → expected-process check (curl? BLOCKED) │
│ │
│ Filesystem diff: detect dropped binaries │
│ │
│ Stage 2: node -e "require('')" │
│ → catch import-time payloads │
│ │
│ DNS check: unusual resolver activity? │
│ │
│ Suspicious? → KILL. Nothing installed. │
│ Clean? → Copy node_modules to host. │
└──────────────────────────────────────────────┘
```
### 检测层
| 层级 | 拦截目标 | 方式 |
|-------|----------------|-----|
| **网络监控** | C2 信标、向未知服务器的数据渗透 | iptables LOG (每个 TCP SYN) + netstat 轮询 |
| **端口限制** | 到非 443 端口的连接 | 任何端口 != 443 -> CRITICAL |
| **CDN 指纹识别** | 到意外 CDN 的连接 | 根据深度映射的 CIDR 范围检查 IP |
| **进程启发式** | 安装脚本派生出 curl/wget/bash 进程 | 基于工具的预期进程 (例如 npm 安装时为 node/npm) |
| **文件系统差异比对** | 被植入的二进制文件、`.pth` 文件、/etc、/root、/home 中的文件 | 安装前后快照对比 |
| **导入监控** | 在 require()/import 时激活的延迟载荷 | 阶段 2 在容器内运行 require() |
| **DNS 监控** | DNS 隧道、异常解析器活动 | 对 UDP 53 端口执行 iptables LOG |
| **HTTP 行为** | 向意外域名发起 POST/PUT 请求 | 日志代理捕获 CONNECT 目标和 HTTP 方法 (Node.js + Python) |
| **元数据评分** | 新发布的包、维护者变更、缺失来源信息 | Lockfile 差异比对 + 注册表查询 + 风险评分 |
| **能力升级** | 版本间新增了 postinstall/preinstall 脚本 | 版本间的能力差异对比 |
## 为什么选择 Fenceline?
大多数供应链安全工具**分析包并给出风险评分**。Fenceline 采用了不同的方法:**控制执行**。
| 方式 | 工具 | 它们的功能 |
|----------|-------|-------------|
| 漏洞扫描 | Snyk, npm audit, Dependabot | 标记依赖项中已知的 CVE |
| 行为分析 | Socket, GuardDog | 通过信号 (安装脚本、网络调用等) 对包进行评分 |
| 年龄限制 | Aikido SafeChain | 阻止发布时间少于 48 小时的包 |
| **执行控制** | **Fenceline** | **沙箱化安装。验证行为。只有在安全时才提升产物。** |
其他工具只能告诉你某个包有风险。而 Fenceline 能确保有风险的包永远不会在你的机器上执行。
详见 [docs/landscape.md](docs/landscape.md),获取 14 种以上工具的详细对比。
## 抵御真实攻击
理论评估——尚未在真实环境中验证。详见 [exploits/](exploits/) 中的详细分析。
| 攻击事件 | 年份 | 沙箱 |
|--------|------|---------|
| Axios RAT | 2026 | **将会拦截** -- 端口 8000 上的 C2 通信 |
| TeamPCP: LiteLLM | 2026 | **将会拦截** -- 阶段 2 捕获 .pth 载荷 |
| chalk/debug | 2025 | **将会拦截** -- 阶段 2 捕获导入阶段的 C2 通信 |
| Nx/s1ngularity | 2025 | **将会拦截** -- HTTP 代理检测到向意外域名发起的 POST 请求 |
| Ultralytics | 2024 | **将会拦截** -- 端口 8080 上的挖矿池 |
| ua-parser-js | 2021 | **将会拦截** -- postinstall 回传数据 + 意外进程 (curl) |
| event-stream | 2018 | **将会拦截** -- 阶段 2 捕获导入载荷 |
| colors.js | 2022 | **已隔离** -- 无网络活动,但在容器中被隔离 |
| XZ Utils | 2024 | **已隔离** -- 被动后门,已隔离 |
| Codecov | 2021 | 超出范围 -- CI/CD 工具 |
| Polyfill.io | 2024 | 超出范围 -- 客户端 CDN |
8 次被拦截。2 次被隔离。1 次超出范围。
## 无法拦截的内容
- 没有网络活动的攻击(逻辑炸弹、蓄意破坏)
- CI/CD 流水线攻击(请使用 `fenceline audit-actions` 扫描 Actions)
- 仅在复制到主机后且没有网络活动时才激活的代码
- 隐写载荷(如 .WAV 文件等)
- 浏览器端攻击(如打包后的 JavaScript 中的加密劫持)
## 生态支持
| 生态系统 | 沙箱 | 产物拷贝 | 命令包装 | 状态 |
|-----------|---------|---------------|----------|--------|
| **Node.js** (npm, yarn, pnpm) | 完整 | 完整 | 完整 | 生产可用 |
| **Python** (pip) | 完整 | 完整¹ | 完整 | 已支持 |
| **Rust** (cargo) | 仅监控 | 无 | 无 | 实验性 |
| **Ruby** (gem) | 仅监控 | 无 | 无 | 实验性 |
¹ 将包目录、`.dist-info` 元数据以及控制台脚本拷贝至主机。
## 命令
| 命令 | 功能说明 |
|---------|-------------|
| `fenceline wrap --enable` | 为 npm/yarn/pnpm/pip 激活依赖防火墙 |
| `fenceline install --sandbox ` | 进行一次包含完整监控的沙箱安装 |
| `fenceline install --sandbox --dry-run ` | 运行所有检测层,但跳过向主机拷贝产物的步骤 |
| `fenceline install --sandbox --format json ` | 输出 JSON 格式以便集成到 CI |
| `fenceline check` | 扫描 Lockfile 差异以查找高风险变更 (带缓存的注册表查询) |
| `fenceline check --fail-on medium` | 如果任何包的风险为 MEDIUM 或更高,则判定 CI 失败 |
| `fenceline map --check` | 对照实时 DNS 验证深度映射数据 |
| `fenceline map --update` | 刷新 map YAML 文件中的 DNS 快照 |
| `fenceline audit-actions` | 扫描 GitHub Actions 中未固定版本的 tag |
| `fenceline init` | 安装 Git 钩子,在 Lockfile 变更时自动运行 `fenceline check` |
## 示例项目
[examples/safe-project/](examples/safe-project/) 目录包含一个带有安全依赖项的最简 Node.js 项目,用于在本地测试 Fenceline:
```
cd examples/safe-project
./test.sh # runs sandboxed install + check + JSON output verification
```
## 了解更多
| 资源 | 描述 |
|----------|-------------|
| [漏洞利用案例研究](exploits/) | 11 个真实的攻击案例 (2018-2026),包含 IOC 和沙箱评估 |
| [深度映射](map/) | 8 个包管理器的网络指纹——驱动检测引擎的核心 |
| [防御手册](docs/playbook.md) | 针对不同角色的实用防御步骤 |
| [工具全景图](docs/landscape.md) | Fenceline 与 Socket、Aikido、Phylum 等工具的对比与定位 |
## 路线图
| 阶段 | 状态 | 内容 |
|-------|--------|------|
| 核心引擎 | 已完成 | Docker 沙箱、两阶段监控、文件系统差异比对、iptables LOG 捕获 |
| 检测机制 | 已完成 | CDN 指纹识别、预期进程启发式、DNS 监控、HTTP 代理分析 |
| CLI 工具 | 已完成 | wrap (npm + pip), install (--format json, --dry-run), check (cached, --fail-on), map, audit-actions, init。包含 386 项测试。|
| 生态系统 | 已完成 | Node.js 生产就绪,Python pip 获得全面支持(import 解析、控制台脚本),其他为实验性支持 |
| 知识库 | 已完成 | 11 个漏洞利用案例研究、防御手册、工具全景图 |
| 下一步 | 已规划 | CI 强制执行模式、更深入的 HTTP 载荷分析、eBPF 追踪 |
## 贡献
详见 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 免责声明
尽力而为,社区驱动。**不保证能够防御所有攻击。** 详见 [DISCLAIMER.md](DISCLAIMER.md)。
## 许可证
Apache 2.0 -- [LICENSE](LICENSE)。版权所有 2026 Fenceline 贡献者。
Fenceline 本可以拦截的近期攻击
- **2026 年 3 月 -- Axios RAT**:维护者账号被钓鱼,通过 `plain-crypto-js` 注入 RAT。在 8000 端口进行 C2 信令通信。Fenceline 阶段 1 会捕获非标准端口的通信 -> 已拦截。 - **2026 年 3 月 -- TeamPCP**:Trivy、Checkmarx、LiteLLM 通过 `.pth` 载荷被攻陷。Fenceline 阶段 2 会捕获导入时的激活行为 -> 已拦截。 - **2025 年 -- chalk/debug 劫持**:18 个包遭到破坏,2 小时内影响了十分之一的云环境。Fenceline 阶段 2 会捕获 require() 阶段的 C2 通信 -> 已拦截。 详见 [exploits/](exploits/),其中包含 11 个带有 IOC 和时间线的详细案例研究。标签:C2通信检测, DNS监控, Docker容器, HTTP行为分析, IP 地址批量处理, MITM代理, npm安全, pip安全, Python安全工具, RAT防护, 依赖防火墙, 包管理器安全, 开发环境安全, 开发者安全, 恶意软件防护, 攻击面发现, 文件系统监控, 文档安全, 暗色界面, 终端安全, 请求拦截, 逆向工具, 零信任安全