GitHub Explorer
📰 公众号已发布 2026-08-13

GitHub推荐:14 年 20.6k stars:一个渗透测试员的 OSINT 神器怎么变成行业事实标准

GitHub: https://github.com/smicallef/spiderfoot

一句话总结

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+ 实体)

  1. 注入 ROOT 事件(IP/域名/邮箱/人名/BTC 地址等)到 eventQueue
  2. 按 _priority 排序的模块逐个检查 watchedEvents(),匹配则触发 handleEvent()
  3. 模块产出新事件 → 通过 notifyListeners() 同步分发给所有 watcher
  4. sourceEvent 反向回溯 + 同 type 同 data 抑制(避免指数级 fan-out)
  5. scan FINISHED 后调用 run_correlations(),YAML 规则全表扫一遍事件库,输出 headline + 关联 event 链

视频/截图:SpiderFoot 的 asciinema demo 提供了 15 个 CLI 演示,但本环境无法嵌入。

项目画像

维度数据
GitHubhttps://github.com/smicallef/spiderfoot
Star / Fork20,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 看到的痛点是:

  1. 手工重复劳动:每次渗透测试都要「对每个 target 枚举 EVERYTHING」(子域、whois、证书、泄露、威胁情报关联、地理分布、技术栈、人员关联),手动整合耗时占报告 60% 时间。
  2. 没有「自动化关联」:recon-ng / theHarvester 都能采集,但找到的数据太多而无法自动聚合成结论,分析师还要回到 Excel/grep 二次加工。
  3. 没有「可本地化 + 可 CI 化」:Maltego 是商业桌面端,无法脚本化集成进红队流水线;SaaS 平台是黑盒且对单项枚举不开放 API。

解法哲学

  • Unix 哲学 + 大而全的反向组合:对外 monolithic(单仓库单部署),对内 modular(234 个文件级小工具)。新增模块只需声明 watchedEvents/producedEvents,零接入成本。
  • 本地优先 + 数据自有:默认 127.0.0.1:5001(sf.py:47),默认 TOR 集成(sfscan.py:149 socks5h),所有数据落盘 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/55/55/5
2YAML 关联 DSL(v4.0 引入)——collect → aggregate → analyze → headline 4 段式 + 5 种算法(threshold/outlier/first_collection_only/match_all_to_first_collection/both_collections)+ 37 条预置规则4/55/54/5
3sourceEvent 反向回溯 + 同 type 同 data 抑制——SpiderFootEvent.sourceEvent 引用链 + notifyListeners() 反向 walk(plugin.py:359-378),避免 200 模块递归 fan-out 爆炸4/55/54/5
4共享线程池 + per-taskName 桶限流——SpiderFootThreadPool 实现 n worker 轮询 m inputQueues,submit(..., taskName, maxThreads) 限流每模块并发3/54/54/5
5optValueToData 三态输入抽象(sflib.py:142-180)——配置既支持字面量,也支持 @filename 引用本地文件,还支持 http(s)://... 远端 URL2/54/54/5
6CVE → 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 本地 cache3/54/54/5

可复用的模式与技巧

  1. 声明式 plugin capability:producedEvents()/watchedEvents() + 共享 event queue 协调插件——适用 CI runners、IDE 检查器、Babel preset 链、ETL 算子网、SIEM 检测规则
  2. post-scan correlation DSL:4 段式(select/aggregate/analyze/render)+ 多种内置 analyzer——适用 SIEM 规则、FinTech 风控规则、SOC 告警合并、A/B 实验后置分析
  3. 全局线程池 + per-task 队列限流:sharedThreadPool.submit(cb, ..., taskName, maxThreads),迁移到任何 Python 长跑服务/爬虫/队列消费者
  4. 数据值对象 setter 校验:业务可信度字段(severity/confidence/risk)在 setter 里写 TypeError+ValueError,迁移到任何领域模型
  5. 声明式运行时配置三态:literal / @file / URL 让 config 源统一——适用 CLI 工具 any context
  6. plugin API 跟商业版深度协同(open-core):开源提供「全模块能力 + 自托管」,商业版提供「运维/规模/集成/合规」

关键设计决策

  1. 决策:模块的输入输出用声明式事件类型契约解耦,不直接 import 互相调用

    • 问题:234 个模块如果两两互相调用,组合爆炸
    • 方案:watchedEvents() / producedEvents() 声明 + eventQueue 共享 + notifyListeners() 同步分发
    • Trade-off:易扩展性极强,但同步调用意味着单个慢模块会阻塞整条通知路径(也是 Issue #1650 长时扫描痛点的根因之一)
    • 可迁移性:高
  2. 决策: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) 内存
    • 可迁移性:高
  3. 决策:SQLite + WAL 而非外部 DB

    • 问题:OSINT scanner 目标用户是「个人/小团队一次性部署」,应该开箱即用;又要撑住 ~200 模块并发读写
    • 方案:db.py:39 PRAGMA journal_mode=WAL + threading.RLock() 自管并发
    • Trade-off:单机部署零依赖,但横向扩展为零(这就是商业版要解决的问题)
    • 可迁移性:高(任何「个人/小队本地工具 + 单机事件存储」场景都能用,可考虑迁移到 DuckDB)
  4. 决策: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 常用,但生产慎用)

竞品格局与定位

竞品对比矩阵

维度SpiderFootMaltegotheHarvesterrecon-ng
形态开源 CLI + Web UI商业闭源 + 社区版桌面 GUI开源轻量 CLI开源模块化框架
Stars20,645N/A(商业)~13k~6k
模块数234Hub 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 分裂风险高

风险与不足

  1. 维护者空心化是最大风险:master 最后 commit 2023-11-06,235 个 open issue vs 维护响应能力明显失衡。作者精力转移给商业版 SpiderFoot HX 后,开源版处于「半休眠 + 社区 fork 接力」状态。
  2. v4.0 重写破坏式升级未做迁移层:Issue #1593 揭示老用户工作目录(~/.spiderfoot)配置范式被强制迁移到平台约定路径,引发一系列 bash: cd: /root/.spiderfoot: No such file or directory 类问题——典型的「破坏式升级未做迁移层」教训。
  3. 长时扫描内存/线程治理痛点:Issue #1650(24 评论 + investigate 标签,open)反映 234 模块 + 同步分发 + 0.1s 轮询的架构在大扫描下的脆弱性。
  4. 同步分发阻塞风险:notifyListeners() 是同步调用,单个慢模块阻塞整条通知路径;SpiderFootThreadPool.shutdown 用 0.1s 轮询等待(不是 event-driven)。
  5. 模块异常栈诊断透明度不足:Issue #1635(24 评论)反映模块各自捕获/重抛异常方式不统一,长期维护者稀缺时的典型放大效应。
  6. 域名商业化导致文档断裂:spiderfoot.net 301 → intel471.com 后,README 中所有 hero 截图与官方文档链接全部失效,新用户 onboarding 困难。
  7. 缺乏 CHANGELOG、Sphinx 空壳、无 lockfile、无 formatter 配置:是 14 年老项目的典型工程债。

行动建议

  • 如果你要用它:用 Docker 镜像(Dockerfile 完整)跑最新 v4.0;接受「作者不活跃」现实,自己 fork 修 bug;投入模块开发时参考 correlations/README.md DSL 教程;CI/CD 集成时用 sfcli.py 比 Web UI 友好。
  • 如果你要学它:重点读这 4 个文件即可学到 80% 的设计要点:
    • sflib.py(1664 行)—— 核心库 + HTTP/SSL/DNS/CVE helper
    • spiderfoot/plugin.py —— 模块基类 + 事件路由 + 共享线程池桥接
    • spiderfoot/correlation.py(1075 行)—— YAML 关联规则引擎
    • sfscan.py —— 调度器:模块加载、ROOT 事件注入、事件循环
    • 加读 spiderfoot/event.py —— 不可变值对象 + setter 校验模式
  • 如果你要 fork 它:可以从三个方向改进:
    1. 重构事件分发为异步(asyncio / aiohttp),消除长扫描阻塞问题
    2. 补 CHANGELOG + Sphinx 文档 + lockfile,把工程债清理一遍
    3. 加入 LLM 增强模块(用 GPT 总结 correlation 结果、自动翻译 headline),抢在「AI-native OSINT 工具」之前卡位

知识入口

资源链接
DeepWikideepwiki.com/smicallef/spiderfoot(已收录,2025-04-20,commit 0f815a20)
Zread.ai未收录
关联论文无(OSINT 工具少有正式论文)
在线 Demo无官方 playground(本地启动 python3 ./sf.py -l 127.0.0.1:5001;社区有 Kali 演示视频)

相关报告