Skip to content

Commit b38d90d

Browse files
committed
test: add hardening acceptance gates and deployment docs
1 parent 5d4a799 commit b38d90d

21 files changed

Lines changed: 1095 additions & 60 deletions

.github/workflows/ci.yml

Lines changed: 47 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,65 @@
11
name: CI
22

33
on:
4-
push:
5-
branches:
6-
- main
74
pull_request:
8-
workflow_dispatch:
5+
push:
6+
branches: [main]
97

108
permissions:
119
contents: read
10+
security-events: write
1211

1312
jobs:
14-
python:
15-
name: Python checks
13+
quality:
1614
runs-on: ubuntu-latest
15+
services:
16+
postgres:
17+
image: postgres:17-alpine
18+
env:
19+
POSTGRES_DB: pure_codeql
20+
POSTGRES_USER: pure_codeql
21+
POSTGRES_PASSWORD: pure_codeql
22+
ports: ["5432:5432"]
23+
options: >-
24+
--health-cmd "pg_isready -U pure_codeql"
25+
--health-interval 5s --health-timeout 3s --health-retries 20
26+
redis:
27+
image: redis:8-alpine
28+
ports: ["6379:6379"]
29+
options: >-
30+
--health-cmd "redis-cli ping"
31+
--health-interval 5s --health-timeout 3s --health-retries 20
32+
env:
33+
DATABASE_URL: postgresql+asyncpg://pure_codeql:pure_codeql@127.0.0.1:5432/pure_codeql
34+
REDIS_URL: redis://127.0.0.1:6379/0
1735
steps:
18-
- name: Checkout
19-
uses: actions/checkout@v5
20-
21-
- name: Install uv
22-
uses: astral-sh/setup-uv@v8.1.0
36+
- uses: actions/checkout@v4
37+
- uses: astral-sh/setup-uv@v6
2338
with:
2439
enable-cache: true
25-
26-
- name: Set up Python
27-
uses: actions/setup-python@v6
40+
- uses: actions/setup-python@v5
2841
with:
29-
python-version-file: .python-version
30-
31-
- name: Verify lockfile
32-
run: uv lock --check
33-
34-
- name: Install dependencies
35-
run: uv sync --locked
36-
37-
- name: Lint (ruff)
38-
run: uvx ruff check pure_auto_codeql Analyze.py config.py test
39-
40-
- name: Run tests
41-
run: uv run pytest -q
42-
43-
- name: Compile Python modules
44-
run: uv run python -m compileall -q Analyze.py pure_auto_codeql
45-
46-
47-
- name: Check diff whitespace
48-
run: git diff --check
42+
python-version: "3.13"
43+
- run: uv sync --frozen --dev
44+
- run: uv run ruff check pure_auto_codeql test migrations
45+
- run: uv run pyright
46+
- run: uv run python -m compileall -q Analyze.py pure_auto_codeql migrations
47+
- run: uv run alembic upgrade head
48+
- run: uv run pytest -m "not real_codeql and not real_llm" --cov --cov-report=xml
49+
- run: uv run pip-audit
50+
- run: npm ci && npm run build && npm test && npm audit --audit-level=moderate
51+
working-directory: tools/mcp_ripgrep
4952

50-
mcp-ripgrep:
51-
name: MCP ripgrep checks
53+
codeql-golden:
5254
runs-on: ubuntu-latest
53-
defaults:
54-
run:
55-
working-directory: tools/mcp_ripgrep
5655
steps:
57-
- name: Checkout
58-
uses: actions/checkout@v5
59-
60-
- name: Set up Node.js
61-
uses: actions/setup-node@v6
56+
- uses: actions/checkout@v4
57+
- uses: astral-sh/setup-uv@v6
58+
- uses: actions/setup-python@v5
6259
with:
63-
node-version: "22"
64-
cache: npm
65-
cache-dependency-path: tools/mcp_ripgrep/package-lock.json
66-
67-
- name: Install dependencies
68-
run: npm ci
69-
70-
- name: Audit dependencies
71-
run: npm audit --audit-level=high
72-
73-
- name: Build
74-
run: npm run build
60+
python-version: "3.13"
61+
- uses: github/codeql-action/init@v4
62+
with:
63+
languages: java-kotlin, python, c-cpp
64+
- run: uv sync --frozen --dev
65+
- run: uv run pytest -m real_codeql -q

.github/workflows/real-llm.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Real LLM contract
2+
3+
on:
4+
workflow_dispatch:
5+
schedule:
6+
- cron: "23 3 * * 1"
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
contract:
13+
runs-on: ubuntu-latest
14+
env:
15+
RUN_REAL_LLM: "1"
16+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
17+
REAL_LLM_MODEL: ${{ vars.REAL_LLM_MODEL || 'gpt-5-mini' }}
18+
REAL_LLM_MAX_USD: ${{ vars.REAL_LLM_MAX_USD || '0.05' }}
19+
steps:
20+
- uses: actions/checkout@v4
21+
- uses: astral-sh/setup-uv@v6
22+
- uses: actions/setup-python@v5
23+
with:
24+
python-version: "3.13"
25+
- run: uv sync --frozen --dev
26+
- run: uv run pytest -m real_llm -q
27+
- uses: actions/upload-artifact@v4
28+
if: always()
29+
with:
30+
name: real-llm-contract
31+
path: outputs/evals/real-llm-contract.json

README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ output/
241241
## API 服务
242242

243243
```bash
244+
# 推荐:完整持久化 API/Worker 环境
245+
export API_AUTH_TOKEN="change-me"
246+
docker compose up --build
247+
248+
# 单进程兼容模式
244249
uv run uvicorn pure_auto_codeql.api.server:app --host 127.0.0.1 --port 8000
245250

246251
#
@@ -253,14 +258,15 @@ uv run pure-auto-codeql serve --host 127.0.0.1 --port 8000
253258
| 监听地址 |`127.0.0.1` |
254259
| 导入范围 | `API_IMPORT_SOURCES_DIR`(默认仓库内 `imports/`|
255260
| 构建命令 | 请求体中默认禁用 |
256-
| 鉴权 | 设置 `API_AUTH_TOKEN` 后需 Bearer Token |
261+
| 鉴权 | 非回环监听强制 `API_AUTH_TOKEN`;支持哈希与轮换 |
262+
| 持久化 | PostgreSQL 权威状态,Redis Streams 任务与事件 |
257263

258264
```bash
259265
export API_AUTH_TOKEN="change-me"
260266
curl -H "Authorization: Bearer change-me" http://127.0.0.1:8000/api/projects
261267
```
262268

263-
更多: [API README](pure_auto_codeql/api/README.md) · [SSE 参考](pure_auto_codeql/api/SSE_REFERENCE.md)
269+
更多: [API README](pure_auto_codeql/api/README.md) · [SSE 参考](pure_auto_codeql/api/SSE_REFERENCE.md) · [部署](docs/deployment.md)
264270

265271
---
266272

@@ -273,6 +279,7 @@ PureAutoCodeQL/
273279
│ ├── agents/ # CVE · Sink · Source · CodeQL 多智能体
274280
│ ├── application/ # CLI 与 API 共享工作流
275281
│ ├── api/ # FastAPI + SSE
282+
│ ├── platform/ · worker.py # PostgreSQL/Redis 持久化任务平台
276283
│ ├── cli/ · core/ · services/ · tools/
277284
│ ├── information/ · prompts/ · utils/
278285
│ ├── config/ # LLM 配置实现
@@ -310,6 +317,9 @@ from pure_auto_codeql.configuration import get_llm_config, LLMRole
310317
| [docs/cpp/CPP_TWO_STEP_BUILD_GUIDE.md](docs/cpp/CPP_TWO_STEP_BUILD_GUIDE.md) | C/C++ 建库 |
311318
| [docs/codeql_lsp_troubleshooting.md](docs/codeql_lsp_troubleshooting.md) | CodeQL LSP 排查 |
312319
| [docs/package_architecture.md](docs/package_architecture.md) | 包结构 |
320+
| [docs/deployment.md](docs/deployment.md) | Compose 与 Kubernetes 部署 |
321+
| [docs/language_capabilities.md](docs/language_capabilities.md) | 三语言能力矩阵 |
322+
| [docs/api_v1_migration.md](docs/api_v1_migration.md) | API v1 迁移 |
313323

314324
---
315325

@@ -318,6 +328,8 @@ from pure_auto_codeql.configuration import get_llm_config, LLMRole
318328
```bash
319329
uv run pytest -q
320330
uv lock --check
331+
uv run ruff check pure_auto_codeql test migrations
332+
uv run pyright
321333
uv run python -m compileall -q Analyze.py pure_auto_codeql
322334
```
323335

docs/api_v1_migration.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# API v1 migration
2+
3+
- 基础路径从 `/api` 改为 `/api/v1`;旧路径暂时兼容。
4+
- 创建响应新增 `run_id``effective_config``event_url`,初始状态为 `queued`
5+
- `completed` 拆为 `completed_with_findings``completed_no_findings`;另有
6+
`partial``cancelled``timed_out`
7+
- 结果改为结构化步骤、错误、manifest、Artifact 清单和精选路径。
8+
- 被关闭或不支持的步骤为 `skipped`
9+
- SSE 新增 `id:` 行和统一事件对象;重连传 `Last-Event-ID`
10+
- `requirement``max_rounds`、所有步骤开关、超时与恢复选项现在都会进入有效
11+
配置并改变实际执行。
12+
- 多副本部署必须配置 PostgreSQL 与 Redis,并独立启动 Worker。
13+
- `Analyze.py` 仍转发新 CLI,不在 v1 移除。

docs/codeql_breakpoint_detection_README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ python demo_breakpoint_detection.py
121121
1. 断点检测功能在查询结果为空时自动触发
122122
2. 分析结果会保存到`breakpoint_analysis.md`文件中
123123
3. 生成的`isAdditionalFlowStep`条件需要根据具体场景进行调整
124-
4. 系统支持多种编程语言,但目前主要针对Java和Python进行了优化
124+
4. Java、Python 与 C/C++ 均通过语言能力注册表选择模板、LSP、断流恢复和回退策略
125125

126126
## 贡献
127127

@@ -135,4 +135,4 @@ python demo_breakpoint_detection.py
135135

136136
## 许可证
137137

138-
本项目采用MIT许可证。详情请参阅LICENSE文件。
138+
本项目采用MIT许可证。详情请参阅LICENSE文件。

docs/deployment.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Deployment
2+
3+
## Docker Compose
4+
5+
```bash
6+
export API_AUTH_TOKEN='replace-with-a-long-random-token'
7+
docker compose up --build
8+
curl http://127.0.0.1:8000/health
9+
```
10+
11+
服务包括 API、Worker、PostgreSQL、Redis,以及 `--profile s3` 可启用的 MinIO。
12+
`migrate` 在 API/Worker 前执行 Alembic。PostgreSQL 是权威状态源;Redis 只承载
13+
至少一次任务投递和有保留上限的事件历史。
14+
`/health` 同时验证 PostgreSQL、Alembic 版本、Redis、consumer group 和活跃
15+
Worker 心跳;Worker 自身健康检查使用相同的迁移与队列消费者条件。
16+
17+
API/Worker 镜像以 UID 10001、只读根文件系统、`no-new-privileges`、全部
18+
capability 删除、PID/CPU/内存限制运行。CodeQL C/C++ Docker 构建默认禁网、
19+
非 root、只读根文件系统、只读源码挂载,并限制 PID、内存、CPU 和临时磁盘。
20+
情报获取如需网络,应作为独立受控阶段部署。
21+
22+
常用变量:
23+
24+
| 变量 | 说明 |
25+
| --- | --- |
26+
| `DATABASE_URL` | `postgresql+asyncpg://...` |
27+
| `REDIS_URL` | Redis Streams 地址 |
28+
| `API_AUTH_TOKEN` | 逗号分隔轮换 Token,或 `sha256:<hex>` |
29+
| `API_RATE_LIMIT_PER_MINUTE` | 单客户端每分钟请求上限 |
30+
| `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP HTTP Collector |
31+
32+
## Kubernetes 迁移
33+
34+
API 与 Worker 使用相同镜像、不同 command;API Deployment 可横向扩展,Worker
35+
按队列压力扩展。把 PostgreSQL、Redis 和 S3 替换为托管服务,使用同一环境变量
36+
契约。运行 `alembic upgrade head` 的 Job 必须先于新版本 rollout。Worker 的
37+
termination grace period 应大于进程组清理时间;任务租约到期后会由其他 Worker
38+
通过 `XAUTOCLAIM` 恢复。
39+
40+
ArtifactStore 的数据库记录只包含哈希、大小、媒体类型和定位信息。生产使用
41+
S3-compatible store,本地开发使用运行目录文件系统。
42+
43+
模板优化默认关闭;启用后只在 `temp/template_refinement_candidates/` 生成候选
44+
unified diff,不会修改生产提示模板。

docs/language_capabilities.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Language capability matrix
2+
3+
| 能力 | Java | Python | C/C++ |
4+
| --- | --- | --- | --- |
5+
| Source/Sink 定位 | 完整 | 完整 | 完整 |
6+
| Source→Sink 路径结构 | 完整 | 完整 | 完整 |
7+
| CodeQL 模块化 DataFlow API | 支持 | 支持 | 支持 |
8+
| LSP | CodeQL LSP | CodeQL LSP | CodeQL LSP |
9+
| 断流恢复 | 可配置 | 可配置 | 可配置 |
10+
| Source/Sink 回退 | 可配置 | 可配置 | 可配置 |
11+
| PR 真实黄金案例 | 路径穿越 | 命令注入 | 缓冲区问题 |
12+
13+
能力由 `pure_auto_codeql.services.language_capabilities` 注册。未知语言必须显式
14+
跳过或失败;不得返回伪成功空结果。Source/Sink 候选统一包含文件、行号、符号、
15+
证据、置信度和验证状态。文件不存在、行号或证据缺失时只能是 `unverified`

pyrightconfig.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"include": [
3+
"pure_auto_codeql/analysis_models.py",
4+
"pure_auto_codeql/analysis_schemas.py",
5+
"pure_auto_codeql/platform",
6+
"pure_auto_codeql/api/security.py",
7+
"pure_auto_codeql/api/durable_task_manager.py",
8+
"pure_auto_codeql/services/artifacts.py",
9+
"pure_auto_codeql/services/codeql_composition",
10+
"pure_auto_codeql/services/process_control.py",
11+
"pure_auto_codeql/worker.py"
12+
],
13+
"pythonVersion": "3.13",
14+
"typeCheckingMode": "basic"
15+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
name: pure-auto-codeql/golden-cpp
2+
version: 0.0.0
3+
dependencies:
4+
codeql/cpp-all: "*"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* @name Golden C buffer overflow
3+
* @description Environment-controlled data indexes a fixed-size buffer.
4+
* @kind path-problem
5+
* @problem.severity warning
6+
* @security-severity 9.8
7+
* @precision high
8+
* @id pure-auto-codeql/golden-cpp-buffer-overflow
9+
* @tags security external/cwe/cwe-120
10+
*/
11+
12+
import cpp
13+
import semmle.code.cpp.dataflow.new.DataFlow
14+
import semmle.code.cpp.dataflow.new.TaintTracking
15+
16+
module Config implements DataFlow::ConfigSig {
17+
predicate isSource(DataFlow::Node source) {
18+
source.asExpr().(FunctionCall).getTarget().hasGlobalName("atoi")
19+
}
20+
21+
predicate isSink(DataFlow::Node sink) {
22+
exists(ArrayExpr access |
23+
sink.asExpr() = access.getArrayOffset()
24+
)
25+
}
26+
}
27+
28+
module Flow = TaintTracking::Global<Config>;
29+
import Flow::PathGraph
30+
31+
from Flow::PathNode source, Flow::PathNode sink
32+
where Flow::flowPath(source, sink)
33+
select sink.getNode(), source, sink, "Environment-controlled index may access outside the buffer."

0 commit comments

Comments
 (0)