MisakuraRinn/OneSavieBastet_FINAL

GitHub: MisakuraRinn/OneSavieBastet_FINAL

该项目是一条面向智能合约审计 Kaggle 竞赛的可复现 pipeline,通过映射公开审计 findings 并结合 DeepSeek 模型审查来生成高精度竞赛提交。

Stars: 0 | Forks: 0

# OneSavie Bastet Pipeline 用于 OneSavie Bastet Kaggle 竞赛的离线审计 pipeline。 当前的高价值路径会将测试代码库映射回其公开审计竞赛,导入被评为 High 和 Medium 的 findings,使用 DeepSeek 进行分类法分类,并构建一个精度优先的 400 行提交。有关最新得分、构建产物、确切命令和后续工作,请参阅 [`docs/STATUS.md`](docs/STATUS.md)。长期实验记录在 [`docs/ROADMAP.md`](docs/ROADMAP.md) 中。 静态扫描器仍作为补充路径提供: 1. 解压公开的 Kaggle 压缩包, 2. 扫描每个 Solidity 代码库以寻找有证据支持的候选项, 3. 可选地将候选项导出到 API 模型进行二审, 4. 在本地对验证预测进行评分, 5. 组装一份严格匹配 `sample_submission.csv` 的 400 行 CSV。 该基线仅需 Python 3.12 即可运行。Slither、Mythril、sentence-transformers 和 API 模型是可选的扩展层。 ## 公开仓库范围 本仓库包含 pipeline 源码、测试、文档,以及位于 `reproduction/v2/` 下的经过净化处理的冻结 V2 排名。冻结的排名仅包含重现历史提交所需的字段;原始 API 元数据和 prompt 已被移除。本仓库不发布 Kaggle 竞赛文件、下载的 Solidity 代码库、模型缓存、原始 API 响应、完整的生成的 finding 语料库或生成的提交 CSV。这些构建产物保留在被忽略的 `data/` 和 `work/` 目录中。 切勿提交 Kaggle 或 DeepSeek 凭证。以下命令会将凭证存储在仓库外部,或仅将其保留在当前进程中。 ## 从全新克隆重现 ### 完全冻结 V2 重现 此路径不需要 Kaggle 数据或 API key。它从已发布的冻结排名中确定性地组装出历史提交: ``` git clone https://github.com/MisakuraRinn/OneSavieBastet_FINAL.git cd OneSavieBastet_FINAL python3 -m venv .venv .venv/bin/python -m pip install -e . .venv/bin/python -m bastet submit \ --sample reproduction/v2/submission_schema.csv \ --reviews reproduction/v2/public_finding_ranked.jsonl \ --out reproduction/v2/submission_v2_public.csv \ --target-rows 400 \ --min-confidence 0 \ --per-repo-cap 100 (cd reproduction/v2 && sha256sum --check SHA256SUMS) ``` 预期结果: ``` public_finding_ranked.jsonl: OK submission_schema.csv: OK submission_v2_public.csv: OK ``` ### 完整 Pipeline 重生成 完整路径会根据竞赛数据、公开审计报告和新的模型审查重新创建冻结排名。由于模型输出和外部报告可能会发生变化,它可以重现 pipeline,但不保证能够逐字节重现历史提交。 前置条件: - Python 3.12 - `onesavie-bastet` Kaggle 竞赛已接受的规则 - Kaggle API token - 用于分类法审查阶段的 DeepSeek API key 克隆并创建一个隔离的环境: ``` git clone https://github.com/MisakuraRinn/OneSavieBastet_FINAL.git cd OneSavieBastet_FINAL python3 -m venv .venv .venv/bin/python -m pip install --upgrade pip .venv/bin/python -m pip install -e '.[data]' .venv/bin/python -m unittest discover -s tests -v ``` 下载竞赛 CSV 文件和关联的训练/测试源码压缩包: ``` .venv/bin/python -m bastet download --login --out-dir data/raw .venv/bin/python -m bastet unpack \ --raw-dir data/raw \ --out-dir data/extracted .venv/bin/python -m bastet fetch-sources --split train .venv/bin/python -m bastet fetch-sources --split test ``` 恢复针对训练和测试代码库的已评判的 Code4rena findings,使训练 findings 与竞赛的分类法对齐,并构建测试 prompt: ``` .venv/bin/python -m bastet public-findings \ --root data/extracted/train \ --out work/train_code4rena_findings.jsonl .venv/bin/python -m bastet public-findings \ --root data/extracted/test \ --out work/code4rena_findings.jsonl .venv/bin/python -m bastet label-findings \ --findings work/train_code4rena_findings.jsonl \ --labels data/raw/train.csv \ --out work/labeled_public_findings.jsonl .venv/bin/python -m bastet finding-prompts \ --findings work/code4rena_findings.jsonl \ --labeled-findings work/labeled_public_findings.jsonl \ --labels data/raw/train.csv \ --out work/public_finding_prompts.jsonl ``` 配置模型 key 并创建分类法审查: ``` .venv/bin/python -m bastet configure-deepseek .venv/bin/python -m bastet api-review \ --prompts work/public_finding_prompts.jsonl \ --out work/public_finding_reviews.jsonl \ --model deepseek-v4-flash \ --workers 8 ``` API 审查是可恢复的,但不保证每次运行之间的模型输出完全相同。在输入的 finding、审查、分类法和源代码树固定的情况下,以下排名、组装和验证阶段是确定性的。 构建兼容 V2 的提交: ``` .venv/bin/python -m bastet rank-findings \ --findings work/code4rena_findings.jsonl \ --reviews work/public_finding_reviews.jsonl \ --labels data/raw/train.csv \ --root data/extracted/test \ --ranking-profile v2 \ --out work/public_finding_ranked.jsonl .venv/bin/python -m bastet submit \ --sample data/raw/submission_example.csv \ --reviews work/public_finding_ranked.jsonl \ --out work/submission_v2_public.csv \ --target-rows 400 \ --min-confidence 0 \ --per-repo-cap 100 .venv/bin/python -m bastet validate-submit \ --submission work/submission_v2_public.csv \ --sample data/raw/submission_example.csv \ --test data/raw/test.csv \ --target-rows 400 ``` 对于冻结的历史 V2 输入,最终文件与排行榜提交在字节上是完全一致的: ``` printf '%s %s\n' \ '9e101bef44831f9ee53c7551fb750ea407d4941c05ba189f1ffd36fc2c30b4de' \ 'work/submission_v2_public.csv' | sha256sum --check ``` ## 当前提交 `work/submission_v2_public.csv` 是当前的排行榜基线,得分为 `323.27423`。更广泛的 v4 覆盖实验得分为 `200.87413`,因此 v5 路径保留了完全相同的 v2 候选项标识,仅重新校准了分类法和描述。核心的 Code4rena 生成流程为: ``` .venv/bin/python -m bastet rank-findings \ --findings work/code4rena_findings.jsonl \ --reviews work/public_finding_reviews.jsonl \ --labels data/raw/train.csv \ --root data/extracted/test \ --ranking-profile v2 \ --out work/public_finding_ranked.jsonl .venv/bin/python -m bastet submit \ --sample data/raw/submission_example.csv \ --reviews work/public_finding_ranked.jsonl \ --out work/submission_v2_public.csv \ --target-rows 400 \ --min-confidence 0 \ --per-repo-cap 100 .venv/bin/python -m bastet validate-submit \ --submission work/submission_v2_public.csv \ --sample data/raw/submission_example.csv \ --test data/raw/test.csv \ --target-rows 400 ``` 重现的 V2 CSV 的预期 SHA-256 为 `9e101bef44831f9ee53c7551fb750ea407d4941c05ba189f1ffd36fc2c30b4de`。 `v2` 排序配置文件冻结了原始评分行为;默认的 `enhanced` 配置文件包含了后来基于标识符的证据,并特意产生了不同的行顺序。 当前的 v5 候选项是通过替换这同样 400 个候选项标识中的字段生成的: ``` .venv/bin/python -m bastet recalibrate-submission \ --baseline work/submission_v2_public.csv \ --findings work/code4rena_findings.jsonl \ --identity-reviews work/public_finding_ranked.jsonl \ --reviews work/test_public_bge_ranked.jsonl \ --out work/submission_v5_bge_single_label.csv \ --description-style review \ --tag-style original \ --subtag-style original ``` 使用以下命令获取 Sherlock 评判摘要: ``` .venv/bin/python -m bastet public-findings \ --source sherlock \ --root data/extracted/test \ --out work/sherlock_findings.jsonl ``` ## 布局 推荐的本地布局: ``` data/ raw/ train.zip test.zip sample_submission.csv extracted/ work/ candidates.jsonl prompts.jsonl reviews.jsonl submission.csv ``` ## 命令 安装数据下载依赖: ``` python3 -m venv .venv .venv/bin/pip install '.[data]' ``` 在 Kaggle 上接受竞赛规则,然后在 `https://www.kaggle.com/settings/api` 创建一个 token,接着下载数据。`--login` 会在不显示 token 的情况下进行提示,并仅将其保留在当前进程中: ``` .venv/bin/python -m bastet download --login --out-dir data/raw ``` 如果 Kaggle 提供的是 zip 压缩包,请解压它们: ``` python3 -m bastet unpack --raw-dir data/raw --out-dir data/extracted ``` 代码库压缩包是从竞赛的 Data Description 中链接的,而不是与 Kaggle CSV 下载打包在一起的。为了避免下载媒体和 Git 历史记录,请使用范围下载(range-download)仅获取 Solidity、Markdown 和构建配置文件: ``` .venv/bin/python -m bastet fetch-sources --split test .venv/bin/python -m bastet fetch-sources --split train ``` 扫描代码库并写入静态候选项: ``` python3 -m bastet scan --root data/extracted/test --out work/candidates.jsonl --facts-dir work/facts ``` 在消耗 API token 之前选择一个多样化的子集: ``` python3 -m bastet select \ --candidates work/candidates.jsonl \ --out work/selected_candidates.jsonl \ --per-repo-cap 6 \ --per-rule-cap 2 ``` 为每个选定的候选项导出一个 prompt 以供模型审查: ``` python3 -m bastet prompts \ --candidates work/selected_candidates.jsonl \ --root data/extracted/test \ --train-labels data/raw/train.csv \ --out work/prompts.jsonl ``` 将 DeepSeek key 存储在仓库外部。输入是隐藏的: ``` .venv/bin/python -m bastet configure-deepseek ``` 首次处理使用 Flash thinking 模式。输出采用仅追加模式,并通过 `candidate_id` 恢复,因此可以重新启动被中断的运行: ``` .venv/bin/python -m bastet api-review \ --prompts work/prompts.jsonl \ --out work/flash_reviews.jsonl \ --model deepseek-v4-flash \ --workers 8 ``` 过滤出 Flash 有效的候选项并使用 Pro 进行确认: ``` .venv/bin/python -m bastet filter-prompts \ --prompts work/prompts.jsonl \ --reviews work/flash_reviews.jsonl \ --out work/pro_prompts.jsonl .venv/bin/python -m bastet api-review \ --prompts work/pro_prompts.jsonl \ --out work/pro_reviews.jsonl \ --model deepseek-v4-pro \ --workers 4 ``` 在进行完整运行之前,使用 `--limit 5` 进行低成本的连通性和输出格式测试。 创建一个离线启发式审查文件作为首次提交的基线: ``` python3 -m bastet local-review --candidates work/candidates.jsonl --out work/reviews.jsonl --min-confidence 0.72 ``` 构建 Kaggle CSV: ``` python3 -m bastet submit \ --sample data/raw/submission_example.csv \ --reviews work/pro_reviews.jsonl \ --candidates work/selected_candidates.jsonl \ --out work/submission.csv \ --target-rows 400 \ --per-repo-cap 6 python3 -m bastet validate-submit \ --submission work/submission.csv \ --sample data/raw/submission_example.csv \ --test data/raw/test.csv ``` 运行简单的端到端基线: ``` python3 -m bastet run-baseline \ --root data/extracted/test \ --sample data/raw/sample_submission.csv \ --out-dir work ``` 根据训练标签对验证预测进行评分: ``` python3 -m bastet score --truth data/train_labels.csv --pred work/reviews.jsonl --out work/score.json ``` 评分器是一个近似值。如果 `sentence-transformers` 和本地/缓存的 BGE 模型可用,请传入 `--semantic-model BAAI/bge-large-en-v1.5`;否则它将回退到 token 余弦相似度。 安装可选的 embedding 工具以进行语义对齐和校准: ``` .venv/bin/pip install '.[embeddings]' ``` Embedding 模型和缓存属于 `work/` 目录,且不应被提交。 ## 密钥 切勿将真实的 API key 放入此仓库、notebook、prompt 或已提交的 `.env` 文件中。`configure-deepseek` 会将 key 写入 `~/.config/onesavie-bastet/secrets.json`,权限模式为 `600`。环境变量会覆盖该文件。对于单次会话设置: ``` read -rsp "DeepSeek API key: " DEEPSEEK_API_KEY export DEEPSEEK_API_KEY echo ``` 对于反复的本地使用,请将 key 保留在密码管理器或用户专属文件(例如 `~/.config/onesavie-bastet/secrets.env`)中,置于仓库外部,将其权限模式设置为 `600`,并在运行审查命令之前将其 source。 ## 审查 JSONL 提交构建器接受原始候选项或已审查的候选项。已审查的记录应包含: ``` { "is_valid": true, "repo_path": "repo-name", "tag": "access_control", "subtag": "missing-auth", "severity": "high", "description": "External withdraw can be called by any account...", "confidence": 0.84, "evidence": {"file": "src/Vault.sol", "line": 42} } ``` 低置信度行、无效审查、重复项以及没有可用描述的候选项会在组装 CSV 之前被过滤掉。
标签:DLL 劫持, Web3安全, 大语言模型, 智能合约审计, 机器学习竞赛, 自动化流水线, 逆向工具, 静态代码扫描