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
66
"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
13
Updates on PicoRuby Networking, HPKE (and maybe more)
sylph01
1
210
Adding Security to Microcontroller Ruby
sylph01
2
3.2k
Secure Messaging at IETF 118
sylph01
0
74
Adventures in the Dungeons of OpenSSL
sylph01
0
480
Community & RubyKaigi Showcase @ Ehime.rb Reboot Meetup
sylph01
0
300
Build and Learn Rails Authentication
sylph01
8
2k
Email, Messaging, and Self-Sovereign Identity (2021/05/28 edition)
sylph01
0
280
DNS Encryption and Its Controversies
sylph01
0
720
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Designing for humans not robots
tammielis
250
25k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
450
Code Reviewing Like a Champion
maltzj
521
39k
Producing Creativity
orderedlist
PRO
342
39k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Mobile First: as difficult as doing things right
swwweet
222
9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
900
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