chinmay-sawant/codehound

GitHub: chinmay-sawant/codehound

CodeHound 是一款 Rust 实现的 Go 静态分析器,作为 golangci-lint 等工具的补充,专注于性能反模式、框架陷阱和 CWE 启发式检测。

Stars: 3 | Forks: 0

# CodeHound — Go PERF 扫描器 + 框架陷阱检测器 CodeHound 是一款快速、有主见的分析器,用于**补充** golangci-lint、 staticcheck 和 govulncheck —— 它专注于那些工具看不到的问题: - **PERF** — 239 条规则:循环中的 regex、热点路径上的 `fmt.Sprintf`、紧密循环中的 defer、`http.ServeFile` 主体泄漏、请求路径上的分配抖动。参见 [`documents/perf-rules.md`](./documents/perf-rules.md)。计数源自活跃注册表(`codehound --list-rules`)。 - **框架陷阱** — 支持 Gin/Echo/GORM/sqlx:未关闭的响应主体、无界查询行、缺少超时、context 泄漏。 - **CWE 启发式** — 175 个基于夹具的条目,涵盖文件 I/O、SQL 注入、命令注入、链接解析和配置 sink。 - **不良实践** — 136 条规则,涵盖错误处理、并发、测试、API 设计和生产强化。 - **污点跟踪(实验性)** — 针对 CWE-22/78/79/89 的过程内分析。基于名称字符串匹配;非安全级别 —— 用于分类筛查,而非严格拦截。 ## 目标 - 检测 Go 服务中静态可见的性能和弱点模式。 - 将发现结果映射到 **PERF** 规则 ID 和 **CWE** 参考。 - 输出机器可读的结果(text、JSON、SARIF)—— 参见 [`documents/output-formats.md`](./documents/output-formats.md)。 - 作为单一静态二进制文件运行,无需外部服务。 ## 适用人群 云 AI 订阅(ChatGPT、Claude 等)目前受到了大量 **补贴**。这不会永远持续下去 —— 即使在补贴存在期间, 无限制的 agent 循环依然会耗费真实的资金和天数。 CodeHound 面向**业余项目**和**小规模 Go 作品**:在这些场景中, 你不需要企业级的性能工程,但你仍然希望获得*一些*优化、更清晰的架构,并在实际的交付截止日期前减少代码库中的**冗余污迹**。它是为了在这些限制下供个人使用而构建的:这是一个确定性的、离线的检查清单,你可以在消耗 token 进行无限制审查之前(或取代它)运行。 **在你现有的 Go CI 和 linter 之后运行它** —— 比如 **golangci-lint**、 staticcheck、govulncheck 等。CodeHound 通过这些工具经常遗漏的热点路径 PERF、框架陷阱和**不良实践**规则来补充它们。它不替代它们。目前的语言支持是**以 Go 优先**。 如果你希望减少 agent 造成的问题混乱、培养更好的架构习惯,或者需要一个具体的不良实践目录,请在此环节**使用 CodeHound 而不是开放式技能**:稳定的规则 ID、文件和行号 —— 而不是每次运行都在飘忽不定的感觉。 可选的 agent 分类筛查保持有界;而检查清单是无界的。 如果你为大型组织需要完整的 SRE / CodeQL 级别的覆盖范围,请使用为此构建的工具。如果你需要为副业项目或小型 Go 服务进行快速的 PERF + 陷阱 + BP 检查,并希望通过固定预算进行可选的 agent 分类筛查,那么这款工具适合你。 ## 状态 **0.1.0** 产品基准。**以 Go 优先:**生产规则和包主要针对 Go。 Python 是一个 **opt-in** 的 Cargo 特性,仅包含一条实验性规则 (`SLOP101`)。目前没有 TypeScript 插件。用于补充 golangci-lint; 参见 [`documents/go-vs-staticcheck.md`](./documents/go-vs-staticcheck.md) 和 [`documents/adr/0005-multi-lang-honesty.md`](./documents/adr/0005-multi-lang-honesty.md)。 ## 路线图 实时路线图:**[`ROADMAP.md`](./ROADMAP.md)**。位于 `plans/` 下的 历史计划是归档笔记,而非待办事项。 ## 安装 ``` # Go-first 默认构建 cargo install --path . # 可选的实验性 Python(仅限 SLOP101) cargo install --path . --features python ``` ## 用法 ``` # 默认 = 推荐的 pack(S-tier PERF + taint-core CWEs;关闭 BP;fail high) codehound . # PERF 风格的 finding 示例(请求路径 / 超时)—— 产品楔子 codehound --profile recommended --only PERF-101 . # Security pack(启用 taint)或完整目录 codehound --profile security . codehound --profile all . # JSON 或 SARIF 输出 codehound --format json ./... codehound --format sarif ./... > out.sarif # 测试文件(*_test.go 等)默认排除;使用以下命令包含它们: codehound --include-tests . # 限制为特定规则(与 pack allow-list 合并) codehound --only CWE-22,CWE-89 . # 显示每个已注册的规则 codehound --list-rules # 显示单个规则的详细信息 codehound --explain PERF-101 # 编写一个起始的 codehound.toml codehound init # 增量分析缓存(默认启用) codehound --rebuild-cache . codehound --prune-cache . codehound --no-cache . ``` 配置文件:[`documents/go-recommended-pack.md`](./documents/go-recommended-pack.md)。 缓存:[`documents/incremental-cache.md`](./documents/incremental-cache.md)。 CI 示例:[`.github/workflows/codehound.yml`](./.github/workflows/codehound.yml)。 ## 建议 **在 golangci-lint + govulncheck 之后使用 CodeHound**,用于**应用层级的 Go PERF + 框架陷阱 + 精选的 CWE 启发式** —— 而不是取代它们。 **非目标:**不替代 golangci-lint / staticcheck / govulncheck / CodeQL;不是 CVE 扫描器;在 CI 中不默认全面开启 BP。 默认包是 **`recommended`**(高信噪比,遇到高级别即失败)。仅在你确实需要完整目录时才使用 `--profile all`。 ### 严重级别 | 级别 | 描述 | 退出码(推荐包) | |----------|----------------------------------|-------------------------| | Info | 建议性 | 0 | | Low | 次要问题 | 0 | | Medium | 需审查(不会导致推荐包失败) | 0 | | High | 可能是真实问题 | 1 | | Critical | 必须立即修复 | 1 | ### SARIF 输出 详细的 SARIF schema 参考、字段映射和 `security-severity` 评分 记录在 [`documents/output-formats.md`](./documents/output-formats.md#sarif-210) 中。 请在 [`plans/v0.0.1/go/perf-heuristics-and-sarif.md`](./plans/v0.0.1/go/perf-heuristics-and-sarif.md) 中查找 SARIF 兼容性说明(特定于 perf 规则的 SARIF 元数据正在开发中)。 ### 诊断摘要 传入 `--diagnostics-summary` 以将紧凑的扫描摘要打印到 stderr: ``` scanned 238 files | 195 cached | 43 fresh | 1250.3ms | slowest: PERF-141 ``` ### 污点跟踪(实验性) CodeHound 包含一个实验性的过程内污点跟踪引擎,用于 CWE-22、CWE-78、CWE-79 和 CWE-89。**默认禁用** —— 传入 `--taint` 或 设置 `[codehound.taint] enabled = true`。**非安全级别** —— 基于名称字符串的 sink 匹配,无类型系统;仅凭 `filepath.Clean` **不**被视为路径净化器。 用于分类筛查,而非严格拦截。参见 [`documents/taint.md`](./documents/taint.md)。 ### 标准 CI 单行命令 默认情况下导出是**关闭**的(`scripts/` 下没有写入操作)。示例: ``` # 默认推荐的 pack → SARIF(fail high;无 BP;无工作区脏数据) codehound --profile recommended --format sarif . > codehound.sarif # Security pack(开启 taint) codehound --profile security --format sarif . > codehound.sarif ``` ### 不良实践 136 条 Go 不良实践规则(`BP-*`),涵盖错误处理、 并发、测试、API 设计、代码组织、生产强化和 依赖项管理。注意:与 staticcheck/errcheck 存在部分重叠 —— CodeHound 最适合作为补充工具使用,而不是替代品。参见 [`documents/bad-practices.md`](./documents/bad-practices.md)。 ### 配置文件 (`codehound.toml`) 所有字段均为可选。请参阅 `codehound init` 获取入门模板。 ``` [codehound] # 仅分析这些语言。 # languages = ["go", "python"] # 仅运行特定规则。 # only = ["CWE-22", "CWE-89"] # 跳过特定规则。 # skip = ["CWE-15"] # 退出策略:"none" | "never" | "medium" | "warnings" | "high" | "strict"。 # 未知值在加载时会被拒绝。 # fail_on = "high" # 包含/排除 gitignore 风格的 globs。 # include = ["**/*.go"] # exclude = ["**/vendor/**", "**/*_test.go"] # 测试文件(*_test.*)默认排除;设置为 false 以包含它们。 # exclude_tests = false ``` ## 示例 一个带有路径遍历问题的小型 Go 文件: ``` package sample import ( "net/http" "path/filepath" ) func readFile(w http.ResponseWriter, r *http.Request) { requested := r.URL.Query().Get("path") full := filepath.Join("/srv/public", requested) http.ServeFile(w, r, full) } ``` CodeHound 输出: ``` high CWE-22 sample.go:10:13 user-controlled input reaches a filesystem path sink ``` ## 开发 ``` cargo build cargo test cargo run -- ./tests/fixtures ``` ## 许可证 基于以下任一许可证授权:[MIT](LICENSE)
标签:Go, Python安全, Ruby工具, SAST, 代码安全检测, 可视化界面, 性能优化, 日志审计, 检测绕过, 盲注攻击, 通知系统, 错误基检测, 静态代码分析