文章总结: 本文拆解开源AIOSINT工具OpenOSINT,其核心设计是通过硬停工具调用机制,让AI仅能调用20个预定义工具执行真实二进制程序,从结构上杜绝AI编造情报。工具分本地二进制、免密钥API和付费API三类,其中9个依赖第三方密钥。WebUI通过绑定地址控制密钥使用范围,防止敏感查询泄露。实体图谱模块将身份合并降级为待人工确认的候选。建议关注其防编造设计思路与安全边界控制。
综合评分: 85
文章分类: AI安全,安全工具,威胁情报
「AI OSINT 情报工具」OpenOSINT 拆解:20个工具+MCP+防AI编造发现
原创
句芒安全实验室
句芒安全实验室
句芒安全实验室
2026年10月2日 19:50
河北
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一个 AI Agent 在做情报调查时最容易犯的错,不是漏查,而是编造。你让它查一个邮箱,它给你一段看起来很专业的结论——账号、域名、泄露记录一应俱全,其中一半却是它”推理”出来的,不是真正查到的。对安全研究员来说,这种报告比没有报告更危险:你会拿着一个不存在的结论去做判断。
我翻 OpenOSINT/OpenOSINT 时,最想验证的就是它怎么处理这件事。它给的答案很硬:AI 只负责发起”硬停式”工具调用,真正执行的是你本机的二进制——被编造出来的发现,在结构上不可能出现。
先核身份
按老规矩,发布前用 GitHub API 当天核实:仓库 OpenOSINT/OpenOSINT,1681 颗星、263 个 fork、22 个未关闭 issue,主语言 Python,协议 MIT。2026 年 5 月 6 日建仓,最近一次提交在 2026 年 10 月 1 日,最新发布 v2.30.0(2026-10-01)。
它给自己的定位是:把 20 个情报工具藏在自然语言接口后面,再加一个 MCP 服务器,让任何兼容 MCP 的 AI 客户端直接驱动。你可以把它当 REPL、CLI、MCP 服务器,或者浏览器 Web UI 用。
硬停工具调用,是这套设计的地基
README 开头就写了一句很像安全原则的话:“The AI issues hard-stop tool calls; your code executes the real binary — hallucinated findings are structurally impossible.”
拆开看,这句话是三层约束:
**第一,AI 只能调 20 个工具。**它不能自由浏览开放网络、不能跑任意代码、不能自己”发明”数据。README 在 Limitations 里写得很直白:Agent 的每一个发现都来自一次真实的工具调用。这就把”自由发挥”从行动空间里直接删掉了。
**第二,工具调用是”硬停”的。**AI 发起 search_email,停下来;本机去跑 holehe 这个真二进制,把真实结果交回来。模型没有机会在中间插一段”我觉得应该有”的内容。
**第三,报告由结果投影出来,不是模型写出来的。**这一点在它的图模块里更明显(下面细说)。
20 个工具,分成三类
它把 20 个工具按依赖分成三类,这个分类本身就很值得看。
本地二进制类(不需要密钥):search_email 调 holehe 枚举邮箱关联的社交账号;search_username 调 sherlock,在 400+ 平台查用户名;search_domain 调 sublist3r 做子域枚举;search_phone 调 phoneinfoga 查号码归属与运营商;
免密钥 API 类:search_whois 走 python-whois 查注册人与 DNS;search_ip 走 ipinfo.io 查地理位置和 ASN;search_paste 查 Pastebin 提及;search_dns 用 dnspython 查 A/AAAA/MX/NS/TXT/CNAME/SOA,并分析 SPF、DMARC、DKIM;search_github 走 GitHub REST API 查资料、仓库和提交里暴露的邮箱;search_gdelt_geo 走 GDELT GEO 2.0 查全球地理定位新闻;generate_dorks 内置生成 12 条定向 Google dork URL,不发任何网络请求。
付费 API 类:search_breach(HaveIBeenPwned v3)、search_shodan(开放端口、banner、CVE)、search_virustotal(70+ 引擎判读)、search_censys(对外基础设施、证书)、search_abuseipdb(IP 滥用信誉)、search_ip2location(VPN/代理/Tor/数据中心标记),以及三个 Bright Data 支撑的工具:search_dorks_live、scrape_url(绕过 Cloudflare/CAPTCHA 抓 URL 转 Markdown)、search_footprint(实体感知的搜索足迹 + 实体关联图)。
三类里有一个数字要记住:20 个工具里有 9 个硬性依赖第三方 API 密钥,它们的可用性、限流、定价都由那家供应商决定。
AI 安全的第二层:密钥和敏感查询怎么不出圈
如果说”硬停工具调用”防的是 AI 编造,那 Web UI 安全模型防的是你把自己的密钥和敏感查询交给了不该交的人。
v2.28+ 有一个破坏性变更:密钥的使用现在跟着绑定地址走,而不是跟着环境变量走。绑在 127.0.0.1/localhost(默认)时,你 .env 里的密钥照旧可用;一旦绑到别的网卡(--host 0.0.0.0,本来就需要 --allow-remote),Web UI 永远不会用你环境里的密钥去服务请求,每个调用方必须自己提供,而且 search_breach(泄露查询)直接停用。这条规则无视任何环境变量,包括 OPENOSINT_DEMO_MODE——它只能加限制,不能解限制。
反代要单独说清。 绑在回环只说明操作系统接受了本机来的连接,不说明前面有没有 nginx、Caddy、Docker/K8s sidecar 或隧道把别处的请求转进来。默认情况下,带代理转发头(X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host、Forwarded、CF-Connecting-IP)的请求被当成非回环绑定处理:本地密钥不用、泄露查询被拦。要故意通过反代对外服务,必须显式设 OPENOSINT_TRUSTED_PROXY=true;而且设了之后,内部自相矛盾的转发头(比如两个互相打架的 X-Forwarded-Proto)仍然按公开处理。
Host 与 Origin 检查。 回环绑定时,服务器只回应 Host 是 127.0.0.1、localhost 或 ::1 的请求;每个 /api/* 请求必须来自 UI 自己的 origin,跨站请求被拒(脚本和 curl 不发 Origin,不受影响)。用别的名字访问设 OPENOSINT_ALLOWED_HOSTS,跨 origin 调 API 设 OPENOSINT_ALLOWED_ORIGINS。
Docker 默认只发布在 127.0.0.1,Host 检查开着,OPENOSINT_ALLOWED_HOSTS 默认 localhost,127.0.0.1。要对外必须 OPENOSINT_BIND=0.0.0.0,实例进入受限模式(永不花服务器上持有的密钥)。还有个细节:OPENOSINT_PUBLISHED_BIND 告诉服务器端口发布在哪个地址,回环值会解除容器 0.0.0.0 绑定本该有的限制——端口发布在别的网卡上时,绝不能把它设成回环值。README 也直说了:UI 的设置端点会接收并存储 API 密钥,只在你能信任的网络和反代后面这么干。
MCP 的密钥注入有个坑。 MCP 宿主启动服务器时的 cwd 跟你的 .env 没关系(常常是家目录)。源码检出时回落去找仓库根的 .env,但往上搜这个任意 cwd 不可靠;pip install 装的更不靠谱。唯一保证可用的是在客户端的 env 块里设 OPENOSINT_ENV_FILE。
实体图谱:把”同一个人”变成待人工确认的候选
可选装一个加性的 FollowTheMoney 实体图模块(pip install "openosint[graph]"),带陈述级溯源、只追加的存储、非破坏性的 same_as 去重,以及一个人工复核队列。它通过三个 MCP 工具用:graph_export、graph_neighbors、graph_review_candidates。
这里有一条边界写得很清楚:**same_as 是打分候选,供人工复核,不是已核验的身份匹配。**图 UI 的演示是确定性合成数据,每个实体都是虚构的,在陈述层播下种子,不是今天这些 mapper 产出的。把”合并”降级成”待人工确认的候选”,是这套里最克制的一处。
避坑
- 9 个工具硬依赖 API 密钥:Shodan、VirusTotal、Censys、AbuseIPDB、IP2Location、HaveIBeenPwned,加三个 Bright Data 支撑的工具。免费档很小,重度使用要按供应商的付费档。
- 本地二进制是不沙箱的子进程:
holehe、sherlock、sublist3r、phoneinfoga作为外部进程在你机器上跑,OpenOSINT 不修补、不审查它们,版本得你自己更新。 - 没有聚合保证:每个工具报的是它上游来源当前返回的东西。”没查到泄露、没查到账号”的负面结果,意思是那个来源没报匹配,不等于不存在暴露。
- 图谱模块是加性的,不是权威的:
same_as是供人工复核的候选,不是已核验的身份匹配。 - Agent 只能调那 20 个工具:它不能自由浏览开放网络、不能跑任意代码、不能发明数据——每个发现都来自真实工具调用,但它的工具选择本身仍然可能错,或者不完整。
- 别把回环绑定的限制当不存在:把 Web UI 暴露到 LAN、又把密钥和泄露查询交给任意调用方,是这套明确不支持的访问模式。
上手
# 一行起 Web UI(uv 隔离环境,不用配 Python)
uvx openosint web
# 或 pip
pip install openosint
openosint web # 默认 http://127.0.0.1:8080
# REPL / CLI
openosint email [email protected]
openosint --provider openai --openai-base-url http://localhost:4000/v1
三个 AI 后端任选:Anthropic Claude(默认,claude-sonnet-5)、本地 Ollama(无需密钥)、任意 OpenAI 兼容端点(LiteLLM、vLLM、LM Studio)。外部二进制 holehe、sherlock、sublist3r、phoneinfoga 必须在 PATH 里;缺哪个,对应工具报错,其余照常工作。
MCP 接入 Claude Code:
claude mcp add openosint python /absolute/path/to/OpenOSINT/openosint/mcp_server.py
接完就能在对话里直接说:Investigate [email protected]. Trace any username found across other platforms and compile a full report.
适合谁
如果你的 AI Agent 要做 OSINT 侦察、又要碰泄露数据和身份查询,OpenOSINT 最值得抄的不是它的 20 个工具,而是那两条设计:**把 Agent 的行动空间焊死到 20 个硬停工具调用上,让编造在结构上不可能;把密钥和敏感查询的可用性绑到绑定地址上,让”顺手对外暴露”变成一个必须显式选择的动作。**它不替代授权判断,也不替第三方 API 背书——但在 AI 替你跑侦察这件事上,它把”可信”写进了结构本身,而不是寄托在模型的自觉上。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:句芒安全实验室 句芒安全实验室
句芒安全实验室《「AI OSINT 情报工具」OpenOSINT 拆解:20个工具+MCP+防AI编造发现》