Karmona/Fenceline

GitHub: Karmona/Fenceline

通过 Docker 沙箱隔离包安装过程并多维度验证其行为,从执行层面阻断恶意依赖对开发机的威胁。

Stars: 0 | Forks: 0

# Fenceline [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/de81e454a5195440.svg)](https://github.com/Karmona/Fenceline/actions/workflows/ci.yml) [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) [![Python 3.9+](https://img.shields.io/badge/python-3.9+-green.svg)](https://python.org) [![v0.6.0](https://img.shields.io/badge/version-0.6.0-orange.svg)](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 本可以拦截的近期攻击 - **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 和时间线的详细案例研究。
## 工作原理 ``` 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 贡献者。
标签:C2通信检测, DNS监控, Docker容器, HTTP行为分析, IP 地址批量处理, MITM代理, npm安全, pip安全, Python安全工具, RAT防护, 依赖防火墙, 包管理器安全, 开发环境安全, 开发者安全, 恶意软件防护, 攻击面发现, 文件系统监控, 文档安全, 暗色界面, 终端安全, 请求拦截, 逆向工具, 零信任安全