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

セキュアエレメントとIOTデバイスセキュリティ2

 セキュアエレメントとIOTデバイスセキュリティ2

Kentaro Mitsuyasu

May 06, 2022
Tweet

More Decks by Kentaro Mitsuyasu

Other Decks in Technology

Transcript

  1. Agenda • 自己紹介 • きっかけ • IoTセキュリティの潮流 • セキュアエレメントについて ATECC608B

    Deep Dive • Raspberry piでのATECC608B • セキュアで簡単なプロトタイプ環境 • 展望 • まとめ
  2. 自己紹介 インフラの出身で、IT,セキュリティのビジネスをしている会社で働いています。 IoTLT, IoTSecJPのコミュニティへお邪魔しております。 CBAPⓇ(Certified Business Analysis Professional) 令和3年秋季 情報処理安全確保支援士試験

    合格 自宅でいろいろやってきました。 自宅外向けDNS AD構築(Samba4) Nextcloudサーバー運用 自宅Gluster分散ファイルシステム構築(infiniband) 自宅YAMAHA RTX830運用 Jupyter notebook GPU 機械学習サーバー(nvidia Geforce RTX2070) Volumio Airplayサーバー 個人用ngrokサーバー構築 https://www.slideshare.net/KentaroM itsuyasu1/ss-12042350
  3. IoTセキュリティの潮流 証明書、各クラウドベンダーの接続方法 代表的なAWS IoT,Azure IoTともにX509証明書による接続 クラウド側からデバイスの証明書と秘密鍵をダウンロードし、 デバイスに格納、接続時に使用する。 デバイス側は悪意のあるものに渡った時に秘密鍵を守れない。 それを守る方法として Hardware

    Root-of-Trustという仕組みで 秘密鍵を守ることが望ましい。 参考資料: IoT開発におけるセキュリティ設計の手引き 独立行政法人情報処理推進機構 https://www.ipa.go.jp/security/iot/iotguide.html 対応している仕組み: Arm Trustzoneとしてチップ内部に融合 セキュアエレメントとしての専用チップ
  4. セキュアエレメント比較 ATECC608B SE050(C) Optiga Trust M メーカー Microchip NXP Infineon

    インターフェース I2C(経路暗号化対応),SWI I2C(経路暗号化対応) 暗号演算 楕円暗号(ECC) 楕円暗号(ECC)、RSA 楕円暗号(ECC)、RSA 楕円暗号 NIST P-256 ECC NIST (192 to 521 bit) Brainpool (160 to 512 bit) Twisted Edwards Ed25519 Montgomery Curve25519 Koblitz (192 to 256 bit) Barreto-Naehrig Curve 256 bit ECC : NIST curves up to P-521, Brainpool r1 curve up to 512, RSA暗号 - up to 4096 bit up to 2048 共通鍵暗号 AES-128 AES 128, 192 and 256 bit and DES keys with single DES, 2K3DES and 3K3DES AES up to 256 ハッシュ SHA-256 SHA-224/256/384/512 HMAC up to SHA512 記憶領域 1.1KB 50KB 10KB 価格(1個当たり) 87円 476円 192円 パッケージ 8pin SOIC,DFN 20pin QFN 10pin DFN 製品ファミリ 限定機能のみの ATECC108Aなど 限定機能のみのSE050(A)、SE050(B) ソフトウェアカスタマイズができるSE051 Optiga Trust B, Optiga Trust X 採用実績 Google Coral SoM,Arduino MKR Wifi Amazon Dash Button 2nd gen.(ATECC108A) ZYMBIT security module NervesKey for NervesHub Adafruit ATECC608 Breakout Coldcard Bitcoin hardware wallet etc. Atmark Techno Armadillo IoT G3,G4 Arduino Portenta H7 MIKROE PLUG&TRUST CLICK Adafruit Infineon Trust M Breakout Board MIKROE TRUST M CLICK 対応規格 ー Security certification CC EAL6+ (HW+JCOP) JavaCard version 3.0.5 GlobalPlatform specification version GP 3.0 Security certification CC EAL6+
  5. セキュアエレメントのセットアップ ▪上からATECC608B,Optiga Trust X,SE050 それぞれ面実装パッケージのため、変換基盤へ はんだ付け。 基本は3.3VとGND、I2C SCL,SDAを接続させて 通信するが、 Optiga

    Trust XはRSTピンのGPIO制御、 SE050はPin15 VOUT をPin18 VCCへの接続が 必要。 ホストはESP32-DevKitC I2Cは100kHzでピン21,22へ接続 ▪開発環境 VSCode+platformio ESP-IDF 3.30
  6. セキュアエレメントのセットアップ ▪デバイスの認識: まずESP32からI2CScanner(arduinoのサンプルプログラム)を実行し、 I2Cバス上にデバイスが見つけられるかテスト。 ATECC608B: Scanning... device found on I2C

    port 0 at address 0x60 ! done SE050: Scanning... device found on I2C port 0 at address 0x48 ! done Optiga Trust XはI2CScannerではデバイスが見つからない。 メーカーライブラリでパスするかどうかを確認する。 https://github.com/Infineon/arduino-optiga-trust-x/blob/master/examples/selfTest/selfTest.ino
  7. ATECC608B Deep Dive ▪ATECC608BはTrust Platform という事前設定対応製品がある。 標準品はコンフィグをロックしないと使えないうえ、設定が難解。 ・事前設定済みで証明書が書 き込み済み。変更はできない。 ・最小発注数は10

    ・AWS IoT,Azure IoT Hub, Google IoTなどのクラウド 接続対応 ・事前設定済みで証明書が書 き込み済み。変更可能。 ・最小発注数は2,000 ・個別認証局利用可能 ・セキュアブート、OTA認証、 ファームウェア確認、知的財 産保護、メッセージ暗号化、 IO保護などのユースケース利 用可能 ・さらなるカスタマイズが変 更可能。 ・最小発注数は4,000 ・工場出荷時の指定プロビ ジョニング対応 ・フルカスタマイズ可能
  8. ATECC608B Deep Dive ▪ATECC608B-TNGTLSを使って、セキュアエレメントの基本機能と セキュリティ対策シーンを検討する。 M5Stack + ATECC608B-TNGTLS 1、サーバー・クライアント認証、 TLS通信暗号化

    2、AES暗号化 公式ドキュメントは以下リンクが正しい。 https://ww1.microchip.com/downloads/jp/DeviceDoc/40002112B_JP.pdf ATECC608シリーズ共通のライブラリ Cryptoauthlibを使用する。 https://github.com/MicrochipTech/cryptoauthlib Cryptoauthlibのドキュメント https://github.com/MicrochipTech/cryptoauthlib/blob/main/cryptoauthlib-manual.pdf
  9. ATECC608B Deep Dive ▪デバイスの内部概要:合計約1.1KBのEEPROMメモリを持つ。 コンフィグはロックされていて直ちに利用可能。 書き込み済み証明書の利用のため、ユーザーが自由に使える領域は スロット5とスロット8の36バイト、416バイトのみ。 これ以外にメモリ上に仮想鍵(Tempkey)を置いて利用可能 スロ ット

    ブロッ ク バイト ビット 名前 説明 0-7 2 36 288 Private or Secret Key スロット2~4が秘密鍵、スロット5がI/O保護鍵もしくは 一般利用として利用可能。ロック対応 8 13 416 3328 Data 平文読み書き可能なデータを置ける少し大きいゾーン。 一般利用可能でロックも可能 9- 15 3 72 576 Public Key, Signature or Certificate スロット9はAES鍵置き場、書き込めるが読み出し禁止
  10. サーバー・クライアント認証、 TLS通信暗号化 ▪ATECC608B-TNGTLSでAWS IoTへの接続を行う際はMulti-Account Registrationを使う。自前のCAを不要にし、手軽にセキュア接続を実現 ATECC608B- TNGTLS ATECC608B 従来は自前でCAを作成し、証明書定義を作成、ATECC608B へプロビジョニング、CAをRegistration

    Codeを使って AWS IoTへ登録するJITR(ジャストインタイム登録) CAはMicrochipを利用、事前に証明書リストをAWS IoTへ 登録しておき、証明書プロビジョニング済みである ATECC608B-TNGTLSが接続できるMulti-Account Registration
  11. サーバー・クライアント認証、 TLS通信暗号化 ATECC608が対応できる楕円曲線暗号を選択 secp256r1 別名 prime256v1 または NIST P-256(RFC4492) 256bitの秘密鍵と256bit(X)+256bit(Y)の公開鍵で構成される。

    それぞれ、32バイト、64バイトとなる。 また、署名は256bit(r)+256bit(s)だが、ASN.1という形式で保存されており、 数バイトの変動がある。 ASN.1のヘッダー(オフセット計算)を付加して72~73ビット程度。
  12. サーバー・クライアント認証、 TLS通信暗号化 ▪共通鍵の鍵交換による暗号化 ECDH計算 秘密鍵 公開鍵 デバイス側 公開鍵 秘密鍵 サーバー側

    秘密鍵 公開鍵 公開鍵 秘密鍵 共通鍵 共通鍵 鍵計算 鍵計算 プリマスターシークレ ットとして通信を暗号 化する共通鍵となる ATECC608が担当 MBEDTLS_ECDH_GEN_PUBLIC_ALT
  13. サーバー・クライアント認証、 TLS通信暗号化 ▪I/O保護鍵の用途:ECDHのプリマスターシークレットの保護 クラウド インターネット プロセッサ I2C ATECC608B ECDH用の鍵生成リクエスト →

    Tempkey(0xFFFF)へ鍵ペア作成 ECDH用の鍵生成 ATECC608BのTempkey公開鍵受領 ← Tempkeyの公開鍵を返却 ATECC608BのTempkey公開鍵受領 ← ATECC608BのTempkey公開鍵をクラウドへ送信 クラウドの公開鍵送信 → クラウドの公開鍵受領 クラウドの秘密鍵とTempkeyの公開鍵でECDH計算 クラウドの公開鍵をATECC608Bへ転送 → Tempkeyの秘密鍵とECDH計算 プリマスターシークレット生成 プリマスターシークレット受領 ← プリマスターシークレット返却 共通鍵生成 共通鍵生成 暗号通信開始 ⇔ 暗号通信開始 atcab_ecdh_tempkey_ioenc (クラウドの公開鍵, プリマスターシークレットの戻り値, I/O保護鍵); ATECC608B-TNGTLS I2Cバスにロジアナを当てて覗き見られるのを防ぐ
  14. 安全な場所 AES暗号化 ▪使い方 ラズベリーパイでも確認できた。 https://github.com/kmwebnet/ECC608-TNG-AES-Test-raspi.git atcab_write_bytes_zone()で スロット9にAES鍵を書き込む 鍵は16バイト(AES-128)だが 32バイト書き込みしか許可されていないため、 atcab_random()で内部の

    NIST 800-90 A/B/C乱数生成器で32バイトを得て書き込む atcab_aes_gcm_init_rand()で atca_aes_gcm_ctx_t構造体を初期化し IV(初期ベクトル)を生成 atcab_aes_gcm_aad_update()で AAD(追加認証データ)を書き込み データが長い場合何回かに分けて書き込める atcab_aes_gcm_encrypt_update()で 暗号化したい平文を書き込みながら暗号文を得る 16バイトごとにしか書き込めないので 長いデータは何回かに分けて書き込む atcab_aes_gcm_encrypt_finish()で 書き込み終了しTagを生成する atcab_aes_gcm_init ()で atca_aes_gcm_ctx_t構造体を初期化し 復号したい暗号文のIV(初期ベクトル)を入力 atcab_aes_gcm_aad_update()で AAD(追加認証データ)を書き込み データが長い場合何回かに分けて書き込める atcab_aes_gcm_decrypt_update()で 復号したい暗号文を書き込みながら平文を得る 16バイトごとにしか書き込めないので 長いデータは何回かに分けて書き込む atcab_aes_gcm_decrypt_finish()で 書き込み終了し復号したい暗号文のTagを入力して AADを認証する 共通鍵生成 暗号化 復号 鍵を取り出しておけば デバイスとの暗号文やり取りに使える
  15. Linux 5.10.92-v7+ armv7l bullseye /** ¥brief default configuration for an

    ECCx08A device */ ATCAIfaceCfg cfg_ateccx08a_i2c_default = { .iface_type = ATCA_I2C_IFACE, .devtype = ATECC608, { #ifdef ATCA_ENABLE_DEPRECATED .atcai2c.slave_address = 0x6A, #else .atcai2c.address = 0x6A, #endif .atcai2c.bus = 1, #ifdef __linux__ .atcai2c.baud = 100000, #else .atcai2c.baud = 100000, #endif }, .wake_delay = 1500, .rx_retries = 20 }; Raspberry piでのATECC608B ▪Raspberry piでは、以下URLに従ってインストールする。 https://github.com/MicrochipTech/cryptoauthlib/wiki/PKCS11-TNGTLS cryptoauth_testでデバイスをテストできる ソースの修正箇所 cryptoauthlib/lib/atca_cfgs.c
  16. $ sudo vi /etc/apt/sources.list (deb-src行のコメントを取る) $ sudo apt update $

    sudo apt-get build-dep libengine-pkcs11-openssl1.1 gnutls-bin libgcrypt-dev p11-kit $ git clone https://github.com/OpenSC/libp11.git $ cd libp11 $ ./bootstrap $ ./configure $ make $ sudo make install $ cd /var/lib/cryptoauthlib/ $ cp slot.conf.tmpl 0.conf $ vi 0.conf label = MCHP interface = i2c,0x6a,1 device = ATECC608A-TNGTLS $ sudo vi /usr/share/p11-kit/modules/cryptoauthlib.module module: /usr/lib/arm-linux-gnueabihf/libcryptoauth.so critical: yes trust-policy: yes managed: yes log-calls: no Raspberry piでのATECC608B ▪証明書読み取り PKCS#11のセットアップ 証明書リストの表示 $ p11tool --list-tokens Token 1: URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=2 3F9B2CA83313501;token=MCHP Label: MCHP Type: Hardware token, Trust module Flags: RNG, uPIN uninitialized Manufacturer: Microchip Technology Inc Model: ATECC608A Serial: 23F9B2CA83313501 Module: /usr/lib/arm-linux-gnueabihf/libcryptoauth.so $ p11tool --list-all-certs 'pkcs11:token=MCHP;type=cert' Object 0: URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=2 3F9B2CA83313501;token=MCHP;object=device;type=cert Type: X.509 Certificate (EC/ECDSA-SECP256R1) Expires: Thu Dec 31 23:23:23 2037 Label: device ID: Object 1: URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=2 3F9B2CA83313501;token=MCHP;object=signer;type=cert Type: X.509 Certificate (EC/ECDSA-SECP256R1) Expires: Thu Dec 31 23:23:23 2037 Label: signer Flags: CKA_CERTIFICATE_CATEGORY=CA; CKA_TRUSTED; ID:
  17. $ p11tool --export-stapled 'pkcs11:token=MCHP;object=device;type=cert' | openssl x509 -text -noout Certificate:

    Data: Version: 3 (0x2) Serial Number: 51:df:6a:01:f9:17:ab:43:91:3c:42:08:b7:0a:ad:83 Signature Algorithm: ecdsa-with-SHA256 Issuer: O = Microchip Technology Inc, CN = Crypto Authentication Signer 2700 Validity Not Before: Mar 11 07:00:00 2020 GMT Not After : Mar 11 07:00:00 2048 GMT Subject: O = Microchip Technology Inc, CN = sn0123F9B2CA83313501 Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:41:82:3c:68:9c:43:b0:d3:a5:64:e6:c2:09:7d: cb:b9:f2:ce:81:6c:c3:cd:e2:56:0f:19:96:e4:d9: a3:b8:47:ae:f5:e9:49:07:6b:7b:14:99:8a:ee:72: d7:a1:01:7d:c3:fa:95:95:8d:c2:8c:43:a4:f4:04: 18:4d:14:e6:3b ASN1 OID: prime256v1 NIST CURVE: P-256 … Signature Algorithm: ecdsa-with-SHA256 30:46:02:21:00:f4:10:94:85:3d:31:af:ac:a2:cd:a1:42:e9: 0f:6b:c3:00:af:ee:8f:32:f2:c4:1c:c2:85:42:73:bc:ce:8b: 1b:02:21:00:a8:41:cb:4d:da:88:68:87:fc:ec:37:66:04:87: 2a:51:fd:f2:c4:01:41:e3:7b:01:f4:ed:7f:ce:48:47:8d:ce Raspberry piでのATECC608B ▪証明書読み取り 証明書が読み取れた AWS IoTにて証明書登録、ポリシーをアタッチ後、メッセージ送信
  18. セキュアで簡単なプロトタイプ環境 プロトタイプ段階から開発クライアント、サーバー、および デバイス全体を保護します このプロジェクトは、有名なESP32プラットフォームで次の機能を 有効にします。 デバイスの起動制御 セキュアブート、フラッシュ暗号化 ハードウェアルートオブトラストによるTLS通信暗号化 OTA機能 Wifi接続管理,

    SSIDとパスワードの暗号化保存 開発プラットフォームに関係なく、ファームウェアを安全に更新します 開発のスピードアップ 特定のサービスだけでなく、オープンに使用できます AWSおよびAzureへの安全なデバイス接続をサポートします
  19. セキュアで簡単なプロトタイプ環境 セキュアOTA, ステータス 更新,Wi-fi接続支援 ファームウェアは セキュアブートと フラッシュ暗号化 通信はTLS接続 開発者は様々なツールを 利用可能

    署名付き ファームウェアを アップロード server client bootloader 開発者のWindowsPC上の アプリケーション Electron+React 固定IPを持つパブリック クラウドに構築するサーバー Node.js ATECC608で保護された ESP32デバイス アーキテクチャ