プログラミング
Tapo (Rust/Pythonライブラリ) が TP-Link の TPAP プロトコルに対応
Tapo (Rust/Python library) now speaks TP-Link's TPAP protocol (mihai.dinculescu.dev)
要約
TP-LinkのTapoデバイス用非公式ライブラリ「tapo」(Rust/Python)が、最新ファームウェアで導入されたTPAPプロトコルに対応しました。これにより、Tapoアプリ内の「サードパーティ互換性」設定がオフの状態でも、デバイスと通信できるようになります。このアップデートは、過去数年間にわたるTP-Linkのプロトコル変更とセキュリティ強化の歴史の中で、ローカルコントロールを維持するための重要な一歩となります。
全文翻訳
tapo が TPAP をサポート: サードパーティ互換性はオフのままでOK
投稿日: 2026-10-06 :: 10分で読めます :: ソースコード:: home-automation iot mcp python rust tapo
数ヶ月間、Tapoプラグのオン/オフを切り替えるスクリプトを実行していました。その後、プラグは静かにファームウェアをアップデートし、次のリクエストは403 Forbiddenで返されるようになりました。コードは何も変更していません。
原因は、Tapoアプリの「マイ」>「サードパーティサービス」の奥深くに隠されている「サードパーティ互換性」というスイッチです。ファームウェア1.4.0以降、プラグは、このスイッチがオンになっている間のみ、以前のようにサードパーティクライアントと通信します。これは、何度も人々を困惑させてきました。少なくとも9つのイシューが同じ話を物語っており、その中には#441、#449、#473などがあります。
私の非公式なTP-Link Tapoデバイス用RustおよびPythonクライアントであるtapoのv0.11.1以降では、以下のマイナーな例外を除き、このスイッチをオフのままにすることができます。
これが、3つのリリースが1週間以内にリリースされた、ほぼ4ヶ月にわたる作業のヘッドラインです。v0.10.0は9月28日、v0.11.0は10月2日、v0.11.1は10月4日にリリースされました。その過程で、ライブラリは新しいデバイスファミリーと、人々が求めていたTapoアプリの2つの機能も追加しました。変更点の詳細はチェンジログに記載されています。この記事では、例を交えながらハイライトをカバーします。
ここに記載されているすべては、Rust版とPython版の両方のライブラリに適用されます。PythonパッケージはRustクレートの薄いラッパーであるため、すべての変更は同じバージョン番号の下で同時に両方に適用されます。以下の例はRustで記述されており、Pythonの呼び出しもそれに倣っています。
どのようにしてここまで来たのか
これは、過去3年間で3回目の、セキュリティ変更によってサードパーティクライアントがTapoデバイスから静かに締め出されたケースです。このスイッチは、2回目の時に残されたものです。
2023年: ライトとプラグ。
2023年2月、カターニア大学とロンドン大学ロイヤルホロウェイ校の研究者4名が、Tapoデバイスがアプリと通信する方法に4つの脆弱性を報告しました。これはL530E電球から始まりました。範囲内にいる誰でも、被害者のTapoアカウントを乗っ取り、Wi-Fiパスワードを知ることができます。数ヶ月後、ファームウェアアップデートはデバイスの元のAESプロトコルを新しいプロトコルであるKLAPに置き換え始めました。TP-Linkは、この2つが関連しているとは決して言わず、変更も発表しませんでした。「これはエラーですか、それとも意図的ですか?意図的なら、なぜですか?」とあるフォーラムのスレッドが尋ねましたが、TP-Linkからの回答なしにロックされました。このライブラリを含むすべてのサードパーティクライアントは、KLAPを学ぶ必要がありました。
2024年: カメラ。
2023年11月、TapoカメラのHome AssistantインテグレーションをメンテナンスしているJuraj Nyíri氏が、TP-Linkに脆弱性を報告しました。TP-Linkはそれを修正し、2024年4月までに新しいファームウェアのカメラはインテグレーションのログインを受け付けなくなりました。Nyíri氏は、TP-Linkのクラウドを経由して、リリース許可を求める回避策を構築しました。TP-Linkはコードをレビューし、許可しないと述べました。代わりに、最初の報告から8ヶ月後の2024年12月にリリースされたのは、Tapoアプリ内の古いローカルログインを再度有効にするトグルスイッチ、「サードパーティ互換性」でした。インテグレーションのリリースノートでは、これをローカルコントロールの勝利と呼んでいました。
2025年: プラグとライトが再び。
2025年10月、ファームウェア1.4.0は別の新しいプロトコル、TPAPを導入し、プラグを同じスイッチの後ろに置きました。ライトは2026年前半に、ファームウェア1.4.1から1.4.3でこれに続きました。今回は、ドアが閉まる前に出口が存在していました。スイッチは2024年12月からTapoアプリに存在していました。しかし、デフォルトではオフになっていました。TP-LinkのFAQによると、この機能は「セキュリティを確保するためにデフォルトで無効になっており」、オンにすると「デバイスのセキュリティが低下する可能性があります」。壊れたばかりのプラグの所有者がフォーラムで尋ねたところ、Home Assistantは「Tapo製品の公式にサポートされているサードパーティプラットフォームではない」と言われました。TPAP自体は一度も文書化されていません。
このスイッチは、友好的な名前を持つセキュリティダウングレードです。オンにすると、新しいプロトコルの代わりに古いログインが戻ってきますが、新しいプロトコルの方が優れています。詳細は後述します。
TPAPサポート
最近のTapoファームウェアでは、「サードパーティ互換性」スイッチがデバイスがどのプロトコルを話すかを決定します。ライト、プラグ、電源タップ、H100ハブは、スイッチがオンの場合はKLAP、オフの場合はTPAPを話します。カメラはKLAPを話したことはありません。それらの古いプロトコルはAES SSLであり、一部のカメラはスイッチがオフの場合にそれを拒否します。ライブラリはTPAPを話さなかったため、スイッチがオンになっているデバイスにしか到達できませんでした。
v0.11.1はTPAPを追加しました。TPAPを必要とするライト、プラグ、電源タップ、ハブ、カメラは、IPアドレスによる接続とdiscover_devicesの両方で、スイッチがオフの状態でも使用できるようになりました。コードを変更する必要はありません。クライアントはデバイスがどのプロトコルを話すかを判断し、そのプロトコルでログインします。
知っておくべき3つのこと:
間違ったパスワードはデバイスをロックする可能性があります。ログインに失敗しすぎると、TPAPデバイスはしばらくの間すべてのログインを拒否します。ライブラリは間違ったパスワードをTPAP_CREDENTIALSとして、ロックアウトをTPAP_AUTH_ATTEMPTS_LIMITとして報告します。どちらもループで再試行しないでください。
カメラハブはまだTPAPを話しません。H200(v0.10で新規追加)はファームウェア1.7.5で、スイッチのオン/オフに関わらずAES SSLをアナウンスし、ライブラリはそれを介してログインします。
一部のカメラもまだTPAPを話しません。モデルとファームウェアによります。C220とC510Wはファームウェア1.3.4でTPAPを話すため、スイッチオフで動作します。C210はファームウェア1.5.2でそうではないため、ライブラリは代わりにAES SSLでログインしますが、カメラはスイッチオフ時にそのログインを拒否します。現時点ではスイッチオンでのみ動作します。
プロトコルが1つ到着した一方で、もう1つが去りました。2023年にKLAPが置き換えた元のAESプロトコルは、ライブラリに残っており、IPアドレスで接続するすべてのライトとプラグをプローブして、それがAESかKLAPのどちらを求めているかを確認していました。長らくそのプロトコルを出荷したファームウェアはないため、v0.11.0で削除されました。カメラやカメラハブが話すAES SSLは、近縁関係にあります。同じ種類の暗号化されたコンテナですが、HTTPS上で行われ、異なるログイン方法です。それは残ります。
なぜTPAPがより安全なプロトコルなのか
スイッチを無視できるのは良いことです。より興味深いのは、TPAPのログイン方法です。
KLAPは、両方の側が資格情報を知っていることを、それらとクリアで送信される2つのランダム値から構築されたハッシュを交換することで証明します。これにより、パスワード自体はワイヤー上に出ませんが、ネットワーク上の単一のログインを記録した人は誰でもそれを持ち帰り、ハードウェアが許す限り速くパスワード推測をテストできます。セッションキーも同じ材料から派生するため、正しい推測はそれに続くすべてのものを復号化します。
TPAPは、パスワード認証鍵交換であるSPAKE2+ (RFC 9383) でログインします。2つのことが変わります。
記録されたログインは推測には役に立ちません。交換されるものに対して、オフラインで候補パスワードと比較することはできません。推測をテストする唯一の方法は、デバイス自体に対して1回ずつ試すことですが、これは上記のロックアウトが停止させるものです。
記録されたトラフィックはプライベートなままです。各セッションのキーは、両方の側がそのログインのために作成し、決して送信しない秘密に依存します。後でパスワードを知った人も、それ以前にキャプチャしたセッションを復号化することはできません。
スイッチがオンの場合、ライトまたはプラグは依然としてKLAPをアドバタイズし、ライブラリはそれを介してログインするため、これら2つはスイッチがオフの場合にのみ保持されます。ネットワーク上の他のものがサードパーティ互換性を必要としない場合、スイッチをオフにする良い理由ができました。
新機能も
カメラハブ: H200とH500
v0.10まで、ライブラリが通信できた唯一のハブはH100でした。H200とH500は異なる種類のデバイスです。H100と同様にセンサーやスイッチとペアリングしますが、カメラともペアリングして録画を保存します。
どちらもハンドラーを備え、ApiClientでh200またはh500で作成されます。discover_devicesもそれらを見つけ、エラーを報告する代わりに、すぐに使用できる状態で返します。
カメラハブにペアリングされたセンサーとスイッチは、H100の場合とまったく同じように、get_child_device_listと型指定された子ハンドラー(t100、t31xなど)を介して機能します。新しい部分は録画です。ハブにペアリングされたカメラのリストを取得し、録画がある日を見つけることができます。