
標準的なBLEタグは、鍵やノートPC、パレット、患者のリストバンドに付けて後から見つけられるようにするコイン大のビーコンです。この利便性こそが危険でもあります。本人の知らないうちに誰かのカバンに忍ばせれば、それは追跡デバイスになります。一連の悪用事例を受けて、AppleとGoogleは「不正追跡検知(unwanted tracking detection)」に関する共同仕様(2023-2024年)を公開しました。これはファーストパーティ製に限らず、あらゆるタグがスマートフォンに受け入れられるために守るべきルールです。この記事ではエンジニアリングの側面、すなわちタグが「オーナーから切り離された」とどう判断するか、オーナーではなく見知らぬ人にどう警告するか、そしてファインダー側の電話が所有者を特定できずに位置を報告するための暗号技術について解説します。
脅威モデル:2つの役割
関与するのは次の2者だけです。
- オーナー — タグと正規にペアリングされ、そばにいるはずの電話。
- 非オーナー — 知らずにタグを運ぶ人(被害者)、または通りがかりに電波を受信できる人(ファインダー)。
正常なタグは、オーナーがほとんどの時間そばにいると想定します。危険な状態は*分離(separated)*です。タグは世界を動き回っているのに、オーナーの電話がそばにいない状態です。この状態を検知し、オーナーではなく非オーナーに警告することが、追跡防止の全体像です。
分離検知:「オーナーはいるか?」
タグはインターネット経由でオーナーに問い合わせできません。BLEのみで、ゲートウェイの圏外のこともあります。そこでオーナーの在席をローカルに推測します。
1. オーナーの電話はペアリング中、定期的に認証付き在席トークン — タグが認識する署名付きの回転するBLEパケット — を送信します。
2. タグはアドバタイジングの隙間でリッスンします。各間隔でトークンを受信すれば(オーナー在席)、さもなくば(見逃し)とカウントします。
3. 見逃しカウンタを保持します。閾値を超え、かつ加速度センサーが動きを検知したとき、*分離*状態へ遷移します。
モーションゲートが重要です。オーナーが旅行へ出て家中の棚にタグが置き去りになっても、警告音を鳴らすべきではありません(被害者がいない)。何時間も見知らぬ人と一緒に動くタグは鳴らすべきです。典型的な閾値:最初の警告までに、動いている状態で8-24時間の累積不在。
最小の検知ループ:
def tick(tag, owner_token_seen, accel_motion):
if owner_token_seen:
tag.miss_counter = 0
tag.separated = False
return
tag.miss_counter += 1
if tag.miss_counter > ABSENCE_LIMIT and accel_motion:
tag.separated = True
タグが見知らぬ人に警告する2つの方法
分離すると、タグはオーナーではなく*非オーナー*に警告しなければなりません。
1. 本体スピーカー。 小型の圧電または磁気トランスデューサが音色を鳴らします。クロスプラットフォーム仕様では実質的に、0.3 mで>= 60 dBの音を、境界付きの時間枠(分離後によくある8-24時間以内)で鳴らすことが求められます。だからこそ、 consumerタグには静かに外せないトランスデューサが搭載されています。
2. 非オーナー電話の警告。 どの電話OSも、共に移動している*未知*のタグをフラグできます。電話は通知を出し、「音を鳴らす」「最後に見つかった場所を表示」と無効化手順を提示します。これがベンダーを越えて機能するには、タグが通常のBLEペイロードに分離状態フラグを載せ、どのOSも解析できるようにする必要があります。
| 機能 | オーナー電話 | 見知らぬ人の電話(非オーナー) |
|---|---|---|
| タグ位置を表示 | 可(リアルタイム+履歴) | 「近くで最後に見た」のみ |
| 音を鳴らせる | 可(いつでも) | 可(分離枠の後) |
| 警告を受ける | 不可(本人がオーナー) | 可(未知トラッカー警告) |
| タグを無効化 | 可(ペアリング解除) | 限定的(物理/OS手順) |
オフライン検索:所有者を隠す暗号
巧みな点は、*見知らぬ人の電話が、互いの身元を知らずにタグの位置をオーナーへ報告する方法*です。これが「Find My」/オフライン検索モデルです。
- タグはマスター秘密鍵を持ちます。各時間間隔*i*(多くは1時間)について、新しい公開鍵 `PK_i = Derive(master_priv, i)` を導出し、アドバタイジングパケットに(またはその短いハッシュを)載せて送信します。
- `PK_i` を受信したファインダー電話は、自身のGNSS/Wi-Fi位置を読み、`PK_i` で `(location, timestamp)` を暗号化し、リレーサーバへ暗号文をアップロードします。アカウントも身元も不要です。
- オーナーは `master_priv` と現在の間隔*i* を知っているので、対応する秘密鍵を再計算し、アップロードされた暗号文を取得して位置を復号します。
プライバシー特性:リレーサーバが見るのは不透明な暗号文のみです。同じタグの2回の発見を紐付けできず(鍵は回転する)、所有者も判別できません。報告を結びつけるのは所有者のマスター鍵だけです。
小さなタグへのエンジニアリング制約
コイン電池デバイスにとって厳しいのはここです。
- 暗号コスト。 Cortex-M0+/M4でのECCスカラー乗算は数百ミリ秒〜数秒かかり、mA級の電流を消費します。CR2032で1時間ごとに鍵を回転・再導出するのは非現実的です。そのためタグは現在の `PK_i` をキャッシュし、間隔境界でのみ再計算します。多くの場合、重い導出をオーナーの電話にオフロードし、将来の鍵を小バッチ事前計算してペアリング接続経由で送り込みます。
- クロック漂移。 鍵回転は時刻で索引されます。タグが電源を失う(電池抜き)と間隔索引がリセットし、電話が索引を再同期するまでオーナーは報告を復号できません。ファームウェアは索引を不揮発メモリに保存し、漂移を許容しなければなりません。
- 誤検知制御。 オーナー電話が一瞬BLE圏外でもタグは発報してはいけません。見逃しカウンタ+モーションゲート+長い不在限界が誤報を稀にします。
- 改ざん防止。 スピーカーと分離フラグはファームウェアから無効化しにくくする必要があります。準拠タグは分離後も生き残る「サイレントモード」を公開しません。
追跡防止を行うタグの大まかな消費電力:
| 動作 | 電流 | デューティ |
|---|---|---|
| 加速度センサポール(動き) | 5-50 uA | 1 Hz |
| オーナートークン受信(RX) | 3-6 mA | 数ms/広告間隙 |
| 鍵キャッシュ提供(BLE) | 1-3 mA | 散発 |
| スピーカー警告 | 20-80 mA | バースト、稀 |
| 基本広告 | 5-50 uA | 連続 |
常時オンの主コストは加速度センサと定期的なRXリッスンです。それ以外は稀です。分離状態とスピーカーは日常ではないため、CR2032でも数か月持ちます。
準拠タグを出荷するためにOEMが実装すべきこと
人が運ぶBLEタグを作る場合、最低限のファームウェア要件は以下です。
1. 認証付きオーナー在席検知(ペアリング電話からの署名付き回転トークン)。
2. 分離タイマー+モーションゲート(仕様の不在枠)。
3. 可聴警告(dB/遅延要件を満たし、除去不可)。
4. 分離状態フラグをBLE広告に載せ、どのOSも未知トラッカー警告を出せるように。
5. オフライン検索の鍵回転(検索ネットワークへ参加する場合)と再起動間の索引永続化。
もしタグが常時ゲートウェイ監視下の*産業資産タグ*なら、作業者がコートに忍ばせる悪用も可能です。多くのフリートはフリートサーバを「オーナー」とみなして解決します。サーバがゲートウェイリンク越しに在席を確認し、限界を超えてサーバと疎遠になったタグは同じ分離挙動へ遷移します。ただし警告は電話ではなくセキュリティへ回します。
まとめ
追跡防止はチェックボックスではありません。それは状態機械(在席→不在→分離)、消せないスピーカー、ベンダー間フラグ、そして所有者を匿名に保つ任意の暗号です。最初から組み込みましょう。準拠しないタグは今やスマートフォンOSから敵対的とみなされ、目にしたユーザーに警告されるからです。
