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 の評価、一行の安全性判定、および1ページの HTML レポートを提供します。すべてローカルで実行されます。アカウントも、テレメトリーも、クラウドも必要ありません。
安価なスマートデバイスについて、実際に知りたいことに答えます。
- 要点は何ですか? 評価の横に一行の判定が表示されます。開いているポート、パブリック DNS、TLS または平文通信、宛先の国は観測された事実です。動画、音声、その他のトラフィックパターンは、信頼度付きの指標として扱われます。
- どこに通信していますか? ドメイン(DNS + TLS SNI + HTTP Host)、IP、国、組織を確認できます。レポートには、デバイスごとの宛先の国が記載されます(観測された事実)。
- トラフィックはどのようなものですか? デバイスごとに、動画、音声、テレメトリー、不明のいずれかを個別の指標として示し、それぞれに低・中・高の信頼度を付けます。これはパターンの照合であり、送信された内容の証明ではありません。
- 暗号化されていますか? 平文 HTTP、暗号化されていない TCP、古い TLS、または高エントロピーの「カスタム」プロトコルを確認できます。
- どのポートが開いていますか? リスクに関する注記(telnet、RTSP、UPnP、ADB、…)付きで、任意の
nmapスキャンを実行できます。 - このバナーに既知の問題はありますか? バージョン文字列が厳選された CVE と一致した場合、オフラインで短いヒントを表示します。バージョンが完全一致し、エントリーが重大な場合を除き、評価には影響しません。
- インターネットから到達できますか? ルーターが UPnP 経由で開いたポートフォワードと、転送先のデバイスを一覧表示します(読み取り専用で、ルーターは変更しません)。
- アイドル状態でも外部に通信していますか? アイドル時のアップロード確認と、バーストを含むトラフィックのタイムラインを表示します。
- 動画はどこへ送られましたか? LAN 内のピア(電話との P2P)か、クラウドか、STUN/TURN かを確認できます。また、ストリームが確立されても実際にはお使いのコンピューターを通過しなかった場合は、その旨を正直に記載します。
- 前回の監査から何が変わりましたか?
iotaudit diffは保存された2つの JSON 結果を比較し、新しい宛先、国、開いているポート、悪化した評価、暗号化されていない通信、UPnP 転送、またはデバイスが見つかった場合に終了コード 1 を返します。
ステータス:0.1.10。ホットスポット + ARP キャプチャ、pcap および PCAPdroid の分析、IPv6/NDP、デバイスタイプの識別、UPnP ポートフォワード監査、オプトイン方式のデフォルトパスワード確認、一行の安全性判定を含む評価、HTML および PDF レポート、2回の監査結果の差分、既知の問題に関するオフラインヒント、ローカル 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 を経由するようにして、最大 1 時間キャプチャします(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 ポイント減点されます。これは重大な検出事項 1 件分と同じで、データが限られている場合の上限適用後に減点されるため、キャプチャデータが少なくても評価に反映されます。バージョン範囲、完全一致するバージョンがない製品名、単独で開いているポート、またはクリティカル以外の深刻度では、スコアは変わりません。Telnet が開いていること、UPnP IGD が公開されていること、または認証なしの RTSP は、それだけでは CVE を示すものではありません。カタログが CVE を引用するのは、バナーまたはサービス情報が該当エントリーと一致する場合に限られます。
制限事項:
- ファイルに含まれるのは、NVD やファームウェアデータベースではなく、約 10〜20 件の問題をまとめた簡潔な厳選リストです。
- パッチ適用済みのデバイスでも古いバージョン文字列が表示されることがあります。未パッチのデバイスではバージョンが隠されていることがあります。いずれの場合も、ヒントではファームウェアの確認を促します。
- バナーは IPv4 パケットと nmap の記録から読み取られます。IPv6 サービスのバナーは解析されません。
- 認証なしの RTSP は、キャプチャされた RTSP
200にWWW-Authenticateヘッダーがない場合、またはスキャンの追加情報にすでにその旨が記載されている場合に記録されます。同梱リストでは、この情報だけを 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 には含まれません。
レンダラーは純粋な Python 製の追加パッケージである xhtml2pdf(iotaudit[pdf] によってインストールされる xhtml2pdf)です。Cairo や Pango のインストールは不要です。追加パッケージがインストールされていない場合でも、analyze と capture は HTML を書き出し、インストール方法を 1 行表示します。iotaudit report --pdf は PDF のみを出力するため、同じ行を表示して終了します。MCP ツール analyze_pcap では、report_path とともに pdf=true を指定すると、HTML と同じ場所に PDF が書き出されます。
2 つの監査を比較する
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 アドレスが異なる場合は、1 台のデバイスがなくなり、別のデバイスが新たに追加されたものとして扱われます。デバイスごとに、新たに確認された宛先ドメインと IP アドレス、増えた国、新たに開いたポート、グレードの変化、判定の変化、新たに確認された暗号化されていないトラフィック、JSON に記録されている場合は新しい UPnP 転送をレポートに一覧表示します。
セキュリティに関係する変化(デバイス、宛先ドメインまたは IP アドレス、国、開いたポート、悪化したグレード、暗号化されていないトラフィック、UPnP 転送)があった場合は、終了コード 1 になります。それ以外は、デバイスの減少やグレードの改善だけの場合も含めて、終了コード 0 になります。判定の変化はどちらの場合も表示されますが、それだけで終了コードが 1 になることはありません。入力がない、または読み取れない場合は、終了コード 2 になります。--compare を指定した場合、capture と analyze はレポートを書き出した後、同じコードを返します。
capture と analyze はすでに JSON を書き出します(HTML と同じ場所、または --json で指定した場所)。以前のファイルを残して --compare に渡すか、後から 2 つのファイルに対して 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 の検出結果、または internal_client をキーとして結合したトップレベルの upnp.mappings リストから読み取られます。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 が実行するログインは 1 回だけで、ご依頼があった場合に限ります。記録されているベンダーのデフォルト認証情報(例:Mirai 時代のカメラに付属していた root/xc3511)を短いリストから試します。パスワードのワードリストは使用しません。フレーズを入力して対象の IP アドレスを正確に確認し、LAN アドレスのみを対象とします。各試行の間隔を空け、ログインに初めて成功した時点で停止し、結果として**「デフォルトログインを受け付けました」または「受け付けられませんでした」**のみを報告します。セッションを保持したり、使用したりすることはありません。ご自身のデバイスにのみ使用してください。
ルーターのポートフォワーディング(UPnP)
iotaudit upnp # or --json
多くのデバイスは、ルーターに対して自身へのパブリックポートの開放をひそかに要求します。iotaudit upnp は、すべての UPnP ポートフォワーディングと、その転送先の LAN デバイスを一覧表示します。読み取り専用の UPnP クエリを 2 つだけ送信し、プライベートアドレス上にあるルーターのみを対象にします。また、各 capture の実行後にも動作し(--no-upnp でスキップできます)、転送先が監査対象デバイスの場合は検出結果を追加します。応答がない場合、ルーターの UPnP は無効になっており、これは最も安全な設定です。
Web UI とスマートフォン
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によるキャプチャを含む)、ワンクリックでスキャンとキャプチャを実行できます。デフォルトでは localhost で動作します。--lan はオプトイン方式で、トークンによって保護され、プライベートアドレス範囲のクライアントにのみ応答します。iPhone では Web UI を使用できますが、単独でキャプチャを実行することはできません。Android と iOS でできること、できないことについてはdocs/phones.mdをご覧ください。
MCP サーバー
iotaudit-mcp # exposes audit tools to a local assistant ("audit my pet feeder")
diff_results は、iotaudit diff と同じ方法で、保存済みの 2 つの JSON 監査結果を比較します。
同意と対象範囲
iotaudit が監査するのはご自身のネットワークのみです。プライベートではない対象は拒否され、--i-own-this-network または対話形式での I OWN THIS NETWORK の確認が必要です。所有していないネットワークで ARP/NDP スプーフィングを行うことは、違法となる場合があります。
検出結果は観測されたトラフィックに基づく指標であり、ベンダーの不正行為を証明するものではありません。IP ジオロケーションには DB-IP を使用しています。MIT ライセンスです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。