自動車キーフォブ信号のリバースエンジニアリング 第1部
(0x44.cc)- カナダでの Flipper Zero 禁止論争を背景に、自動車キーフォブの RF 信号を実際にキャプチャ・分析し、単純なリプレイ攻撃がどこまで可能かを確認する
- RTL-SDR は 24〜1750MHz 範囲の生の I/Q データを受け取り、可視化・保存・分析でき、Flipper Zero の CC1101 は送受信可能だが正しい RF 設定が必要
- 433.92MHz ではボタン入力ごとに短いバーストが3つ見られ、中心周波数の両側にある2つのピークは、0 と 1 を異なる周波数に載せる 2-FSK と解釈された
- Universal Radio Hacker で FSK、50 samples/symbol、Manchester II デコードを適用すると、長いデータなしバースト、3つの主要パケット、短い最終パケットという構造が明らかになった
- 信号にはローリングコード用の高エントロピー領域、増加カウンタ、lock/unlock コマンドバイト、パケット順番、XOR チェックサム、syncword が識別され、単純なリプレイだけで大半の自動車を盗むのは難しいという結論につながる
実験の目的と文脈
- ここ数年、RTL-SDR ドングルで無線通信プロトコルを探索してきており、今回は 自動車キーフォブがどのようにデータを送信するのか、そしてリプレイ攻撃の可能性を確認することに焦点を当てる
- 以前にもキーフォブ信号をキャプチャしたことはあったが、テストできる自動車へのアクセスが限られており、有意義な分析まで進められなかった
- 今回の実験は、キーフォブ信号を実際にリバースエンジニアリングして再生するための準備段階であり、基礎的な RF 概念から分析の流れまで追っていく
- カナダでの Flipper Zero 禁止とは対照的に、ほとんどの自動車は単純なリプレイ攻撃だけで盗めるほど脆弱ではない、という問題意識も扱う
- Honda 関連の例外事例として RollingPwn が言及される
使用したハードウェア
-
RTL-SDR
- 約 10 ドルの地上波 TV/ラジオ用 USB ドングルを多目的 RF 受信機に変え、24〜1750MHz 範囲の信号を調査・デコードできる
- RTL-SDR は SDR を利用できる RTL2832U チップのおかげで強力である
- 通常はハードウェアで処理される信号処理を省き、ホストが生の I/Q データへ直接アクセスできる
- 生データを受け取れるため、変調方式、帯域幅、データレートといった具体的設定を事前に知らなくても、受信・可視化・保存した後に自分で分析できる
-
Flipper Zero と CC1101
- Flipper Zero でこの実験に重要なのは Sub-GHz モジュールである
- このモジュールは CC1101 チップベースで、一般的な民生用無線機器で使われる 1GHz 未満の周波数をサポートする
- CC1101 モジュールは単体で 5 ドル以上で購入し、Arduino、Raspberry Pi、USB-to-TTL アダプタと組み合わせて使うこともできる
-
CC1101 と RTL2832U の違い
- Flipper Zero の CC1101 はトランシーバなので、信号の送受信がどちらも可能
- RTL-SDR の RTL2832U は受信と生信号の分析はできるが、送信はできない
- CC1101 は SDR をサポートしないため、完全に処理済みのデータしか返さず、送信信号の RF 設定が合っていなければ有用ではない
- 送受信可能な SDR 機器もあるが、価格は高めである
RF 信号を読むための基本概念
- 無線周波数伝送は、電磁波である電波で信号を送る
- 本来送りたい信号よりも高い周波数の搬送波を使うことで、空中伝送の信頼性を高める
- 周波数は搬送波が 1 秒間に発生する回数であり、一般に通信チャネルの定義に使われる
- 変調は、データを電波上で表現する方法である
- AM は振幅の変化でデータを表す
- FM は周波数の変化でデータを表す
- 帯域幅は変調された RF 信号が占める周波数範囲であり、信号が運べるデータ量に関係する
SDR# で確認したキーフォブ信号
-
ツールと周波数
- SDR# は C# で書かれた無料の DSP アプリケーションで、SDR 向けのリアルタイムスペクトラム可視化と一部の一般的な変調の復調をサポートする
- RTL-SDR ドングルを接続し、標準の DVB-T ドライバではなく WinUSB ドライバを使用する
- 433.92MHz にチューニングすると、近距離リモコンの動作が観測できる
- 433.92MHz は EU と周辺国、そして居住地であるモロッコで使われている標準的な無免許周波数として紹介される
-
観測されたパターン
- 自動車キーフォブのボタンを押すたびに、連続した短いバーストが3つ生成される
- スペクトラム中央の 433.92MHz の両側に 2 つの大きなピークが現れる
- 一般的な変調方式を調べた結果、この形は 2-FSK と一致しているように見えた
- 画面に見える小さなピークは、安価な送信ハードウェアとリモコン・アンテナの距離が近いことによって生じる不要な周波数と見なし、無視した
-
2-FSK の解釈
- FSK は Frequency-Shift Keying の略で、搬送波周波数を複数の離散周波数の間で切り替えながらデータを符号化する周波数変調方式である
- 2-FSK の「2」は、符号化に使うチャネル数を意味する
- この場合は 0 と 1 を異なる 2 つの周波数で符号化するため、観測された 2 つのピークを説明できる
Universal Radio Hacker でビットとバイトを抽出
-
URH を使った分析
- Universal Radio Hacker は無線プロトコル調査のためのオープンソースツール群で、複数の SDR を標準でサポートしている
- URH は信号の復調と変調パラメータの自動検出を提供し、空中を流れるビットやバイトを特定するのに使われる
- 最初は正しいパラメータを見つけられず、誤った結果になった
- 繰り返し信号を一度に複数録音すると自動検出の成功率が上がり、このケースでは 50 samples/symbol、FSK が正しい設定として得られた
-
バースト構造と Manchester デコード
- 信号を拡大すると、SDR# で見た 3 つのバーストが再確認できる
- 2 番目のバーストはさらに 3 つの分離した部分から成っており、分析対象は合計 5 セクションになる
- 各セクションからビット列を自動抽出して 16 進数に変換すると繰り返しパターンが見えたが、同じ 5 つの 16 進数値と多数の
0x55バイトが繰り返され、追加処理が必要だった - URH の Analysis タブで複数のデコードアルゴリズムを試した結果、Manchester II が
0x55バイトを null に変換し、デコードエラーも発生させなかった
-
Manchester 符号化の役割
- Manchester は、信号が論理 low または high の状態に長時間とどまらないようにする単純なデジタル変調方式である
- データ信号を、データと同期が結合された信号に変換することで、clock recovery に有用である
- アナログ媒体はノイズや干渉に弱いため、このような特性はデジタルデータ送信に役立つ
- Manchester では、2 進データを互いに反対の 2 ビットで符号化する
- 例:
0は01、1は10になる、あるいは慣習に応じて逆に使われる
パケット構造とローリングコードの推定
-
ボタン入力ごとに見える構造
- 複数のキャプチャを手動で比較した結果、各ボタン入力は一定の構造を持っていた
- 長いデータなしバーストが 1 つあり、デコードすると null バイト 100 個になる
- 非常によく似ているが 2 バイトが部分的に変化するバーストが 3 つある
- 前の 3 つとかなり似ているが、より短い最終バーストが 1 つ続く
- 真ん中の 3 つのバーストを主要なパケットと見なし、さらに詳しく分析した
- 新しい信号ごとに 1 ずつ増えているように見える増加 ID が見つかった
-
ローリングコードの仕組み
- ローリングコードは、キーレスエントリーシステムで単純なリプレイ攻撃を防ぐために使われる
- 攻撃者が送信を録音し、後で再生して受信機を解錠させる手法を防止する
- 自動車とリモコンは、認証に使うローリングコードを生成するための暗号学的に安全なアルゴリズムに合意している
- 鍵はカウンタを用いて生成・追跡され、リモコンと自動車のカウンタが同期状態を保つ必要がある
- 有効ウィンドウにより、自動車が信号を受信できなかった場合でも、リモコンが同期から外れないようにできる
- 多くの実装では最大 255 回まで範囲外でのボタン操作を許容し、その後はリモコンを手動で再同期しなければならない
-
信号フィールドの識別
- ローリングコードは暗号学的に安全であるため、信号の中で最もエントロピーが高い部分がその実装に関わる領域として識別される
- 先に見つけた増加 ID は、ローリングコードシステムのカウンタだと推定される
- lock と unlock の信号を比較すると、コマンドを表すバイトが識別できた
8= unlock4= lock
順番、チェックサム、syncword
-
パケット順番と思われる値
- 残っていた可変領域の 1 つは、別にキャプチャした信号でも同じ値が繰り返されていた
- 3 つの値を 2 進数で見ると、上位ビットが順番のように増加している
0x6:01100xA:10100xE:1110- 4 番目の最終パケットまで見ると
0x13:10011 の形になり、パケット順番を含むという解釈と一致する - 最下位ビットの変化はこの判断から除外した
-
XOR チェックサム
- 最後のバイトはパケットごとに変わり、信号全体の間でもランダムに見える形で変化する
- パケット末尾のバイトであり、不規則に変化することから、チェックサムである可能性がある
- このバイトと先に分析した順番バイトを XOR すると、各例で固定値が得られる
- 例 1:
0x06 ^ 0xB9 = 0xBF0x0A ^ 0xB5 = 0xBF0x0E ^ 0xB1 = 0xBF
- 例 2:
0x06 ^ 0xCC = 0xCA0x0A ^ 0xC0 = 0xCA0x0E ^ 0xC4 = 0xCA
- すべてのパケットバイトに XOR を適用すると、値は常に 1 だけずれており、先頭 2 バイトがチェックサムから除外されている可能性が高い
- 先頭 2 バイトは、受信機を同期させてデータ開始を示す syncword の役割だと解釈される
最終的な信号構成と次のステップ
- 最初の長いバーストは、非アクティブ状態で低電力モードにある無線受信機を起こし、データ受信の準備をさせる役割を持つ
- リモコンがほぼ同じデータを含むパケットを 3 つ送るのは、送信中に 1 つが破損した場合に備えて信頼性を確保するためである
- 最終的なラベリングの結果、自動車キーフォブ信号は syncword、ローリングコード関連領域、カウンタ、コマンドバイト、パケット順番、XOR チェックサムなどに分けて解釈された
- 次のステップは、この信号形式を Flipper Zero に統合し、読み取り、再シリアライズ、再生をサポートする作業である
- 不正確な情報や改善の余地があれば、GitHub で pull request を送ることができる
まだコメントはありません。