TGPSKI/skeptic

GitHub: TGPSKI/skeptic

skeptic 是一个本地仓库信任审计器,专注于检测能导致级联供应链妥协的结构性信任边界漏洞。

Stars: 1 | Forks: 0

# 怀疑者 [![Go 参考文档](https://pkg.go.dev/badge/github.com/TGPSKI/skeptic.svg)](https://pkg.go.dev/github.com/TGPSKI/skeptic/cmd/skeptic) [![Go 版本](https://img.shields.io/github/go-mod/go-version/TGPSKI/skeptic)](https://go.dev/) [![许可证](https://img.shields.io/github/license/TGPSKI/skeptic)](LICENSE) 一个本地仓库信任审计器。 `skeptic` 检测能够引发级联供应链妥协的结构性信任边界漏洞。它针对的是攻击**条件**,而非仅仅是攻击产物——这类弱点是 CVE 扫描器、SAST 工具和密钥扫描器无法覆盖的。 **仅使用标准库**的 Go 语言,单一二进制文件,229 条内置规则(外加规则包摄入),零运行时依赖,并实现与恶意内容的代理隔离。 [功能定位](#what-skeptic-is) | [局限性说明](#what-skeptic-is-not) | [设计](#design) | [检测引擎](#detection-engine) | [规则摄入与规则包](#rule-ingestion-and-rule-packs) | [语料库](#corpus) | [GitHub Action](#github-action) | [运行时](#runtimes) ## 快速开始 ``` sudo make install # build + install skeptic init # bootstrap config skeptic scan # scan skeptic mcp # start the MCP server skeptic serve # start the daemon skeptic ingest # ingest threat intelligence skeptic corpus # manage the encrypted threat artifact corpus ``` ## `skeptic` 的功能定位 `skeptic` 扫描文件系统,以发现现有工具覆盖间隙中的攻击向量: - **CI/CD 信任边界违规** — 可变的 Action 引用、不安全的 `pull_request_target` 模式、过度授权的自动化身份、未锁定的安装以及 CI 密钥卫生缺陷。 - **代理生态系统投毒** — 恶意的 `SKILL.md` 指令、MCP 工具遮蔽、记忆持久化注入以及工具输出指令注入。 - **“无人审查”的攻击面** — 锁文件注入、IDE 和编辑器配置投毒、构建缓存产物、备份文件、操作系统元数据等低审查路径。 - **跨发现项关联** — 基于目录、仓库级别、内容哈希、基本名称和 Git 时间的关联,以揭示复合风险(`COR-`、`DRIFT-`)。 ## `skeptic` 的局限性 - **不是 CVE 扫描器。** 请使用 Trivy、Grype、osv-scanner 检测软件包漏洞。 - **不是 SAST 工具。** 不进行 AST 解析,不进行数据流污点追踪。 - **不是密钥扫描器。** 请使用 Gitleaks 或 trufflehog 检测凭据泄露。 - **不是 EDR。** 扫描静态文件,而非运行时行为。 将 `skeptic` 与这些工具并行运行,以检测它们未覆盖的间隙。 ## 设计原则 - 填补现有安全工具遗漏的间隙。 - 对于相同输入和规则集,输出具有确定性。 - 单一静态 Go 二进制文件,仅使用标准库。 - 仅使用 RE2 正则表达式,无不安全模式。 - 显式错误检查——无静默失败。 - 可审计性和可追溯的配置。 - 原子文件写入,无路径逃逸。 ## 检测引擎 除了正则表达式模式匹配外,引擎还应用: - **行为链** — 跨文件内容的多步骤有序/无序检测(16 条链,`BHV-`) - **12 种有效载荷解码器** — base64、base32、十六进制、URL、gzip、zlib、PowerShell、Unicode、HTML、ROT13、quoted-printable、PEM;可配置深度,并基于熵的加成递归 - **身份图分析** — 对 AWS、Azure、GCP 和 Kubernetes 的 IAM/RBAC/OIDC 配置进行 BFS 遍历 - **跨发现项关联** — 基于目录、仓库级别、内容哈希、文件基本名称和 Git 时间的关联(`COR-`、`DRIFT-`) - **香农熵异常检测** — 用于嵌入式加密/编码有效载荷的滑动窗口分析 - **NFKC 规范化** — 对抗全宽/同形字规避 - **Aho-Corasick 预过滤** — 用于大型语料库加速的可选字面关键字自动机 - **XOR 暴力破解** — 对高熵内容进行可选的单字节 XOR 解码(`--xor-brute`) - **多语言检测** — 文本文件中的二进制魔数字节 - **增量缓存** — 带有规则集哈希失效的 mtime + size + SHA256 状态文件 - **豁免抑制** — 带有 SHA256 固定文件范围的 JSON 豁免文件;`waive` 创建条目,`--waivers` 在扫描时应用它们 - **风险评分** — 0–100 综合评分,具有按严重性递减的边际效应 - **工具上下文豁免** — 在特定工具上下文中运行时,`--tool-name` 可减少误报 ### 规则包与摄入 规则包用于通过来自多个来源的实时威胁情报扩展内置规则集。规则包使用 Ed25519 分离签名进行签名,以确保完整性和真实性。 `skeptic ingest` 从 URL、文件和目录创建签名规则包。 ### 语料库 `skeptic corpus` 为恶意文件提供加密静态存储和扫描隔离。此功能在扫描期间将代理与摄入的恶意内容隔离。 `corpus` 处理初始化、加密存储、内容验证、清单完整性、路径安全以及具有预期检测增量报告的隔离扫描。 ``` skeptic corpus init # create the corpus directory with AES-256-GCM key skeptic corpus fetch -s ./SKILL.md # ingest a malicious SKILL.md file skeptic corpus info # show the corpus status skeptic corpus scan --learn # scan the corpus and learn the expected rules ``` ## GitHub Action 将怀疑者添加到任何工作流: ``` - uses: TGPSKI/skeptic@v1 ``` ``` - uses: TGPSKI/skeptic@v1 with: scan-style: hybrid threat-mode: machine-identity fail-on: none # advisory only ``` 完整输入/输出参考和用法示例请参见 [docs/GITHUB_ACTION.md](docs/GITHUB_ACTION.md)。 ## 运行时 ### CLI 扫描 ``` skeptic scan {repo_path} # positional path skeptic scan --path {repo_path} # explicit flag skeptic scan -p {repo_path} -f json # shorthand flags skeptic scan --preset ci --fail-on high # CI gating ``` ### MCP 服务器 MCP 服务器通过 stdio JSON-RPC 提供代理工具访问。配置您的 MCP 客户端: ``` { "mcpServers": { "skeptic": { "command": "skeptic", "args": ["mcp"] } } } ``` 暴露的工具:`skeptic_scan_repo`、`skeptic_waive`、`skeptic_ingest_url`,以及当提供 `--daemon-url` 时的守护进程桥接工具。完整工具参考请参见 [docs/SERVER.md](docs/SERVER.md)。 ### 守护进程 守护进程添加了定时后台扫描,并暴露一个 HTTP API 用于状态、报告和触发扫描。 ``` # 终端 1: 启动 daemon skeptic serve --scan-interval 5m # 终端 2: 通过 daemon 桥接启动 MCP 服务器 skeptic mcp --daemon-url http://127.0.0.1:7788 --daemon-token-file .skeptic/daemon.token ``` 守护进程默认绑定到回环地址,并使用令牌进行身份验证。参见 [docs/SERVER.md](docs/SERVER.md)。 ## 安装 ### 通过 go install ``` go install github.com/TGPSKI/skeptic/cmd/skeptic@latest ``` ### 二进制文件 + 补全脚本(推荐) ``` sudo make install ``` 此操作构建二进制文件,将其复制到 `/usr/local/bin/`,并将 bash、zsh 和 fish 的 shell 补全脚本安装到它们各自的标准系统目录中。安装过程会优雅地跳过其补全目录不可写的任何 shell。 如有需要,可覆盖路径: ``` sudo make install INSTALL_DIR=/opt/bin ZSH_COMPLETION_DIR=/usr/share/zsh/site-functions ``` ### 仅二进制文件 ``` make build sudo install -m 755 bin/skeptic /usr/local/bin/skeptic ``` ### 仅补全脚本 ``` sudo make install-completions ``` 或生成到 stdout 以便手动放置: ``` skeptic completion bash > ~/.local/share/bash-completion/completions/skeptic skeptic completion zsh > ~/.local/share/zsh/site-functions/_skeptic skeptic completion fish > ~/.config/fish/completions/skeptic.fish ``` ### 用户本地安装(无需 sudo) ``` make build mkdir -p ~/.local/bin install -m 755 bin/skeptic ~/.local/bin/skeptic # completions(如需则创建目录) mkdir -p ~/.local/share/bash-completion/completions skeptic completion bash > ~/.local/share/bash-completion/completions/skeptic mkdir -p ~/.local/share/zsh/site-functions skeptic completion zsh > ~/.local/share/zsh/site-functions/_skeptic mkdir -p ~/.config/fish/completions skeptic completion fish > ~/.config/fish/completions/skeptic.fish ``` 确保 `~/.local/bin` 在你的 `PATH` 中。对于 zsh,在 `.zshrc` 中的 `compinit` 之前添加 `fpath=(~/.local/share/zsh/site-functions $fpath)`。 ### 卸载 ``` sudo make uninstall ``` ## 开发 ### 测试和 linting ``` make build # compile binary make check # pre-commit: fmt (fail on diff) + vet make test # unit tests make test-race # unit tests with race detector make integration # fast integration tests (~10s) make ci # full CI suite (race + integration) make lint # golangci-lint (errcheck, staticcheck, funlen, etc.) make bench # benchmarks (all packages) make coverage-check # coverage gate (fail if < 60%) ``` 完整目标列表请参见 `make help`。 ## CLI 模式 ### CI 门控 ``` skeptic scan -p . --preset ci -f sarif --fail-on high > skeptic.sarif ``` ### 基线 + 仅差异比较 ``` skeptic scan -p . -f json --write-baseline ./baseline.json skeptic scan -p . --baseline ./baseline.json --diff-only -f json ``` ### 增量开发者扫描 ``` skeptic scan --mode developer -p . --incremental --state-cache .skeptic-state.json ``` ### 聚焦机器身份或 AI 工作负载评估 ``` skeptic scan -p . --threat-mode machine-identity --scan-style hybrid -f json skeptic scan -p . --threat-mode ai-workload --scan-style hybrid -f json ``` ### 事件响应分诊(显示所有内容) ``` skeptic scan --mode ir -p . --scan-style hybrid ``` ### 威胁情报摄入 ``` skeptic ingest \ --source "https://example.com/advisory" \ --allow-host "example.com" \ --ecosystems "general,pypi,npm,github-actions,container,mcp,agent-skills,go,cargo" \ --rule-quality strict \ --out "rulepacks/campaigns/ingested-rules.json" ``` ### 签名的外部规则包 ``` skeptic gen-rule-keypair --private-out signing.key.pem --public-out signing.pub.pem skeptic sign-rulepack --rules-file ./rules.json --private-key signing.key.pem skeptic scan --rules-file ./rules.json --rules-pubkey signing.pub.pem --require-signed-rules ``` ## CLI 参考 ### 主要标志 | 标志 | 短标志 | 默认值 | 描述 | | ------------------- | ------ | ----------- | ------------------------------------------------------------ | | `--path` | `-p` | `.` | 要扫描的根路径(也可作为位置参数接受) | | `--format` | `-f` | `text` | 输出格式:`text | | `--config` | `-c` | auto | 配置文件路径(`.json`、`.yaml`、`.env`) | | `--mode` | | `developer` | 操作模式:`developer | | `--preset` | | — | 简写预设:`quick | | `--profile` | | `repo` | 扫描配置文件:`repo | | `--scan-style` | | `pattern` | 检测风格:`pattern | | `--threat-mode` | | `all` | 关注点:`all | | `--fail-on` | | `critical` | 严重性门控:从 `none` 到 `critical` | | `--fail-on-score` | | `0` | 风险评分门控(0–100,0 表示禁用) | | `--incremental` | | `false` | 通过 mtime/哈希缓存跳过未更改的文件 | | `--baseline` | | — | 用于差异比较的先前 JSON 报告 | | `--waivers` | | — | JSON 豁免文件;匹配的发现项将保持 `suppressed=true` | 配置解析顺序:模式默认值 < 预设覆盖 < 配置文件值 < 显式 CLI 标志。 完整标志列表:`skeptic --help` 或参见 [docs/CONFIGURATION.md](docs/CONFIGURATION.md)。 ### 全局标志 | 标志 | 短标志 | 描述 | | ------------------- | ------ | -------------------------------------------- | | `--verbose N` | `-v` | 详细级别:0=警告,1=信息,2=调试,3=性能 | | `--quiet` | `-q` | 禁止非错误输出 | | `--config F` | `-c` | 配置文件(空=自动发现 `.skeptic.*`) | | `--log-file F` | | 日志文件路径 | | `--cpu-profile F` | | 将 CPU 分析写入文件 | | `--mem-profile F` | | 退出时写入堆分析文件 | | `--trace F` | | 将执行跟踪写入文件 | | `--perf-debug` | | 启用所有分析 + 逐文件计时 | ### 子命令 | 命令 | 用途 | | --------------------- | --------------------------------------------- | | `scan` *(默认)* | 扫描并报告 | | `init` | 引导配置文件和 XDG 数据目录 | | `config show` | 打印已解析的配置 | | `config use ` | 设置活动的命名配置文件 | | `corpus` | 管理加密的威胁工件语料库 | | `ingest` | 从威胁情报源生成规则包 | | `serve` | 持久化调度器 + 本地 HTTP API | | `mcp` | 用于代理工具的 stdio MCP 服务器 | | `waive` | 为发现项创建 SHA256 固定的豁免条目 | | `bundle` | 打包二进制文件 + 规则以便分发 | | `export-evidence` | 用于事件响应移交的签名证据包 | | `sign-rulepack` | 使用 Ed25519 签名外部规则包 | | `gen-rule-keypair` | 生成 Ed25519 密钥对 | | `verify-rulepack` | 验证规则包签名 | | `verify-bundle` | 验证签名的分发包 | | `completion` | Shell 补全脚本(bash、zsh、fish) | | `version` | 打印构建信息和规则计数 |
标签:CI/CD安全, DevSecOps, EVTX分析, Go语言开发, Llama, TLS抓取, 上游代理, 云计算, 代理安全, 供应链攻击检测, 信任边界分析, 单二进制部署, 威胁情报管理, 安全扫描, 工具安全, 开发者安全, 文档结构分析, 日志审计, 时序注入, 标准库依赖, 网络安全, 规则引擎, 软件安全, 隐私保护, 零运行时依赖