byevincent/ShareSift
GitHub: byevincent/ShareSift
ShareSift 是一款利用机器学习两阶段分类器在 SMB 共享中高效发现凭据与机密文件的安全评估工具,旨在替代 Snaffler 并大幅提升召回率。
Stars: 8 | Forks: 1
# ShareSift
[](https://github.com/byevincent/ShareSift/actions/workflows/test.yml)
[](pyproject.toml)
[](LICENSE)
ML 增强型 SMB 共享猎手。Snaffler 的继任者,采用两阶段分类器 pipeline。
ShareSift 根据文件包含凭据或机密的可能性,对 SMB 共享上的文件进行排名。阶段 1 在每个路径上运行 LightGBM 路径分类器。阶段 2 在标记的文件上运行 Qwen3 1.7B LoRA 内容分类器进行确认。可以单独运行阶段 1,也可以同时运行两个阶段。
## 为什么开发它
Snaffler 能捕获像 `id_rsa`、`NTDS.dit` 和 `.kdbx` 这样的明显模式。但它会漏掉长尾部分。共享上的自定义脚本、不寻常文件名中的机密,以及具有非传统名称的密码目录,都会成为漏网之鱼。
ShareSift 在此基础上增加了一层 ML。在 Snaffler 盲测基准测试中,该路径分类器在召回率上比 Snaffler 高出 29.3 个百分点。而内容分类器在参数量仅为四分之一的情况下,几乎弥合了与 Biringa 和 Kul 2025 之间的差距。
## 性能
### 在真实企业共享内容上的正面对比
v0.51 发布了一个包含 2525 个文件的 Windows NTFS 语料库,该语料库通过 Stauffer 的
[DiskForge](https://github.com/jknyght9/diskforge) 构建 — 涵盖 16 个类别的 75
个具有合成性但格式真实的凭据文件,
并与 2420 个企业共享干扰文件(HR 政策、财务
报告、营销资产、供应商 PDF、软件安装介质、
日志归档、项目源代码、公共模板)+ 20 个精度
压力测试文件名(`password_policy.docx`、`secrets_management_guidelines.pdf`
等)+ 30 个 windows10 OS 模板存根混合在一起。
相同的路径,相同的真实标记,两套 pipeline 并行测试:
| 工具 | 保留策略 | P | R | F1 | 捕获 | 漏报 | FPs |
|---|---|---:|---:|---:|---:|---:|---:|
| 上游 Snaffler | Yellow+ | 0.800 | 0.213 | 0.337 | 16 | 59 | 4 |
| 上游 Snaffler | Red+ | 0.800 | 0.213 | 0.337 | 16 | 59 | 4 |
| **ShareSift v0.51** | Yellow+ | 0.158 | **0.840** | 0.266 | 63 | 12 | 336 |
| **ShareSift v0.51** | **Red+** | **0.466** | **0.720** | **0.565** | **54** | **21** | **62** |
| ShareSift v0.51 | Black-only | 0.833 | 0.333 | 0.476 | 25 | 50 | 5 |
**在 Red+ 级别 —— 即操作员分拣策略:** ShareSift 捕获的
**凭据比 Snaffler 多 3.4 倍**(75 个中的 54 个对比 16 个),
**F1 为 0.565 对比 0.337**。
权衡是真实存在的:ShareSift 会出现更多的误报
(62 对比 4),因为路径分类器在 Yellow 层级对
二进制扩展名干扰文件(`.msi` / `.iso` / `.psd`)的处理非常激进。如果你只
想要确定的发现,请运行 Black-only —— 精确率会上升
到 0.833。如果你不想让 59 个真实的凭据被默默漏掉,
请运行 Red+。选择权在你手中。
完整的分类别细分(16 个类别中有哪 12 个达到了 100%
的阶段 1 召回率,哪 4 个需要内容扫描或 v0.52 规则)
位于 [docs/diskforge_winshare_v1_results.md](docs/diskforge_winshare_v1_results.md)。
### 严格召回率基准测试
| 基准测试 | 指标 | ShareSift v0.51 |
|---|---|---:|
| Metasploitable 3 (Windows AD, 40 creds) | Recall | **100% (40/40)** |
| Metasploitable 2 (Linux server, 34 creds) | Recall | **100% (34/34)** |
| DiskForge Win10 forensic (13 plants) | Recall | **100% (13/13)** |
| Linux rule-blind (500 paths, Snaffler-rule-exclusion benchmark) | F1 | **0.944** |
| Snaffler-blind Windows (500 LLM-labeled paths) | P | **0.984** |
| Snaffler-issues operator-grounded | Pass | **31/31 closed** + 7/10 open |
### 纪律轨迹
ShareSift 采用纪律诚实的研究周期:在编写规则以修复前一个测试集的失败之前,先锁定下一个测试集。截至 v0.51 经历了四代:
| 代数 | 来源 PRs | 规则前基线 | 规则后 | 闭环于 |
|---|---|---:|---:|---|
| v1 | #78 Cisco, #135 FileZilla, #67 ADO | 36% | **100%** | v0.49 |
| v2 | #198 CMD-set, #155 Azure CLI, #98 cred-filename, Chrome/Edge | 50% | **100%** | v0.49 |
| v3 | #154 -password, #140 Kerberos, #139 MDE, #112 SCCM | 90%¹ | **100%** | v0.50 |
| v4 | OPEN PRs #192 PPK, #186 SCCM-broad | **60%²** | 70% | (locked at v0.50) |
¹ v3 基线为 90% 反映了 pysnaffler 捆绑了来自 PRs #140 和 #112 的上游规则(两者均已合并)。这不是严格的泛化测试。
² v4 使用的是 pysnaffler 未捆绑的 OPEN PRs。从 60% 到 70% 的规则后提升来自于 SCCMContentLib$ 规则(根据 v3 锁定的 PR #112 编写),它捕获了 PR #186 的注册表导出探测,而该规则从未针对此进行编写 —— 这是一个真实的泛化信号。
有关完整的纪律周期说明,请参阅 [docs/methodology.md](docs/methodology.md),有关包含原始计数和诚实来源细分的 12 项基准测试完整评分卡,请参阅 [docs/v0p50_benchmark_sweep.md](docs/v0p50_benchmark_sweep.md)。
## 安装
**快速安装** — 在 Kali 上放置一个二进制文件(无需 `git clone`,无需 `uv` 设置,无需 Python):
```
# 真正的单文件 binary — Stage 1 path classifier + rules + tier engine
# + Snaffler-TSV + engagement DB + sort + query + export。约 77 MB,零
# Python 先决条件。从 v0.46 版本起可用。
wget https://github.com/byevincent/ShareSift/releases/latest/download/sharesift
chmod +x sharesift
./sharesift --version
```
或者通过 pipx(需要 Python 3.10+):
```
pipx install 'sharesift[smb]' # SMB-direct workflow
pipx install sharesift # Stage 1 only
```
**从源码完整安装** — 如果你想进行开发、训练或运行内容分类器:
```
# 最新 milestone 版本(推荐)
git clone --branch v0.51.0 https://github.com/byevincent/ShareSift.git
# 或者跟踪 main 分支以获取未发布的工作
git clone https://github.com/byevincent/ShareSift.git
cd ShareSift
# 仅 Stage 1(path classifier,约 100MB)
uv sync
# 两个阶段(额外增加约 3GB 的 torch 和 transformers)
uv sync --group content-inference
# 直接支持 SMB(无需挂载)— 添加 smbprotocol + pyspnego
uv sync --extra smb
```
添加 `--group content-training` 以进行 LoRA fine-tuning。这将额外拉取 5GB 数据。
里程碑版本:[v0.51.0](https://github.com/byevincent/ShareSift/releases/tag/v0.51.0)(当前 — 通过 DiskForge 进行真实企业共享基准测试:在 Red+ 级别 F1 为 0.565 对比 Snaffler 的 0.337),[v0.50.0](https://github.com/byevincent/ShareSift/releases/tag/v0.50.0)(预留的 v3 达到 100%,v4 达到 70% 基线 + SCCMContentLib$ 泛化),[v0.49.0](https://github.com/byevincent/ShareSift/releases/tag/v0.49.0)(预留的 v1 达到 100%,v2 达到 100%,v3 达到 90% + POSIX FileName bugfix),[v0.48.0](https://github.com/byevincent/ShareSift/releases/tag/v0.48.0)(预留的 v1 从 36% 提升至 91%,v2 从 70% 提升),[v0.47.0](https://github.com/byevincent/ShareSift/releases/tag/v0.47.0)(Snaffler-issues 基准测试 + MSF2 recall 为 1.000),[v0.46.0](https://github.com/byevincent/ShareSift/releases/tag/v0.46.0)(77MB 单文件二进制 + DB 导出器),[v0.45.0](https://github.com/byevincent/ShareSift/releases/tag/v0.45.0)(top-K precision 从 0.20 提升至 0.70),[v0.43.0](https://github.com/byevincent/ShareSift/releases/tag/v0.43.0)(Linux 规则漏洞填补),[v0.41.0](https://github.com/byevincent/ShareSift/releases/tag/v0.41.0)(接合数据存储)。中间标签作为预发布版显示在[发布页面](https://github.com/byevincent/ShareSift/releases)上。
## 快速开始
### 远程 SMB 共享(无需挂载,v0.35+)
将 ShareSift 指向一个 UNC 路径并提供凭据,它将直接通过 SMB2/3 遍历共享。认证标志遵循 netexec 惯例(`-u/-p/-H/-k/-d`)。
```
# 密码认证
uv run sharesift //10.10.10.5/Finance$ -u user -p pass
# Pass-the-hash(NT hash 或 LM:NT)
uv run sharesift //10.10.10.5/Finance$ -u CORP/user -H 'aad3b435b51404eeaad3b435b51404ee:27c4...'
# Kerberos(从 KRB5CCNAME 读取 ticket)
uv run sharesift //dc01.corp.local/SYSVOL$ -u alice -k --use-kcache
# 匿名 / null session
uv run sharesift //10.10.10.5/Public --no-pass
# Pre-flight:在开始长时间 walk 之前确认凭据有效
uv run sharesift //10.10.10.5/Finance$ -u user -p pass --check
```
输出默认存放在 `./sharesift--/` 中(使用 `--output-dir` 覆盖)。完整的一站式 pipeline 运行(枚举 → 分拣 → 内容扫描 → 验证 → HTML 报告)使用实时 SMB 会话进行内容读取 — 无需本地挂载。
### 本地 / 已挂载的共享
```
uv run sharesift /mnt/downloaded_share
# 或者跳过实时验证 + 报告,只获取分类后的命中结果:
uv run sharesift /mnt/downloaded_share \
--skip-verify --skip-report
# 显式 subcommand 形式(legacy v0.18 flag set,仍受支持):
uv run sharesift scan --share /mnt/downloaded_share --output-dir ./scan-out
```
中间结果存放在 `--output-dir` 中:
```
scan-out/
├── files.txt # enumerated paths
├── paths.jsonl # stage 1 scores
├── hits.jsonl # stage 1+2 results
├── verified.jsonl # live credential checks
└── report.html # interactive HTML report
```
添加 `--json` 可在 stderr 获取结构化的运行结束摘要(对 CI 很有用)。添加 `-q` / `--quiet` 可静音进度,或添加 `-v` / `--verbose` 获取 debug 详情。
当你需要更精细的控制时,可以使用下面的各个子命令单独运行每个阶段。
### 从共享枚举中对路径进行评分
将枚举工具的输出直接通过管道传输给 ShareSift。
```
manspider --target \\fileserver -d corp.local | \
uv run sharesift score-paths --stdin
# 或者从文件
uv run sharesift score-paths \
--input enumerated_paths.txt \
--output scored.jsonl
```
输出是包含路径、概率和层级(Black、Red、Yellow 或 null)的 JSONL。
```
{"path": "\\\\fileserver\\Finance\\backups\\creds.kdbx", "probability": 0.987, "tier": "Black"}
{"path": "\\\\fileserver\\Dev\\notes.txt", "probability": 0.523, "tier": "Yellow"}
{"path": "\\\\fileserver\\Marketing\\Q4.pdf", "probability": 0.012, "tier": null}
```
首先处理 Black,然后是 Red,最后是 Yellow。使用 `jq` 进行排序和过滤。
### 使用两个阶段扫描文件
```
find ./downloaded_share -type f | \
uv run sharesift scan-files --stdin \
--output deep_scan.jsonl
```
阶段 2 为每条记录添加 `content_check` 和 `content_excerpt`。
```
{"path": "./downloaded_share/Dev/notes.txt", "path_probability": 0.52, "path_tier": "Yellow", "content_check": "yes", "content_excerpt": "API_KEY = 'sk_live_...'"}
```
阶段 2 仅在标记为特定层级的路径上运行。使用 `--force-content` 覆盖此行为。在 CPU 上,每个文件需要 5 到 8 秒。在 CUDA 上运行大约需要 150ms。
## 架构
两阶段 pipeline。每个阶段独立运行。
```
┌─────────────────────────────────────────┐
│ Stage 1 router (by path shape) │
│ │
│ UNC path → Windows model │
path list → │ Unix path → Linux model │ → (probability, tier)
│ │
│ LightGBM + char n-grams + │
│ 8 hand features, calibrated │
│ probability, per-model tier band │
└─────────────────────────────────────────┘
│
(tier flagged subset)
↓
┌──────────────────────────┐
│ Stage 2: Qwen3-1.7B LoRA │ → (yes / no on secret presence)
│ via transformers + PEFT │
│ 4-bit base on CUDA │
│ bf16 on CPU │
└──────────────────────────┘
```
阶段 1 基于 11,190 条 Windows 和 1,685 条 Linux 记录进行训练。它在不到一毫秒的时间内对每个路径进行评分。根据你的硬件配置,阶段 2 的体积在 1.5 到 3.4GB 之间。
完整设计详见 [docs/architecture.md](docs/architecture.md) 和 [docs/build_plan.md](docs/build_plan.md)。
## pysnaffler 集成
`ShareSiftPathRule` 是一个 `SnaffleRule` 子类,它将路径分类器插入到 pysnaffler 的 SMB 枚举循环中。
```
uv sync --group pysnaffler-integration
```
```
from sharesift.pysnaffler_run import build_ruleset
from pysnaffler.snaffler import pySnaffler
# 仅 ML:ShareSift 替换 Snaffler 的 rule pack
ruleset = build_ruleset()
# 混合:Snaffler 默认加上 ShareSift
ruleset = build_ruleset(include_defaults=True)
snaffler = pySnaffler(ruleset=ruleset, dry_run=True)
```
## 限制
未根据真实的接合测试发现进行验证。ShareSift 的标签来自公共语料库数据上的 Claude 规则和 Codex 审计 pipeline。这是有用的信号,但它与内部接合级别的 ground truth 属于不同类别。
校准在分布中保持有效。层级带精确率契约在与训练来源相同的数据上是可靠的。在分布外数据上,Windows 模型的 ECE 从 0.007 上升到 0.30。在扫描真实的 SMB 共享时,请将层级分配视为分拣排序,而不是概率契约。
跨来源的泛化能力比标题数字所暗示的要弱。当你在 Stack Exchange 上进行训练并在 GitHub Code Search 上进行测试时,Windows 的 PR AUC 会从 0.97 下降到 0.76。真实的 SMB 共享是第三种分布,训练和评估都没有涵盖。
内容分类器比 Biringa 和 Kul 2025 低 13 个 F1 点。差距源于模型大小。Mistral 7B 比 Qwen3 1.7B 大四倍,而 ShareSift 的目标是 RTX 4070 部署。
罕见的凭据类别训练不足。私钥、SSH 凭据、云凭据和 IAC 各自的训练记录都不超过三条。这些类别上的召回率很弱。
没有 AVX 512 的 CPU 运行缓慢。在 Ryzen 5 3600 上的基准测试为每个 5 到 8 秒。
完整的审计历史记录请参见 [docs/audit_2026-05-31.md](docs/audit_2026-05-31.md) 和 [docs/audit_2026-05-30.md](docs/audit_2026-05-30.md)。
## 项目布局
```
src/sharesift/ runtime package
path.py PathClassifier router (Windows and Linux models)
content.py content classifier wrapper
tier.py probability to tier band
features.py char n-gram and hand features
prompt.py content classifier chat template formatter
pysnaffler_rule.py SnaffleRule plugin
pysnaffler_run.py build_ruleset() helper
cli.py score-paths and scan-files entry point
src/eval/ training and evaluation scripts
tools/ training, dataset builders, audit tools
docs/ engineering log and architecture docs
models/ trained model weights
```
## 许可证
Apache 2.0。有关 GPLv3 组件(内置的 Snaffler 规则集和 pysnaffler)的信息,请参见 [NOTICE](NOTICE)。
## 贡献
这是一个活跃的个人项目。请在 [docs/build_plan.md](docs/build_plan.md) 和 [docs/journal.md](docs/journal.md) 中跟踪主要设计决策。在发送 PR 之前请先提一个 issue。
标签:Apex, DLL 劫持, LightGBM, SamuraiWTF, SMB, 凭据扫描, 凭证收集, 大语言模型, 安全助手, 机器学习, 系统调用监控, 逆向工具, 错误配置检测