关于 iotaudit
iotaudit 是面向希望检查自有智能家居设备网络行为的本地审计工具,可采集或分析流量并生成评级与报告。它还支持审计差异比较和离线已知问题提示,所有处理均在本机进行。
主要功能
- 01设备流量捕获与分析
- 02A–F 安全评级及 HTML 报告
- 03检查目的地、加密与开放端口
- 04审计结果差异比较
- 05离线已知问题提示
适用场景
- 01检查摄像头或插座的网络通信
- 02查看设备是否使用明文或开放高风险端口
- 03比较两次审计并发现新增目的地
- 04为设备流量生成可复核报告
MCP 相关
提供 MCP 服务,MCP 客户端可调用 `analyze_pcap` 分析 PCAP 并生成报告;该工具也支持 PDF 输出。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
iotaudit
如果你觉得这很有用,可以购买我的另一个项目 SkinToScan 套装来支持我。这是一次性购买,所得将直接用于资助我的开源工作。
你的智能宠物喂食器、摄像头或插座安全吗? iotaudit 会监控你自己的 IoT 设备在网络上的行为,并为每台设备评定 A-F 等级、给出一句话安全结论,以及生成一页式 HTML 报告。所有操作都在本地运行:无需账户、没有遥测数据,也不使用云服务。
它能回答你对廉价智能设备真正关心的问题:
- 简而言之,结论是什么? 等级旁附有一句话结论。开放端口、公共 DNS、TLS 或明文传输,以及目的地国家/地区都是观测到的事实。视频、音频和其他流量模式则仅作为带置信度的指标。
- 它会与谁通信? 域名(DNS + TLS SNI + HTTP Host)、IP、国家/地区、组织。报告会列出每台设备的目的地国家/地区(观测到的事实)。
- 流量是什么样的? 每台设备都有独立指标,用于识别视频、音频、遥测或未知流量,每项置信度分为低、中或高。这是模式匹配,并不能证明实际发送了什么。
- 是否经过加密? 明文 HTTP、未加密的 TCP、旧版 TLS,或高熵的“自定义”协议。
- 开放了哪些端口? 可选的
nmap扫描,并附带风险说明(telnet、RTSP、UPnP、ADB 等)。 - 此 Banner 是否存在已知问题? 当版本字符串与整理过的 CVE 相匹配时,会提供简短的离线提示。除非版本完全匹配且条目为严重级别,否则不会影响等级。
- 能否从互联网访问? 列出路由器通过 UPnP 开放的端口转发,以及它们指向的设备(只读,绝不会更改路由器设置)。
- 空闲时会向外发送数据吗? 提供空闲上传检查和显示突发流量的时间线。
- 视频传到了哪里? 局域网对等设备(手机 P2P)、云端或 STUN/TURN;如果已建立流,但数据从未实际经过你的电脑,也会如实说明。
- 与上次审计相比有哪些变化?
iotaudit diff会比较两个已保存的 JSON 结果;如果出现新的目的地、国家/地区、开放端口、等级下降、未加密流量、UPnP 转发或设备,则以状态码 1 退出。
状态:0.1.10。热点 + ARP 捕获、pcap 和 PCAPdroid 分析、IPv6/NDP、设备类型识别、UPnP 端口转发审计、自愿启用的默认密码检查、带一句话安全结论的评级、HTML 和 PDF 报告、两次审计结果比较、离线已知问题提示、本地 Web UI 和 MCP 服务均已可用。完整漏洞源仍在 路线图中。
示例报告
一份与 Tuya 相关的宠物喂食器报告(已匿名化)。结论与评级并列显示:LAN 上 telnet 端口开放、使用公共 DNS、通过 TLS 与美国的云服务通信、使用未经验证的自定义加密,以及一套 P2P 视频配置;本次运行未观察到视频流。下方仍有详细摘要。报告还显示了一个奇怪的特殊用途“LAN 对等设备”,它并非真实设备:

在浏览器中打开 docs/sample-report.html,查看完整版本。
演示
简短演示了捕获流量、检查 UPnP 端口转发,以及可选的默认密码检查(动画 SVG,无音频,不跟踪):
安装
pipx install iotaudit
# or with the MCP server extra, and PDF export:
pip install "iotaudit[mcp]"
pip install "iotaudit[pdf]"
# latest from source:
pipx install "git+https://github.com/emirmrkaljevic/iotaudit"
捕获流量需要 root 权限(sudo)。可选的端口扫描需要 nmap。
快速开始
macOS
brew install nmap
pipx install iotaudit
# Just run it: pick your device from the list, then leave it alone (or use its app).
sudo "$(which iotaudit)" capture --mode arp --i-own-this-network
iotaudit 会扫描你的 LAN,列出设备(IP、MAC、供应商;将 Tuya/Espressif 标记为可能的 IoT 设备),并让你选择一个设备。随后,它会仅对该设备执行 ARP 欺骗,使其流量经过你的 Mac,最长捕获一小时(按 Ctrl+C 可提前停止,仍会生成报告),并在退出时恢复 ARP 表和 IP 转发。选定设备后,默认启用 --watch-lan(手机 P2P)和 IPv6/NDP 过滤器。
Linux
sudo apt install nmap
pipx install iotaudit
# Same ARP flow as macOS:
sudo "$(which iotaudit)" capture --mode arp --i-own-this-network
# Or hotspot mode: your laptop becomes an AP; re-pair the device to it (needs NetworkManager).
sudo iotaudit capture --mode hotspot --iface wlan0 --ssid iotaudit --password 'choose-a-pass' \
--device 10.42.0.50 --scan --out feeder.html
分析现有捕获文件
# from Wireshark, your router, or OpenWrt `tcpdump -w`
iotaudit analyze capture.pcap --device 192.168.1.50 --json results.json --out report.html
报告将生成在 ./iotaudit-report.html,旁边还会生成对应的 .json 文件。
已知问题提示
iotaudit 会将已有的横幅信息与软件包中附带的小型目录进行比对
(src/iotaudit/data/known_issues.yaml)。可用的信息包括:
- 端口扫描发现的开放服务,以及 nmap 产品和版本信息
- 设备发送的响应中的 HTTP
Server标头 - UPnP 或 SSDP 标头(包括 InternetGatewayDevice 通告)
- 未要求身份验证的 RTSP 响应(前提是该响应已在捕获文件或扫描记录中)
运行时不会进行查询,也没有 hints --update-from 命令。只有安装新版 iotaudit 时,这个文件才会更改。
每条提示都只是可能性,并不能证明固件存在漏洞。提示文字始终会注明:可能存在问题,依据是版本字符串;请验证固件。参考链接指向该 CVE 的 NVD 页面。
提示会显示在 HTML 报告、PDF(PDF 与 HTML 内容相同)、设备 JSON 中的 known_issue_hints 字段,以及 MCP analyze_pcap 结果中。
评级规则。 除非同时满足以下两个条件,否则提示不会影响 A-F 评级:观察到的版本字符串与条目中列出的某个版本完全一致,且条目严重性为严重。在这种情况下扣除 25 分,与一个高危发现的扣分相同;此扣分会在受限数据上限应用后计算,因此即使捕获数据较少,也仍会影响评级。版本范围、没有精确匹配版本的产品名称、单独开放的端口,或严重性不为严重的条目,都不会改变得分。Telnet 端口开放、UPnP IGD 暴露,或 RTSP 无需身份验证,本身都不构成 CVE。只有当横幅信息或服务事实与相应条目匹配时,目录才会引用 CVE。
限制:
- 该文件是经过筛选的短列表(大约包含 10 到 20 个问题),并非 NVD,也不是固件数据库。
- 已修补的设备仍可能显示旧版本字符串;未修补的设备也可能隐藏版本信息。无论哪种情况,提示都会要求验证固件。
- 横幅信息从 IPv4 数据包和 nmap 记录中读取,不会解析 IPv6 服务横幅。
- 当捕获到的 RTSP
200响应中没有WWW-Authenticate标头,或扫描附加信息中已注明这一点时,系统会记录 RTSP 无需身份验证。随附列表不会仅凭这一事实将其视为 CVE。只有在同时匹配到带版本信息的 RTSP 条目时,提示才会提及此情况。 - 不会访问网络来刷新列表。
PDF 导出
pip install "iotaudit[pdf]"
# Writes report.pdf next to report.html:
iotaudit analyze capture.pcap --device 192.168.1.50 --out report.html --pdf
sudo "$(which iotaudit)" capture --mode arp --i-own-this-network --pdf
# Convert a report you already saved (HTML, or the JSON list of devices):
iotaudit report --pdf report.html
iotaudit report --pdf results.json --out results.pdf
在 analyze 和 capture 上使用 --pdf,会在 HTML 文件旁生成 PDF。打印样式会将评级
和判定放在每台设备页面的顶部(第一台设备与标题共用第 1 页;之后每台设备都从新页面开始),
确保表格行不会被拆开,并重复显示表头。
屏幕上显示的流量图表不会出现在 PDF 中。
渲染器是 xhtml2pdf,这是一个纯 Python 扩展(xhtml2pdf,由 iotaudit[pdf] 拉取)。
无需安装 Cairo 或 Pango。如果未安装该扩展,analyze 和 capture 仍会生成 HTML,并打印一行安装提示。iotaudit report --pdf 会打印同一行提示并退出,因为 PDF 是它唯一的输出。MCP 工具 analyze_pcap 会同时接收 pdf=true 和 report_path,并在 HTML 文件旁生成 PDF。
比较两次审计
iotaudit diff "$HOME/iotaudit/yesterday.json" "$HOME/iotaudit/today.json"
iotaudit diff "$HOME/iotaudit/yesterday.json" "$HOME/iotaudit/today.json" --json
# Same diff, printed after the HTML and JSON report:
iotaudit analyze capture.pcap --device 192.168.1.50 \
--json "$HOME/iotaudit/today.json" --out "$HOME/iotaudit/today.html" \
--compare "$HOME/iotaudit/yesterday.json"
设备按 MAC 地址匹配。如果任一侧没有 MAC 地址,则按 IP 地址匹配。同一 IP 地址对应不同 MAC 地址时,会被视为一台设备离开,另一台设备新加入。对于每台设备,报告会列出新增和消失的目标域名及 IP、新出现的国家、新开放端口、评级变化、判定变化、新发现的未加密流量,以及 JSON 中存在时的新 UPnP 转发。
出现安全相关变化时,退出代码为 1:新增设备、目标域名或 IP、国家、开放端口、评级变差、未加密流量,或 UPnP 转发。否则退出代码为 0,包括只有设备离开或评级变好时。判定变化无论如何都会打印,但本身不会导致退出代码为 1。输入缺失或无法读取时,退出代码为 2。使用 --compare 时,capture 和 analyze 会在写入报告后返回相同的退出代码。
capture 和 analyze 已经会写入 JSON(位于 HTML 文件旁,或写入 --json 指定的位置)。保留之前的文件并将其作为 --compare 参数传入,或者之后对两个文件运行 diff。
diff 上的 --json 会输出机器可读结果。在 capture 和 analyze 上,--json 仍表示结果文件的路径。
没有新变化时,Cron 不会输出内容。此脚本只会在出现安全相关变化时打印差异并以代码 1 退出:
#!/bin/sh
# 15 6 * * 1-5 "$HOME/iotaudit/check.sh"
report=$(iotaudit diff "$HOME/iotaudit/yesterday.json" "$HOME/iotaudit/today.json") || {
printf '%s\n' "$report"
exit 1
}
exit 0
不比较 LAN 对等设备。开放端口指扫描得到的 open_ports,而不是联系某个目标时使用的远程端口。UPnP 信息读取自类别为 upnp 的发现结果,或读取自顶层的 upnp.mappings 列表,并按 internal_client 联接。若保存的审计未检查 UPnP,则不会记录转发,因此下一次审计中的转发会显示为新增。其他发现结果不会逐条列出;如果这些发现导致评级或判定发生变化,仍会显示相应变化。
IPv6、P2P 视频和“未观察到”
来自摄像头或喂食器的实时视频通常不会发送到云端:它会在经过简短的 STUN/TURN 握手后,通过本地 Wi-Fi(P2P)直接发送到你的手机。iotaudit 会尽力捕获该视频流(--watch-lan 会欺骗设备↔手机通信,且捕获过滤器现在包含 IPv6 和 NDP),但两个 Wi-Fi 客户端之间的通信可能完全不会经过你的电脑。
这可能是因为接入点启用了客户端隔离、手机忽略了欺骗,或视频流使用了 IPv6 链路本地地址(fe80::)。发生这种情况时,报告会如实说明:
已建立实时视频连接,但此处未观察到:会话已协商(STUN),但未捕获到持续的视频流;它很可能直接传到了你的手机。未观察到 ≠ 未发生。
如需获得真实情况,请在路由器上捕获流量。--ipv6-ndp(实验性)也会对 IPv6 链路本地地址对进行 NDP 欺骗。
默认密码检查(选择加入)
iotaudit credcheck 192.168.0.50 # telnet by default
iotaudit credcheck 192.168.0.50 --service telnet --service http
iotaudit 只会在你主动要求时进行这一次登录尝试。它会尝试一小组有文档记录的厂商默认凭据(例如 Mirai 时代摄像头出厂时使用的 root/xc3511),绝不会使用密码字典。你需要输入短语确认准确的 IP;它只会以局域网地址为目标,在每次尝试之间等待,在首次成功登录时停止,并且只报告**“默认登录已接受”或“未接受”**;它绝不会保留或使用会话。请仅在自己的设备上使用。
路由器端口转发(UPnP)
iotaudit upnp # or --json
许多设备会悄悄请求路由器向其开放一个公共端口。iotaudit upnp 会列出所有 UPnP 端口转发及其指向的局域网设备。它只会发送两条只读 UPnP 查询,且仅发送给使用私有地址的路由器。它也会在每次 capture 后运行(使用 --no-upnp 跳过),并在发现转发指向受审计设备时添加一条发现项。如果没有设备响应,说明路由器上的 UPnP 已关闭,这是最安全的设置。
Web 界面和手机
iotaudit web # http://127.0.0.1:8765, token printed on start
sudo "$(which iotaudit)" web --lan # also from a phone on the same Wi-Fi (token required)
在浏览器中查看报告、上传 pcap(包括 Android 上由 PCAPdroid 捕获的文件),并一键运行扫描与捕获。默认仅限本地主机;--lan 需主动启用、受令牌保护,且只响应私有地址范围内的客户端。iPhone 可以使用 Web 界面,但无法自行捕获;有关 Android 和 iOS 上可用与不可用的功能,请参阅 docs/phones.md。
MCP 服务
iotaudit-mcp # exposes audit tools to a local assistant ("audit my pet feeder")
diff_results 会以与 iotaudit diff 相同的方式比较两个已保存的 JSON 审计结果。
同意与范围
iotaudit 只审计你自己的网络。它会拒绝非私有目标,并要求提供 --i-own-this-network(或交互式确认 I OWN THIS NETWORK)。在不属于你的网络上进行 ARP/NDP 欺骗可能违法。
发现项是基于观测流量的迹象,并非任何厂商有不当行为的证据。IP 地理定位由 DB-IP 提供。采用 MIT 许可证。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。