Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
"Actual" Security in Microcontroller Ruby!?
Search
sylph01
December 07, 2024
0
77
"Actual" Security in Microcontroller Ruby!?
12/7/2024 @ KeebWorld Conference 2024
https://keebkaigi.org/2024/
sylph01
December 07, 2024
Tweet
Share
More Decks by sylph01
See All by sylph01
Everyone Now Understands AuthZ/AuthN and Encryption Perfectly and I'm Gonna Lose My Job
sylph01
1
20
Updates on PicoRuby Networking, HPKE (and maybe more)
sylph01
1
230
Adding Security to Microcontroller Ruby
sylph01
2
3.2k
Secure Messaging at IETF 118
sylph01
0
80
Adventures in the Dungeons of OpenSSL
sylph01
0
510
Community & RubyKaigi Showcase @ Ehime.rb Reboot Meetup
sylph01
0
310
Build and Learn Rails Authentication
sylph01
8
2.1k
Email, Messaging, and Self-Sovereign Identity (2021/05/28 edition)
sylph01
0
290
DNS Encryption and Its Controversies
sylph01
0
730
Featured
See All Featured
Fireside Chat
paigeccino
34
3.1k
Navigating Team Friction
lara
183
15k
How GitHub (no longer) Works
holman
312
140k
Building Adaptive Systems
keathley
38
2.4k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Speed Design
sergeychernyshev
25
730
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Transcript
"Actual" Security in Microcontroller Ruby!? Ryo Kajiwara/ 梶原 龍 (sylph01)
2024/12/07 @ KeebWorld Conference 2024 1
だれ / なに 2
3
4
RubyKaigi followup でこんなこと言っ てましたね? 5
今日の話 RP2350 のセキュアブートで遊んでみた データシートを読んでみた キーボードへのインパクトは? PicoRuby へのインパクトは? 6
注意 いつもの「暗号には気をつけよう」に加えて チップに対して不可逆な操作を行います One-Time Programmable Memory (OTP) への書き込みは名前の通 り不可逆です セキュアブートはこの領域に鍵のフィンガープリントを書き込
むことで行います 鍵のバックアップをし損ねるとそのRP2350 は文鎮です 7
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
セキュアブート Boot Signing 秘密鍵を使って署名したファームウェアを書き込み、公開鍵を 使って(※詳細後述)署名を検証 通常セキュアブートといえばこっち RP2350 においてはRISC-V コアを完全に無効化する Encrypted
Boot 暗号化したバイナリを書き込み、OTP に書き込んだ鍵を使って 復号、プログラムを実行する AES を使っているので共通鍵暗号 9
10
実際にやってみる Raspberry Pi Foundation が主催している "RP2350 Hacking Challenge" (https:/ /github.com/raspberrypi/rp2350_hacking_challenge)
というレポジ トリにOTP への書き込みとBoot Signing のサンプルがあるのでそれを試し てみる。 11
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
もう1 回やると ~/projects/rp2350_hacking_challenge$ ./write_otp_secret.sh picotool otp set -e 0xc08 0xc0ff
ROW 0x0c08 OLD_VALUE=0x22c0ff ERROR: Cannot modify OTP ECC row(s) 13
OTP からの読み出し ~/projects/rp2350_hacking_challenge$ ./read_otp_secret.sh VALUE 0x22c0ff VALUE 0x14ffee ... 14
何をしている picotool otp set -e 0xc08 0xc0ff アドレス 0x0c08 に
0xc0ff という値を書き込む。 picotool otp get -e 0xc08 | grep VALUE アドレス 0x0c08 から値を読み出し、出力のうち VALUE と書かれた行 を取り出す。これは otp get が一部のアドレスに対して説明を付与す ることがあるため。 15
何をしている 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
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
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
実際はどうやって実行されてる? 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
lock_chip.sh もっと強力にチップを保護する。以下のフラグを書き込む: デバッグの無効化 他のブートキーを無効化 Glitch Detector を有効化し最も強い感度で利用 fault injection からの保護を行う
20
バイナリを書いてみた 普通にUSB マスストレージに署名された .uf2 を落とすだけ。 違う鍵で署名された .uf2 を落とすと 再起動すらしなかった secure_version
はUSB すら無効化さ れているので /dev/ttyACM0 すら出て こない 21
22
データシートを読んでみる Chapter 10. Security Chapter 13. OTP あたりが関係するところ。 Chapter 13
にはOTP ハードウェアの詳細やシステム利用部分のレイアウ トなどが記述してある。 以下、セキュリティ機能(Chapter 10) に関するかなりhigh-level な overview 。 23
10.1.1 Secure Boot 署名とはsecp256k1 で暗号化されたSHA256 ハッシュ 以下の手順で検証される: バイナリを読み込むときにimage code とdata
からSHA256 を計算 image に含まれる公開鍵を使って署名からハッシュを復号 最初の手順で得たハッシュと復号で得たハッシュを照合 得た公開鍵とOTP 中の公開鍵フィンガープリントを照合 他にバージョン番号のダウングレード防止もついている。 24
10.1.2 Encrypted Boot ペイロードのバイナリに対して署名を付与する その後署名まで含めてencryption key で暗号化する バイナリに復号のためのコードを付与する 復号コードまで含めた署名を改めて計算し付与する 復号化のためのコードはbootrom
ではなくイメージに含まれる。電力解 析攻撃の対策が理由とされている(その対策として共通鍵暗号部分のみ アップグレードができるようにしている) 。 25
10.1.3 Isolating Trusted and Untrusted Software セキュアブートで起動した後はSecure モードとNon-Secure モードのソフ トウェアを区別でき、ハードウェアへのアクセスやOTP
へのアクセスを 制限できるようになる。 26
27
キーボードにとって何が嬉しいの? ファームウェアの悪意のある書き換えから身を守ることができる、とい うことは: 不在の間にキーマップを勝手に書き換えられることから身を守るこ とができる ネットワークにつながる板だった場合にキーストロークの悪意のあ るモニタリングと送信から身を守ることができる キーボードがネットワークにつながる?→PicoRuby はWiFi 対応
したのでできてしまうんですね… 28
ぶっちゃけプログラマブルな自作キー ボードって高いコンプライアンス要件 にとっては悪夢では 外部から制限付きとはいえ計算機を持ち込んでいるに等しい。WiFi に繋 がるキーボードなんてもってのほか。 ファームウェアが信用できない場合は信用できない計算機を持ち込んで いることになる。動かしているファームウェアに確証が持てることはそ の点で嬉しい(本当に?) 。
29
OTP の存在がかなり嬉しい デバイスに恒久的な初期設定値を焼くことができる 身近なところだとデバイスの識別子とか セキュアモードからしか読めないOTP 領域を設定できるので 鍵を安全に保管することができる 30
PicoRuby で使える? Boot Signing/Encrypted Boot 自体はビルド手順にちょっと手を加え ることでできそう もっともセキュアブートによる保護を得られるのは .uf2 の部分だ
け PRK Firmware の keymap.rb も抱き込んでしまえば保護が得ら れるが現在はそうなっていない 抱き込んじゃうとPRK Firmware の最大の利点であるレイアウト 変更の容易性が失われる… 31
PicoRuby で使える? RP2350 固有の機能をPicoRuby から使うにはPicoRuby 側に手を入れ る必要がある OTP の値を読む Secure
モードに閉じ込めておきたい Secure モードとNon-Secure モードの区別?Ruby に対してど うやって見せる? RP2350 には乱数生成器(TRNG) がついているのでそれもほしい SHA256 のアクセラレータも使える? 32
33
Pico 2 W クルーーーー!!! ※日本での発売は技適認証待ち 34
まとめ RP2350 のセキュアブートやOTP を使ってみたよ 暗号鍵とかを安全に保管できるよ PicoRuby に来るにはもうちょっとやることがあるよ 然るべきときに話す機会がやってくるかも 35