Upgrade to Pro — share decks privately, control downloads, hide ads and more …

"Actual" Security in Microcontroller Ruby!?

sylph01
December 07, 2024
66

"Actual" Security in Microcontroller Ruby!?

12/7/2024 @ KeebWorld Conference 2024 https://keebkaigi.org/2024/

sylph01

December 07, 2024
Tweet

Transcript

  1. 3

  2. 4

  3. RP2350 Raspberry Pi Pico 2 世代の石。 ARM Cortex-M33 Dual-core, 150MHz

    520KB on-chip SRAM up from 260KB! ARM TrustZone 搭載 「$5 で買えるTEE 」 8KB のOTP を持つ 8
  4. 10

  5. 実際にやってみる Raspberry Pi Foundation が主催している "RP2350 Hacking Challenge" (https:/ /github.com/raspberrypi/rp2350_hacking_challenge)

    というレポジ トリにOTP への書き込みとBoot Signing のサンプルがあるのでそれを試し てみる。 11
  6. OTP への書き込み ~/projects/rp2350_hacking_challenge$ ./write_otp_secret.sh picotool otp set -e 0xc08 0xc0ff

    ROW 0x0c08 OLD_VALUE=0x000000 picotool otp set -e 0xc09 0xffee ROW 0x0c09 OLD_VALUE=0x000000 ... 12
  7. 何をしている picotool otp set -e 0xc08 0xc0ff アドレス 0x0c08 に

    0xc0ff という値を書き込む。 picotool otp get -e 0xc08 | grep VALUE アドレス 0x0c08 から値を読み出し、出力のうち VALUE と書かれた行 を取り出す。これは otp get が一部のアドレスに対して説明を付与す ることがあるため。 15
  8. 何をしている 0xc0ff を書いたのに VALUE 0x22c0ff が出てくるのはなんで? →OTP はECC で保護されている領域で、以下のように構成される: 23:22

    がBit Repair by Polarity (BRP) フラグ 21:16 がModified Hamming ECC 15:0 がデータ本体 OTP をデータの物理的な破壊によって変更するのはかなり困難。 https:/ /datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf 13.6. Error Correction Code (ECC) 16
  9. enable_secureboot.sh やっていることは picotool otp load otp.json で、 otp.json には boot_flags1

    : {"key_valid":1} bootkey0 : 公開鍵のフィンガープリント crit1 : {"secure_boot_enable":1} が含まれる。これは CMakeLists.txt 中の pico_set_otp_key_output_file(target_name /path/to/otp.json) で作るよう指示される。 https:/ /datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf 5.10.1. Secure Boot 17
  10. CMakeLists.txt で指定する内容 pico_set_binary_type : no_flash でSRAM から実行 pico_sign_binary : 指定した鍵ファイルで署名することを指示

    pico_hash_binary : バイナリのハッシュを取ることを指示 pico_package_uf2_output : SRAM 上で実行されるパッケージ化バ イナリを作る pico_set_otp_key_output_file : otp.json の位置を設定 pico_add_extra_outputs : これを呼ぶことで sign と hash が実 行される 18
  11. 実際はどうやって実行されてる? CMakeLists.txt で上記のフラグを有効にしていると、 pico- sdk/tools/CMakeLists.txt 内 picotool_postprocess_binary にて picotool seal

    を呼ぶことでバイナリの署名をとっている。 Encrypted Boot の際の暗号化も同 picotool_postprocess_binary 内。 https:/ /github.com/raspberrypi/pico-sdk/blob/efe2103f9b28458a1615ff096054479743ade236/tools/CMakeLists.txt#L424 19
  12. 22

  13. データシートを読んでみる Chapter 10. Security Chapter 13. OTP あたりが関係するところ。 Chapter 13

    にはOTP ハードウェアの詳細やシステム利用部分のレイアウ トなどが記述してある。 以下、セキュリティ機能(Chapter 10) に関するかなりhigh-level な overview 。 23
  14. 10.1.1 Secure Boot 署名とはsecp256k1 で暗号化されたSHA256 ハッシュ 以下の手順で検証される: バイナリを読み込むときにimage code とdata

    からSHA256 を計算 image に含まれる公開鍵を使って署名からハッシュを復号 最初の手順で得たハッシュと復号で得たハッシュを照合 得た公開鍵とOTP 中の公開鍵フィンガープリントを照合 他にバージョン番号のダウングレード防止もついている。 24
  15. 10.1.2 Encrypted Boot ペイロードのバイナリに対して署名を付与する その後署名まで含めてencryption key で暗号化する バイナリに復号のためのコードを付与する 復号コードまで含めた署名を改めて計算し付与する 復号化のためのコードはbootrom

    ではなくイメージに含まれる。電力解 析攻撃の対策が理由とされている(その対策として共通鍵暗号部分のみ アップグレードができるようにしている) 。 25
  16. 27

  17. PicoRuby で使える? Boot Signing/Encrypted Boot 自体はビルド手順にちょっと手を加え ることでできそう もっともセキュアブートによる保護を得られるのは .uf2 の部分だ

    け PRK Firmware の keymap.rb も抱き込んでしまえば保護が得ら れるが現在はそうなっていない 抱き込んじゃうとPRK Firmware の最大の利点であるレイアウト 変更の容易性が失われる… 31
  18. PicoRuby で使える? RP2350 固有の機能をPicoRuby から使うにはPicoRuby 側に手を入れ る必要がある OTP の値を読む Secure

    モードに閉じ込めておきたい Secure モードとNon-Secure モードの区別?Ruby に対してど うやって見せる? RP2350 には乱数生成器(TRNG) がついているのでそれもほしい SHA256 のアクセラレータも使える? 32
  19. 33