GitHub推荐:14 年 20.6k stars:一个渗透测试员的 OSINT 神器怎么变成行业事实标准
一句话总结
SpiderFoot 是一款 14 年磨出来的开源 OSINT 自动化框架,用 234 个模块 + YAML 关联引擎,让渗透测试员从一个 seed target 递归扩散出公网一切可见指纹——「事件流 + 关联分析」的可本地化替代品。
值得关注的理由
- 教科书级的「单作者 14 年」OSS 样本:3742 commits、Top 1 作者占比 59.7%、2020-08 单月 679 commits 完成 v4.0 重写,是观察「个人开源如何走向商业化(Intel 471)」与「重写如何摧毁生态」的最佳活教材。
- 架构设计的四个迁移可复用资产:声明式 pub/sub 事件总线、YAML 关联 DSL、SQLite + WAL + 自管 RLock 零依赖数据栈、共享线程池 + per-task 队列限流——任何「插件型分析/扫描框架」都能照搬。
- OSINT 自动化赛道开源事实标准:商业竞品 Maltego / SpiderFoot HX / OSINT Industries 三足鼎立,开源侧 SpiderFoot 一家独大,theHarvester/recon-ng 早已被它甩开身位。
项目展示
⚠️ 重要提示:SpiderFoot 原
spiderfoot.net域名已 301 重定向到intel471.com(母公司商业版「SpiderFoot HX」),README 中所有 hero 截图与官方文档链接均失效。本节用文字 + 架构示意替代。
运行时架构(基于 Phase 3 代码解读)
┌─────────────────────────────────────────────────────────┐
│ 入口层 sf.py (CLI+CherryPy) / sfcli.py (REPL) / sfwebui.py (Web) │
├─────────────────────────────────────────────────────────┤
│ 调度层 sfscan.py (事件循环 + 优先级排序) │
│ SpiderFootPlugin.notifyListeners() (同步分发) │
├─────────────────────────────────────────────────────────┤
│ 模块层 modules/sfp_*.py (234 个) │
│ 声明式契约: watchedEvents() / producedEvents() │
├─────────────────────────────────────────────────────────┤
│ 数据层 db.py (SQLite + WAL + RLock) │
│ event.py (setter 校验 0-100) │
│ threadpool.py (共享 + per-taskName 队列) │
├─────────────────────────────────────────────────────────┤
│ 后置分析 spiderfoot/correlation.py (YAML DSL + 5 算法) │
│ correlations/*.yaml (37 条预置规则) │
└─────────────────────────────────────────────────────────┘
核心运行流程(一个 seed target → 100+ 实体)
- 注入 ROOT 事件(IP/域名/邮箱/人名/BTC 地址等)到
eventQueue - 按
_priority排序的模块逐个检查watchedEvents(),匹配则触发handleEvent() - 模块产出新事件 → 通过
notifyListeners()同步分发给所有 watcher - sourceEvent 反向回溯 + 同 type 同 data 抑制(避免指数级 fan-out)
- scan FINISHED 后调用
run_correlations(),YAML 规则全表扫一遍事件库,输出 headline + 关联 event 链
视频/截图:SpiderFoot 的 asciinema demo 提供了 15 个 CLI 演示,但本环境无法嵌入。
项目画像
| 维度 | 数据 |
|---|---|
| GitHub | https://github.com/smicallef/spiderfoot |
| Star / Fork | 20,645 / 3,313 |
| 代码行数 | 63,734(Python 96.4% / YAML 1.6% / JS 1.2% / CSS 0.5%) |
| 项目年龄 | 171.7 个月(14.3 年) |
| 开发阶段 | 已放弃(master 最后 commit 2023-11-06;近 365 天 0 commit) |
| 贡献模式 | 单作者主导 + 核心小团队(Top 1 占 59.7%,Top 3 占 ~91%) |
| 热度定位 | 大众热门(OSINT 自动化赛道开源事实标准) |
| 质量评级 | 代码 良好 / 文档 良好 / 测试 基本(CI 仅跑 unit) |
作者视角:为什么存在这个项目
创始人/作者背景
Steve Micallef(smicallef),2012 年之前是澳大利亚的渗透测试从业者。GitHub 账号年龄 14.3 年,与 SpiderFoot 同步创建;公开仓库仅 2 个(另一个 awesome-osint 是 fork),SpiderFoot 是他唯一活跃原创项目。2021 年被 Intel 471(OSINT SaaS 龙头)收购加入团队,运营商业版「SpiderFoot HX」,spiderfoot.net 域名 301 重定向到 intel471.com——这是经典 open-core 分层。
问题判断
OSINT(开源情报)行业 2012 年正是 SaaS OSINT 平台(Recorded Future、Maltego 商业版)形成寡头的时点。开源领域长期空白,recon-ng 这时还没出现(2014 年才出)。Micallef 看到的痛点是:
- 手工重复劳动:每次渗透测试都要「对每个 target 枚举 EVERYTHING」(子域、whois、证书、泄露、威胁情报关联、地理分布、技术栈、人员关联),手动整合耗时占报告 60% 时间。
- 没有「自动化关联」:recon-ng / theHarvester 都能采集,但找到的数据太多而无法自动聚合成结论,分析师还要回到 Excel/grep 二次加工。
- 没有「可本地化 + 可 CI 化」:Maltego 是商业桌面端,无法脚本化集成进红队流水线;SaaS 平台是黑盒且对单项枚举不开放 API。
解法哲学
- Unix 哲学 + 大而全的反向组合:对外 monolithic(单仓库单部署),对内 modular(234 个文件级小工具)。新增模块只需声明
watchedEvents/producedEvents,零接入成本。 - 本地优先 + 数据自有:默认 127.0.0.1:5001(sf.py:47),默认 TOR 集成(
sfscan.py:149socks5h),所有数据落盘 SQLite 而不是流向 SaaS——欧洲/澳洲从业者对 EU 数据保护合规的本能反应。 - 性能换可移植:SQLite 强制开启
PRAGMA journal_mode=WAL(db.py:39),threading.RLock()自管并发——多 reader/concurrent writer 优先于吞吐,对 OSINT 场景恰好正确(一次扫描几天到几周,单次写 TPS 低但量大)。 - 主动选择不做的:不做分布式(worker/queue)、不做实时 dashboard(每次扫描独立 runtime)、不做 in-memory graph DB(事件流存 SQLite + 启动时重建 networkx 图)——这些都让位给商业版 SpiderFoot HX。
战略意图
这是产品本身而非基础设施,Intel 471 收购的就是这个产品的核心团队。商业化策略是经典 open-core:
- 开源版(当前 SpiderFoot OSS):自带
sf.py+sfwebui.py,单用户自托管 - 商业版(SpiderFoot HX):100% 云托管、Attack Surface Monitoring、change notifications、multi-user、authenticated、内部 REST API、splunk/elastic 导出、截图、custom module 等 OSS 没有的能力
关键洞察:商业版不是替代开源版,而是「运维/规模/集成/合规」层。开源版仍是有 200+ 模块的核心能力入口——这种 open-core 让社区可以继续贡献模块(bcoles/krishnasism 等),同时商业版在大客户身上收钱。
核心价值提炼
创新之处
| # | 创新点 | 新颖度 | 实用性 | 可迁移性 |
|---|---|---|---|---|
| 1 | 声明式 pub/sub 事件总线——watchedEvents() / producedEvents() + 共享 eventQueue + notifyListeners() 同步分发 + _priority 排序(sfscan.py:369 OrderedDict(sorted(...)))。234 个模块零互相 import。 | 4/5 | 5/5 | 5/5 |
| 2 | YAML 关联 DSL(v4.0 引入)——collect → aggregate → analyze → headline 4 段式 + 5 种算法(threshold/outlier/first_collection_only/match_all_to_first_collection/both_collections)+ 37 条预置规则 | 4/5 | 5/5 | 4/5 |
| 3 | sourceEvent 反向回溯 + 同 type 同 data 抑制——SpiderFootEvent.sourceEvent 引用链 + notifyListeners() 反向 walk(plugin.py:359-378),避免 200 模块递归 fan-out 爆炸 | 4/5 | 5/5 | 4/5 |
| 4 | 共享线程池 + per-taskName 桶限流——SpiderFootThreadPool 实现 n worker 轮询 m inputQueues,submit(..., taskName, maxThreads) 限流每模块并发 | 3/5 | 4/5 | 4/5 |
| 5 | optValueToData 三态输入抽象(sflib.py:142-180)——配置既支持字面量,也支持 @filename 引用本地文件,还支持 http(s)://... 远端 URL | 2/5 | 4/5 | 4/5 |
| 6 | CVE → eventType 自动映射(sflib.cveInfo)——CVSS score 0-3.9/4.0-6.9/7.0-8.9/9.0+ 直接产出 VULNERABILITY_CVE_LOW/MEDIUM/HIGH/CRITICAL,带 24h 本地 cache | 3/5 | 4/5 | 4/5 |
可复用的模式与技巧
- 声明式 plugin capability:
producedEvents()/watchedEvents()+ 共享 event queue 协调插件——适用 CI runners、IDE 检查器、Babel preset 链、ETL 算子网、SIEM 检测规则 - post-scan correlation DSL:4 段式(select/aggregate/analyze/render)+ 多种内置 analyzer——适用 SIEM 规则、FinTech 风控规则、SOC 告警合并、A/B 实验后置分析
- 全局线程池 + per-task 队列限流:
sharedThreadPool.submit(cb, ..., taskName, maxThreads),迁移到任何 Python 长跑服务/爬虫/队列消费者 - 数据值对象 setter 校验:业务可信度字段(severity/confidence/risk)在 setter 里写
TypeError+ValueError,迁移到任何领域模型 - 声明式运行时配置三态:
literal / @file / URL让 config 源统一——适用 CLI 工具 any context - plugin API 跟商业版深度协同(open-core):开源提供「全模块能力 + 自托管」,商业版提供「运维/规模/集成/合规」
关键设计决策
-
决策:模块的输入输出用声明式事件类型契约解耦,不直接 import 互相调用
- 问题:234 个模块如果两两互相调用,组合爆炸
- 方案:
watchedEvents()/producedEvents()声明 +eventQueue共享 +notifyListeners()同步分发 - Trade-off:易扩展性极强,但同步调用意味着单个慢模块会阻塞整条通知路径(也是 Issue #1650 长时扫描痛点的根因之一)
- 可迁移性:高
-
决策:YAML 关联规则引擎,把「分析」从代码搬到数据
- 问题:OSINT 最大痛点不是「找不到数据」而是「找到太多了」
- 方案:
spiderfoot/correlation.py(1075 行)4 段式 DSL + 37 条预置规则 - Trade-off:表达力够用,但 DSL 已暴露天花板(
analysis_match_all_to_first_collection/analysis_both_collections还是 stub);aggregate_events把所有事件 deepcopy 进 bucket 是 O(N) 内存 - 可迁移性:高
-
决策:SQLite + WAL 而非外部 DB
- 问题:OSINT scanner 目标用户是「个人/小团队一次性部署」,应该开箱即用;又要撑住 ~200 模块并发读写
- 方案:
db.py:39PRAGMA journal_mode=WAL+threading.RLock()自管并发 - Trade-off:单机部署零依赖,但横向扩展为零(这就是商业版要解决的问题)
- 可迁移性:高(任何「个人/小队本地工具 + 单机事件存储」场景都能用,可考虑迁移到 DuckDB)
-
决策:SOCKS 代理 toggle by patch
socket模块- 问题:大量第三方模块直接
import socket/urllib.request,无法在不改模块代码的情况下让所有流量走 TOR - 方案:
SpiderFootPlugin._updateSocket(socksProxy)+getSession()修改requests.Session.proxies - Trade-off:Hack 直接(
ssl._create_default_https_context = ssl._create_unverified_context在 sflib.py:75 全局 dirty monkey-patch 关掉 cert 校验) - 可迁移性:中(测试框架/OpenTelemetry agent 常用,但生产慎用)
- 问题:大量第三方模块直接
竞品格局与定位
竞品对比矩阵
| 维度 | SpiderFoot | Maltego | theHarvester | recon-ng |
|---|---|---|---|---|
| 形态 | 开源 CLI + Web UI | 商业闭源 + 社区版桌面 GUI | 开源轻量 CLI | 开源模块化框架 |
| Stars | 20,645 | N/A(商业) | ~13k | ~6k |
| 模块数 | 234 | Hub transforms($5-20/查询) | 30+ 数据源 | 80+ 模块 |
| 关联分析 | YAML DSL + 37 规则 | 实体关系图(Gephi 内核) | ❌ 无 | ❌ 无 |
| Web UI | ✅(CherryPy 1884 行) | ✅(桌面 GUI,3D 视图) | ❌ | ❌ |
| CI/CD 友好 | ✅(CLI + API) | ❌(桌面拖拽) | ✅(单文件脚本) | ✅ |
| 学习曲线 | 中(要懂 OSINT 数据源) | 高 | 低(零学习) | 中 |
| 维护状态 | 半休眠(2023-11 后停滞) | 持续商业迭代 | 活跃 | 停滞 5+ 年 |
| 本地部署 | ✅ | ❌(云/桌面) | ✅ | ✅ |
| 价格 | 免费 | 商业版昂贵订阅 | 免费 | 免费 |
差异化护城河
- 信任护城河 14 年独立运营 > 技术护城河 YAML DSL > 生态护城河 234 模块。三者叠加让 SpiderFoot 成为「事实上的开源 OSINT 自动化工具」。
- 14 年长跑 + 200+ 模块 + 主动 open-core 商业化,是很多 OSS 工具羡慕但学不来的「作者持续投入 + 社区接力」的复合护城河。
竞争风险
- 最大威胁:Intel 471 HX(自家商业版)——但策略是协同而非替代
- 潜在威胁:AI/LLM 驱动的 OSINT 工具(GPT + browser agent + 实时搜索)能降低对 200 模块的依赖,SpiderFoot 的「枚举全面性」护城河会被「智能理解」挑战
- 现实威胁:维护者空心化(2023-11 后停滞,235 个 open issue 无响应)会让社区 fork 接力分裂
生态定位
nmap ↔ 网络扫描、SpiderFoot ↔ 公网暴露面枚举。属于「网络攻防工具链」的一员,是 ATT&CK TA0043 Reconnaissance 阶段的开源事实标准之一。
套利机会分析
- 信息差:SpiderFoot 不再是「低关注度高质量」——20.6k stars 已经「长大」。但「v4 后续 + AI 增强模块」仍是新版本机会,作者精力转移给商业版留下了开源版空窗。
- 技术借鉴:
- 「声明式 pub/sub」+ 「YAML DSL」是任何插件型分析框架的通用配方,可移植到自己的项目(CI runners、ETL 算子网、SIEM 检测规则、A/B 实验后置分析)
- 「SQLite + WAL + 自管 RLock」是个人/小队本地工具的零依赖数据栈首选配方
- 生态位:填补了「开源 + 本地 + CI 化 + 关联分析」的 OSINT 自动化空白——Maltego 不开源,theHarvester 无关联,recon-ng 已停滞
- 趋势判断:OSINT 自动化赛道仍在增长(合规要求 + 攻击面管理需求),但作者精力转移后,开源版被 fork 分裂风险高
风险与不足
- 维护者空心化是最大风险:master 最后 commit 2023-11-06,235 个 open issue vs 维护响应能力明显失衡。作者精力转移给商业版 SpiderFoot HX 后,开源版处于「半休眠 + 社区 fork 接力」状态。
- v4.0 重写破坏式升级未做迁移层:Issue #1593 揭示老用户工作目录(
~/.spiderfoot)配置范式被强制迁移到平台约定路径,引发一系列bash: cd: /root/.spiderfoot: No such file or directory类问题——典型的「破坏式升级未做迁移层」教训。 - 长时扫描内存/线程治理痛点:Issue #1650(24 评论 +
investigate标签,open)反映 234 模块 + 同步分发 + 0.1s 轮询的架构在大扫描下的脆弱性。 - 同步分发阻塞风险:
notifyListeners()是同步调用,单个慢模块阻塞整条通知路径;SpiderFootThreadPool.shutdown用 0.1s 轮询等待(不是 event-driven)。 - 模块异常栈诊断透明度不足:Issue #1635(24 评论)反映模块各自捕获/重抛异常方式不统一,长期维护者稀缺时的典型放大效应。
- 域名商业化导致文档断裂:spiderfoot.net 301 → intel471.com 后,README 中所有 hero 截图与官方文档链接全部失效,新用户 onboarding 困难。
- 缺乏 CHANGELOG、Sphinx 空壳、无 lockfile、无 formatter 配置:是 14 年老项目的典型工程债。
行动建议
- 如果你要用它:用 Docker 镜像(Dockerfile 完整)跑最新 v4.0;接受「作者不活跃」现实,自己 fork 修 bug;投入模块开发时参考
correlations/README.mdDSL 教程;CI/CD 集成时用sfcli.py比 Web UI 友好。 - 如果你要学它:重点读这 4 个文件即可学到 80% 的设计要点:
sflib.py(1664 行)—— 核心库 + HTTP/SSL/DNS/CVE helperspiderfoot/plugin.py—— 模块基类 + 事件路由 + 共享线程池桥接spiderfoot/correlation.py(1075 行)—— YAML 关联规则引擎sfscan.py—— 调度器:模块加载、ROOT 事件注入、事件循环- 加读
spiderfoot/event.py—— 不可变值对象 + setter 校验模式
- 如果你要 fork 它:可以从三个方向改进:
- 重构事件分发为异步(
asyncio/aiohttp),消除长扫描阻塞问题 - 补 CHANGELOG + Sphinx 文档 + lockfile,把工程债清理一遍
- 加入 LLM 增强模块(用 GPT 总结 correlation 结果、自动翻译 headline),抢在「AI-native OSINT 工具」之前卡位
- 重构事件分发为异步(
知识入口
| 资源 | 链接 |
|---|---|
| DeepWiki | deepwiki.com/smicallef/spiderfoot(已收录,2025-04-20,commit 0f815a20) |
| Zread.ai | 未收录 |
| 关联论文 | 无(OSINT 工具少有正式论文) |
| 在线 Demo | 无官方 playground(本地启动 python3 ./sf.py -l 127.0.0.1:5001;社区有 Kali 演示视频) |