whitespots/Whitespots-AI-SAST

GitHub: whitespots/Whitespots-AI-SAST

一款基于 AI 的轻量级 CI 静态代码安全扫描工具,支持本地大模型离线运行,输出结构化的漏洞 JSON 报告。

Stars: 1 | Forks: 0

# Whitespots AI SAST Docker Scanner 轻量级 CLI 优先的 AI SAST 扫描器,可通过单个 Docker 容器运行并输出结构化的 JSON。 本项目特意设计为非平台化:没有数据库、队列、仪表板、worker 或云服务。 为此,我们提供了另一个自托管平台 ## 构建 从公开的 GitHub 仓库构建 CI 镜像: ``` docker build -t whitespots-ai-sast . ``` 默认情况下,CI Dockerfile 会克隆 `main` 分支的 `https://github.com/whitespots/Whitespots-AI-SAST.git`。如需构建其他分支或标签,请使用: ``` docker build \ --build-arg SAST_REF=main \ -t whitespots-ai-sast . ``` 使用开发用的 Dockerfile 从当前的本地检出版本进行构建: ``` docker build -f Dockerfile.dev -t whitespots-ai-sast:dev . ``` 在测试尚未推送的本地更改时,请使用 `Dockerfile.dev`。默认的 `Dockerfile` 始终会克隆 GitHub,因此它仅包含所选远程分支或标签中已有的更改。 首次运行时,如果请求的 Ollama 模型尚未存在,容器会将其拉取下来。要进行完全离线的本地模型扫描,请在构建镜像时预加载 Ollama 模型: ``` docker build \ --build-arg PRELOAD_MODEL=true \ --build-arg OLLAMA_MODEL=qwen2.5-coder:0.5b \ -t whitespots-ai-sast . ``` 避免在小型 CI runner 上使用 `PRELOAD_MODEL=true`;模型层非常大。建议在运行时挂载 `/models`,或者让首次扫描时再拉取模型。 如果 CI 需要可重现的运行时构建,请固定 Ollama 运行时镜像版本: ``` docker build \ --build-arg OLLAMA_IMAGE=ollama/ollama:0.11.4 \ -t whitespots-ai-sast . ``` 您也可以在 `/models` 挂载现有的 Ollama 模型存储,而不是将模型内置到镜像中。 首次大规模拉取可能需要几分钟。如有需要,可覆盖拉取超时时间: ``` docker run --rm \ -e AI_SAST_PULL_TIMEOUT_MS=3600000 \ -v "$(pwd):/scan" \ whitespots-ai-sast scan /scan --local --local-model qwen2.5-coder:0.5b ``` ## 运行本地离线扫描 Docker 镜像暴露了 `/usr/bin/whitespots-ai-sast`,因此该工具的运行方式如下: ``` whitespots-ai-sast ``` ``` docker run --rm \ -v "$(pwd):/scan" \ whitespots-ai-sast scan /scan --local --local-model qwen2.5-coder:0.5b ``` 扫描子目录: ``` docker run --rm \ -v "$(pwd):/scan" \ whitespots-ai-sast scan /scan/project --local ``` 将 JSON 写入文件: ``` docker run --rm \ -v "$(pwd):/scan" \ whitespots-ai-sast scan /scan --local -o /scan/sast-results.json ``` 使用扫描深度来控制对大型仓库的分析程度: ``` whitespots-ai-sast scan ./repo --scan-mode fast whitespots-ai-sast scan ./repo --scan-mode balanced whitespots-ai-sast scan ./repo --scan-mode deep ``` `deep` 是默认选项,会扫描每一个受支持的源文件。`balanced` 会扫描 50 个最受关注的文件。`fast` 仅扫描 10 个最受关注的文件。 默认情况下会使用 `--max-file-bytes` 跳过大文件: ``` whitespots-ai-sast scan ./repo --skip-large-files --max-file-bytes 750000 ``` 扫描器默认会忽略常见的生成文件和依赖路径,包括 `dist/`、`build/`、`vendor/`、`*.min.js` 和 `*.lock`。 扫描器始终返回: ``` { "results": [] } ``` 每个发现(finding)都包含 `title`、`severity`、`description`、`remediation`、`details`、`file_path`、`line_number` 和 `code_snippet`。 ## 外部提供商 外部提供商是可选的,并且仅在选中时运行: ``` whitespots-ai-sast scan ./repo \ --provider openai \ --model gpt-4.1 \ --api-key "$OPENAI_API_KEY" ``` 或者像这样: ``` docker run --rm \ -v ai-sast-ollama:/models \ -v "$(pwd):/scan" \ whitespots-ai-sast scan /scan \ --provider grok \ --model grok-4.20-0309-non-reasoning \ --api-key "xai-....." \ -o /scan/sast-results.json ``` 受支持的提供商名称: - `local` - `openai` - `anthropic` - `llama-remote` - `grok` API 密钥永远不会被记录在日志中。建议使用环境变量来设置密钥: - `OPENAI_API_KEY` - `ANTHROPIC_API_KEY` - `LLAMA_REMOTE_API_KEY` - `GROK_API_KEY` ## 扫描行为 扫描器会: - 递归扫描文件和目录 - 读取 `.gitignore` - 跳过二进制文件和大文件 - 根据扩展名检测受支持的语言 - 在可用的情况下使用 Tree-sitter 来识别代码符号 - 在 AI 分析之前对安全敏感区域进行排名 - 根据附近的高风险 sink 和 source 对代码进行分块 - 对模型发现的漏洞进行去重和验证 受支持的语言包括 JavaScript、TypeScript、Python、Go、Java、PHP、Ruby、Rust、C#、C/C++ 和 Kotlin。 ## 模式 ``` whitespots-ai-sast scan ./repo --mode conservative whitespots-ai-sast scan ./repo --mode balanced whitespots-ai-sast scan ./repo --mode aggressive ``` `conservative` 会更严格地过滤以寻找具体证据。`aggressive` 会将更多的代码区域发送给模型。 对于仅使用 CPU 的 Docker Desktop 运行,建议从 `qwen2.5-coder:0.5b` 开始。如果您有足够的内存并希望获得更好的发现结果,请尝试 `qwen2.5-coder:1.5b`。较大的标签(例如 `qwen2.5-coder`)可能需要增加 Docker 的内存分配。 实用的 CPU 调优选项: ``` whitespots-ai-sast scan ./repo --local \ --local-model qwen2.5-coder:0.5b \ --ctx-size 2048 \ --timeout-ms 600000 ``` 可选的第二阶段验证: ``` whitespots-ai-sast scan ./repo --second-pass ```
标签:AI风险缓解, DevSecOps, DNS 反向解析, Docker, GraphQL安全矩阵, SAST, 上游代理, 人工智能, 安全扫描器, 安全防御评估, 文档结构分析, 用户模式Hook绕过, 盲注攻击, 自动化攻击, 请求拦截, 错误基检测, 静态代码分析