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绕过, 盲注攻击, 自动化攻击, 请求拦截, 错误基检测, 静态代码分析