Lekssays/codebadger

GitHub: Lekssays/codebadger

基于 Joern 代码属性图的容器化 MCP 服务器,为 AI 助手提供多语言深度静态分析和漏洞检测能力。

Stars: 47 | Forks: 6

# 🦡 codebadger 一个容器化的 Model Context Protocol (MCP) 服务器,利用 Joern 的 Code Property Graph (CPG) 技术提供静态代码分析,支持 Java、C/C++、JavaScript、Python、Go、Kotlin、C#、Ghidra、Jimple、PHP、Ruby 和 Swift。 ## 前置条件 在开始之前,请确保您已具备: - 已安装 **Docker** 和 **Docker Compose** - **Python 3.10+**(推荐 Python 3.13) - **pip**(Python 包管理器) 验证您的设置: ``` docker --version docker-compose --version python --version ``` ## 快速开始 ### 1. 安装 Python 依赖 ``` # 创建虚拟环境(可选但推荐) python -m venv venv # 安装依赖 pip install -r requirements.txt ``` ### 2. 启动 Docker 服务 (Joern) ``` docker compose up -d ``` 此步骤会启动: - **Joern Server**:静态代码分析引擎(负责运行 CPG 生成和查询) 验证服务是否正在运行: ``` docker compose ps ``` ### 3. 启动 MCP 服务器 ``` # 启动服务器 python main.py & ``` MCP 服务器将运行于 `http://localhost:4242`。 ### 4. 停止所有服务 ``` # 停止 MCP server(在终端中按 Ctrl+C) # 停止 Docker 服务 docker-compose down # 可选:清理所有内容 bash cleanup.sh ``` ## 清理脚本 使用提供的清理脚本重置您的环境: ``` bash cleanup.sh ``` 此操作将: - 停止并移除 Docker 容器 - 终止孤立的 Joern/MCP 进程 - 清除 Python 缓存(`__pycache__`、`.pytest_cache`) - 可选清除 playground 目录(CPG 和缓存的代码库) ## 集成 ### GitHub Copilot 集成 编辑 VS Code 的 MCP 配置文件 (GitHub Copilot): **路径:** ``` ~/.config/Code/User/mcp.json ``` **配置示例:** ``` { "inputs": [], "servers": { "codebadger": { "url": "http://localhost:4242/mcp", "type": "http" } } } ``` ### Claude Code 集成 若要将 `codebadger` 集成到 **Claude Desktop** 中,请编辑: **路径:** ``` Claude → Settings → Developer → Edit Config → claude_desktop_config.json ``` 添加以下内容: ``` { "mcpServers": { "codebadger": { "url": "http://localhost:4242/mcp", "type": "http" } } } ``` ## 可用工具 ### 核心 - `generate_cpg`:为代码库(本地路径或 GitHub URL)生成 Code Property Graph (CPG)。 - `get_cpg_status`:检查 CPG 是否存在并获取状态元数据。 - `run_cpgql_query`:针对 CPG 执行原生 CPGQL 查询并返回结构化结果。 - `get_cpgql_syntax_help`:显示 CPGQL 语法帮助、提示和常见错误修复。 ### 代码浏览 - `list_methods`:列出方法/函数,支持可选的正则/文件过滤器。 - `list_files`:以分页树状视图显示源文件。 - `get_method_source`:获取指定名称方法的所有源代码。 - `list_calls`:列出函数间的调用点(caller → callee)。 - `get_call_graph`:构建人类可读的调用图(传入或传出)。 - `list_parameters`:获取方法的参数名称、类型和顺序。 - `get_codebase_summary`:高层级指标(文件数、方法数、调用数、语言)。 - `get_code_snippet`:根据起始/结束行号返回文件片段。 ### 语义分析 - `get_cfg`:为方法生成控制流图(节点和边)。 - `get_type_definition`:检查结构体/类类型及其成员。 - `get_macro_expansion`:启发式检测可能的宏展开调用。 ### 污点与漏洞分析 - `find_taint_sources`:查找可能的外部输入点(sources)。 - `find_taint_sinks`:定位污点数据可能流入的危险汇聚点(sinks)。 - `find_taint_flows`:检测从 sources 到 sinks 的数据流(污点分析)。 - `get_program_slice`:为某个调用构建向后/向前程序切片。 - `get_variable_flow`:追踪某位置变量的数据依赖关系。 - `find_bounds_checks`:搜索缓冲区访问附近的边界检查。 - `find_use_after_free`:启发式检测释放后使用模式。 - `find_double_free`:检测潜在的二次释放问题。 - `find_null_pointer_deref`:查找可能的空指针解引用。 - `find_integer_overflow`:检测整数溢出模式。 ### 导出与报告 - `store_findings`:解析分析结果并将其存储到数据库中。 - `export_sarif`:以 SARIF 格式导出高置信度的发现结果。 ## 贡献与测试 感谢您的贡献!以下是运行测试和贡献代码的快速指南。 ### 前置条件 - Python 3.10+(CI 中使用 3.13) - Docker 和 Docker Compose(用于集成测试) ### 本地开发设置 1. 创建虚拟环境并安装依赖 ``` python -m venv venv pip install -r requirements.txt ``` 2. 启动 Docker 服务(用于集成测试) ``` docker-compose up -d ``` 3. 运行单元测试 ``` pytest tests/ -q ``` 4. 运行集成测试(需要 Docker Compose 处于运行状态) ``` # 在后台启动 MCP server python main.py & # 运行集成测试 pytest tests/integration -q # 停止 MCP server pkill -f "python main.py" ``` 5. 运行所有测试 ``` pytest tests/ -q ``` 6. 测试后清理 ``` bash cleanup.sh docker-compose down ``` ### 代码贡献 贡献时请遵循以下准则: 1. 遵循代码库规范 2. 为行为变更编写测试 3. 提交 PR 前确保所有测试通过 4. 在 PR 描述中包含清晰的变更日志 5. 如有需要,更新文档 ## 配置 MCP 服务器可以通过环境变量或 `config.yaml` 进行配置。 ### 环境变量 关键设置(可选 - 显示为默认值): ``` # 服务器 MCP_HOST=0.0.0.0 MCP_PORT=4242 # Joern JOERN_BINARY_PATH=joern JOERN_JAVA_OPTS="-Xmx4G -Xms2G -XX:+UseG1GC -Dfile.encoding=UTF-8" # CPG 生成 CPG_GENERATION_TIMEOUT=600 MAX_REPO_SIZE_MB=500 # 查询 QUERY_TIMEOUT=30 QUERY_CACHE_ENABLED=true QUERY_CACHE_TTL=300 # 遥测(OpenTelemetry) OTEL_ENABLED=false OTEL_SERVICE_NAME=codebadger OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 OTEL_EXPORTER_OTLP_PROTOCOL=grpc ``` ### 配置文件 从 `config.example.yaml` 创建 `config.yaml`: ``` cp config.example.yaml config.yaml ``` 然后根据需要进行自定义。 ## 遥测 (OpenTelemetry) CodeBadger 内置 OpenTelemetry 支持,用于分布式追踪。启用后,所有 MCP 工具调用将被自动追踪,此外还包括针对 CPG 生成、Joern 服务器管理和查询执行的自定义 spans。 ### 快速开始 1. 安装遥测依赖(已包含在 `requirements.txt` 中): ``` pip install opentelemetry-sdk opentelemetry-exporter-otlp ``` 2. 通过环境变量启用: ``` export OTEL_ENABLED=true export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 python main.py ``` 或通过 `config.yaml` 启用: ``` telemetry: enabled: true service_name: codebadger otlp_endpoint: http://localhost:4317 otlp_protocol: grpc # or "http/protobuf" ``` ### 使用 Jaeger 进行本地开发 ``` # 启动 Jaeger(在 http://localhost:16686 提供 UI) docker run -d --name jaeger \ -p 16686:16686 \ -p 4317:4317 \ jaegertracing/all-in-one:latest # 启动 CodeBadger 并启用遥测 OTEL_ENABLED=true python main.py ``` ### 追踪内容 | Span | 描述 | |------|-------------| | `tools/call {name}` | 每次 MCP 工具调用(通过 FastMCP 自动进行) | | `cpg.generate` | 完整的 CPG 生成流程 | | `cpg.joern_cli_exec` | Docker 内部的 Joern CLI 命令执行 | | `cpg.spawn_server` | Joern 服务器实例创建 | | `cpg.load_cpg` | 将 CPG 文件加载到 Joern 服务器 | | `query.execute` | CPGQL 查询执行,包含耗时和成功属性 | ### 配置参考 | 设置 | 环境变量 | 默认值 | 描述 | |---------|-------------|---------|-------------| | `enabled` | `OTEL_ENABLED` | `false` | 启用/禁用遥测 | | `service_name` | `OTEL_SERVICE_NAME` | `codebadger` | 追踪中的服务名称 | | `otlp_endpoint` | `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4317` | OTLP collector 端点 | | `otlp_protocol` | `OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc` | 导出协议(`grpc` 或 `http/protobuf`) | 当遥测禁用时(默认),所有追踪操作均为无操作,零开销。
标签:C/C++, Claude, CPG, CVE检测, DevSecOps, Docker, Ghidra, GitHub Copilot, Go, Joern, Kotlin, LLM工具, MCP服务器, NIDS, OpenVAS, PHP, Python, Ruby, Ruby工具, Swift, 上游代理, 事务性I/O, 云资产清单, 人工智能辅助, 代码安全, 代码属性图, 代码智能, 可配置连接, 多语言支持, 安全专业人员, 安全测试框架, 安全防御评估, 容器化, 对称加密, 无后门, 浏览器安全, 漏洞枚举, 用户代理, 知识库, 程序分析, 网络安全, 自动化审计, 请求拦截, 逆向工具, 逆向工程, 错误基检测, 隐私保护, 静态代码分析