Slide 1

Slide 1 text

セキュアエレメントによるWireGuard のセキュリティ強化 光安 健太郎 セキュアエレメントによるWireGuardのセキュリティ強化

Slide 2

Slide 2 text

Agenda • 自己紹介 • IoTデバイスのリスク • 課題 • WireGuardとは • セキュアエレメントについて • WireGuardのセキュリティ強化 • まとめ

Slide 3

Slide 3 text

自己紹介 インフラの出身で、セキュリティのビジネスをしている会社で働いています。 IoTセキュリティについて研究しています。 SORACOM IoT Meetup ~IoTデバイスセキュリティ 勉強会!セキュアエレメントを学ぶ~ 2022/2/21開催

Slide 4

Slide 4 text

IoTデバイスのリスク 7/27/2023 4 IoTデバイスのセキュリティ対策が不十分だと・・・ いつのまにかサイバー犯罪の加害者に 盗まれて困るデータは無いし、 セキュリティ対策はそこそこ にしておこう 企業の場合、信用失墜にも 悪意のある第3者に ハッキングされボットネットに 参加させられる DDoS 攻撃

Slide 5

Slide 5 text

IoTデバイスのリスク 7/27/2023 5 自動車、制御システム、医療機器などの分野以外、 一般用途のIoTセキュリティのベースラインとして 米国 NISTIR 8259シリーズが公開されている。 IoTデバイスのセキュリティ検討の出発点に最適。 …攻撃者は、IoT デバイスをより容易に侵害し、それを使用してデ バイスの顧客に危害を加えたり、他の組織に対してさらなる悪質な 行為(分散型サービス妨害(DDoS)攻撃など)を行ったりするこ とができるようになる。 本書の目的は、製造者が製造する IoT デバイスの安全性を高める ための推奨事項を提供することである。

Slide 6

Slide 6 text

IoTデバイスのリスク 7/28/2023 6 NISTIR 8259AはIoTデバイスが備えるべき機能のベースラインを記述。 項目 概要 デバイスの識別 IoTデバイスは、論理的にも物理的にも一意に識別できる デバイス構成 IoT デバイスのソフトウェア構成は変更できるが、そのような変更は許可されたエンティ ティのみが実行できる データ保護 保存、または転送されるデータを未承認のアクセスと変更から保護できる インターフェースへの論理アクセス ローカル・インターフェースおよびネットワーク・インターフェース、ならびにそれらの インターフェースで使用されるプロトコルおよびサービスへの論理アクセスを、許可され たエンティティのみに制限することができる ソフトウェア更新 IoT デバイスのソフトウェアは、安全で構成可能なメカニズムを使用して、承認されたエ ンティティのみが更新できる サイバーセキュリティ状態の認識 IoTデバイスは、そのサイバーセキュリティの状態を報告し、その情報を許可されたエン ティティのみがアクセスできるようにすることができる

Slide 7

Slide 7 text

課題 7/27/2023 7 ソフトウェアの開発と、ハードウェアの開発を行うIoTプロジェクトは 広い範囲での開発が必要となり難易度が高い。 特に、ハードウェア側で機能を作りこんでギリギリのシステム資源となった場合、 後からのセキュリティ機能追加はハードウェアのサイジングの見直しになり、 プロジェクトにとって致命的な手戻りとなる。

Slide 8

Slide 8 text

課題 7/28/2023 8 「セキュリティ・バイ・デザイン」の考え方からも、 事前にセキュリティ要件を考慮して、必要な構成を検討しておくことが重要。 WireGuardを用いてIoTプロジェクトのセキュリティのベストプラクティスを 検討してみたい。 IPA セキュリティ・バイ・デザイン 導入指南書 https://www.ipa.go.jp/jinzai/ics/core_human_resource/final_project/2022/ng i93u0000002kef-att/000100451.pdf

Slide 9

Slide 9 text

WireGuardとは WireGuardはシンプルで高速なVPN。最新の暗号技術が用いられ、 Linuxの標準モジュールとして採用されていて、利用が進んでいる。

Slide 10

Slide 10 text

WireGuardとは シンプルとは?ソースコードの規模(lines of code)で比較 4,000 +400,000

Slide 11

Slide 11 text

どう、最新の暗号技術が採用されているのか? Curve25519 ECDH 鍵共有 HKDF 鍵導出 ChaCha20-Poly1305 認証暗号 BLAKE2s ハッシュ WireGuardとは

Slide 12

Slide 12 text

WireGuardの構造 Linux kernel Network Interface eth0 wlan0 wireguard kernel module Linux userspace wireguard-tools rtnetlink kernel⇔network I/F communication netlink kernel⇔userspace I/F Interface config Transfer key pair Device creation, communication WireGuardとは

Slide 13

Slide 13 text

Noise Protocol Frameworkのような最新のイケてる暗号化技術を つかっている?? Noise Protocol Frameworkとは? WireGuardとは

Slide 14

Slide 14 text

2nd.DH calc. Noise Protocol Frameworkとは? Static Secret Static Public Pub Pub Ephemeral Public Ephemeral Secret Handshake comm. Static Public Pub Get in advance Static Public for counterpart Pub Static Public for counterpart (get in advance) Pub Static Public for counterpart Pub Ephemeral Secret 3rd.DH calc. Static Public for counterpart Pub Static Secret 4th.DH calc. Static Secret Pub Ephemeral Secret Static Secret for counterpart Ephemeral Public Pub Ephemeral Public 1st.DH calc. Ephemeral Secret Pub Ephemeral Public WireGuardとは

Slide 15

Slide 15 text

使い方イメージ:安全なメンテナンスネットワーク WireGuardとは IoT Device WireGuard VPN 直接のsshは 接続拒否 管理端末 WireGuardインターフェースを 介してSSH接続 > ssh iotdevice1

Slide 16

Slide 16 text

[Interface] PrivateKey = Address = 10.0.0.51 [Peer] PublicKey = Endpoint = XXX.XXX.XXX.XXX:51820 AllowedIPs = 10.0.0.1/32 もし悪意のある第3者が脆弱性を利用してデバイスに侵入したら、WireGuardの 設定ファイルを入手する可能性がある WireGuardとは /etc/wireguard/wg0.conf 解析 このデバイスの秘密鍵 とIPアドレス 接続先の公開鍵と パブリックIPアドレス IPアドレスレンジ類推

Slide 17

Slide 17 text

[Interface] PrivateKey = Address = 10.0.0.51 [Peer] PublicKey = Endpoint = XXX.XXX.XXX.XXX:51820 AllowedIPs = 10.0.0.0/24 なりすましを行い、接続を行ったり、ほかの接続先を探索し、 脆弱性を探すことができてしまう WireGuardとは /etc/wireguard/wg0.conf なりすまし なりすまし ネットワークレンジを 広げて探索

Slide 18

Slide 18 text

課題提起:静的秘密鍵の置き場所 これをセキュアエレメントで守れないか [Interface] PrivateKey = FA2qtPQO3XsjOSR06Sx9Eg/rR8pw2B5cSgdOXKpa8Gs= Address = 10.0.0.112/32 [Peer] PublicKey = XXXXX= Endpoint = XXX.XXX.XXX.XXX:XXXXX Static Secret Static Public for counterpart (get in advance) Pub WireGuardとは

Slide 19

Slide 19 text

セキュアエレメントについて ■セキュアエレメントの機能:秘密鍵を隠して、なりすましを防ぐデバイス 構成:安全に格納できるフラッシュストレージへ鍵を保管し 外部からの解析に耐える機能を持ち(耐タンパ性)、 I2C,SPIなどの通信を使いホストマイコン、プロセッサと 通信し、暗号ロジックを提供する 8ピン程度の小型なパッケージで提供されている 基本機能: ■秘密鍵を読みだすコマンドがなく、公開鍵を読める コマンドのみある。 ■セキュアエレメント内の秘密鍵に値(ハッシュ)を 与えて署名、DH計算など行い結果を返すコマンドがある。

Slide 20

Slide 20 text

ATECC608A SE050(C) Optiga Trust M STSAFE-A110 メーカー Microchip NXP Infineon STMicro インターフェース I2C 暗号演算 楕円暗号(ECC) 楕円暗号(ECC)、RSA 楕円暗号(ECC) 楕円暗号(ECC) 楕円暗号 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 NIST P-256, P-384 ECC NIST (256 to 384 bit) Brainpool (256 to 384 bit) RSA暗号 - up to 4096 bit - 共通鍵暗号 AES-128 AES 128, 192 and 256 bit and DES keys with single DES, 2K3DES and 3K3DES AES-128 AES-128 ハッシュ SHA-256 SHA-224/256/384/512 SHA-256 SHA-256/384 記憶領域 1.1KB 50KB 10KB 6KB 価格(1個当たり) ¥131 ¥755 ¥275 ¥467 パッケージ 8pin SOIC,DFN 20pin QFN 10pin DFN SO8N,UFDFPN8 製品ファミリ 限定機能のみの ATECC108Aなど 限定機能のみのSE050(A)、SE050(B) 温度環境対応品 SPL02,SPL03 採用実績 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 AWS IoT EduKit etc. Atmark Techmo Armadillo WithSecure USB Armory Arduino Nicla Vision Arduino Portenta H7 ー Starlink User Terminal 対応規格 ー CC EAL6+ (HW+JCOP) JavaCard version 3.0.5 GlobalPlatform specification version GP 3.0 CC EAL6+ CC EAL5+ AVA_VAN5 セキュアエレメントについて

Slide 21

Slide 21 text

セキュアエレメントについて ■セキュアエレメントのパフォーマンス 基本コマンドの実行を64 MHz Arm Cortex-M4 MCU+MbedTLSの ソフトウェア実行と比較した場合の参考値 0 100 200 300 400 500 50000 60000 Random Generation ECC Key pair Gen Hash Gen Sign Verify MCU Secure Element % ※参考文献1

Slide 22

Slide 22 text

■Raspberry Pi 3b+ bullseye 環境を用意 NXP SE050 C1をI2C接続。 (市販品ではMIKROE Plug&Trust clickが利用可能) $ sudo raspi-configでI2Cを有効 $ i2cdetect –y 1 コマンドで0x48認識を確認 WireGuardのセキュリティ強化

Slide 23

Slide 23 text

■セキュアエレメントを組み込むイメージ WireGuardのセキュリティ強化 Give the public key to the secure element to do DH calculation 2nd.DH calc. Static Secret Static Public Pub Pub Ephemeral Public Ephemeral Secret Handshake comm. Static Public Pub Get in advance Static Public for counterpart Pub Static Public for counterpart (get in advance) Pub Static Public for counterpart Pub Ephemeral Secret 3rd.DH calc. Static Public for counterpart Pub Static Secret 4th.DH calc. Static Secret Pub Ephemeral Secret Static Secret for counterpart Ephemeral Public Pub Ephemeral Public 1st.DH calc. Ephemeral Secret Pub Ephemeral Public

Slide 24

Slide 24 text

WireGuardのセキュリティ強化 ■実装のポイント Linux ユーザー空間 wireguard-tools ●wg genkeyコマンド 出力される秘密鍵を隠すため、SE050の内部の鍵の保管番号である オブジェクトIDを代わりに出力する この値自体は漏れても問題ない ●wg pubkeyコマンド 上記オブジェクトIDを引数として、SE050から公開鍵を出力する。

Slide 25

Slide 25 text

WireGuardのセキュリティ強化 ■実装のポイント ●noise.c ハンドシェイクを行うコード内で、wg->static_identity.static_private 構造体の中身をSE050の内部の鍵の保管番号であるオブジェクトIDに 変更し、ECDH計算のためこれを呼び出す関数をSE050のAPIに置き換え る。 NXPのPlug&Trustミドルウェアはユーザー空間用なため、カーネル モジュール用にHAL(Hardware Abstraction Layer)の作成が必要。 コードもカーネル空間用にリライトが必要。 Linux カーネル wireguard カーネルモジュール

Slide 26

Slide 26 text

WireGuardのセキュリティ強化 /* Must hold peer->handshake.static_identity->lock */ void wg_noise_precompute_static_static(struct wg_peer *peer) { down_write(&peer->handshake.lock); #ifdef USE_SE if (ecdh_calc(peer->handshake.precomputed_static_static, peer->handshake.remote_static,peer->handshake.static_identity->static_private)) memset(peer->handshake.precomputed_static_static, 0, NOISE_PUBLIC_KEY_LEN); if (!peer->handshake.static_identity->has_identity || !crypto_memneq(peer->handshake.precomputed_static_static, curve25519_null_point, CURVE25519_KEY_SIZE)) memset(peer->handshake.precomputed_static_static, 0, NOISE_PUBLIC_KEY_LEN); #else if (!peer->handshake.static_identity->has_identity || !curve25519(peer->handshake.precomputed_static_static, peer->handshake.static_identity->static_private, peer->handshake.remote_static)) memset(peer->handshake.precomputed_static_static, 0, NOISE_PUBLIC_KEY_LEN); #endif up_write(&peer->handshake.lock); } noise.c変更点1 DH calculation 3rd.DH calc. Static Public for counterpart Pub Static Secret

Slide 27

Slide 27 text

WireGuardのセキュリティ強化 /* Must hold static_identity->lock */ void wg_noise_set_static_identity_private_key( struct noise_static_identity *static_identity, const u8 private_key[NOISE_PUBLIC_KEY_LEN]) { #ifdef USE_SE memcpy(static_identity->static_private, private_key, NOISE_PUBLIC_KEY_LEN); if (!get_se_key(static_identity->static_public, static_identity->static_private)) static_identity->has_identity = 1; else static_identity->has_identity = 0; #else memcpy(static_identity->static_private, private_key, NOISE_PUBLIC_KEY_LEN); curve25519_clamp_secret(static_identity->static_private); static_identity->has_identity = curve25519_generate_public( static_identity->static_public, private_key); #endif } noise.c変更点2 static public key generation

Slide 28

Slide 28 text

WireGuardのセキュリティ強化 wg_noise_handshake_consume_initiation(struct message_handshake_initiation *src, struct wg_device *wg) { … /* e */ message_ephemeral(e, src->unencrypted_ephemeral, chaining_key, hash); /* es */ #ifdef USE_SE if (!mix_dh_use_se(chaining_key, key, wg->static_identity.static_private, e)) goto out; #else if (!mix_dh(chaining_key, key, wg->static_identity.static_private, e)) goto out; #endif /* s */ if (!message_decrypt(s, src->encrypted_static, sizeof(src->encrypted_static), key, hash)) goto out; … /* ss */ if (!mix_precomputed_dh(chaining_key, key, handshake->precomputed_static_static)) goto out; … } noise.c変更点3 DH calculation 4th.DH calc. Static Secret Pub Ephemeral Public

Slide 29

Slide 29 text

WireGuardのセキュリティ強化 ■wireguard-tools $ wg genkey 0x10000009 CQAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= $ wg genkey 0x10000009 | wg pubkey Yh3rhVp7LfvPC4YWjB7L8mJO2hk2VXMh9sZ9B6tLm2c= SE050の鍵のオブジェクトID(保管番号) 0x10000009をBase64にした数値になり、 秘密鍵を隠せた。 SE050のオブジェクトID 0x10000009の公開鍵を出力。 これを相手側のwireguardへ登録。

Slide 30

Slide 30 text

WireGuardのセキュリティ強化 ■wireguard $ sudo cat /etc/wireguard/wg0.conf [Interface] PrivateKey = CQAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Address = 10.0.0.110/32 [Peer] PublicKey = XXXXX= Endpoint = XXX.XXX.XXX.XXX:XXXXX 0x10000009をBase64にした数値を 秘密鍵として登録 相手側の公開鍵を登録

Slide 31

Slide 31 text

WireGuardのセキュリティ強化 ■パフォーマンス iperf3 5回実行平均 標準のwireguard 39.28Mbit/sec セキュアエレメント対応wireguard 39.38Mbit/sec 有意な差はなし

Slide 32

Slide 32 text

WireGuardのセキュリティ強化 ■キーローテーションを試す。 クライアント側で新しいキー番号で秘密鍵 、公開鍵を作成する。 $ wg genkey 0x10000006 BgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= $ wg genkey 0x10000006 | wg pubkey 9oGFAiGUSMIzg2gzwwEBasjfKxkULebTwzOEjn7K4Rk=

Slide 33

Slide 33 text

WireGuardのセキュリティ強化 ■キーローテーションを試す。 サーバー側で: $ sudo wg set wg0 peer "9oGFAiGUSMIzg2gzwwEBasjfKxkULebTwzOEjn7K4Rk=" allowed-ips 10.0.0.111/32 これを実行したところで接続が切れる。 $ sudo wg set wg0 peer "ChgKBqwSnkov+rcC2KKUQKMgPH9pfrnWXzLpMzfKpg4=" remove IPは現在のIP 現在接続しているピアの公開鍵

Slide 34

Slide 34 text

WireGuardのセキュリティ強化 ■キーローテーションを試す。 クライアント側で: $ sudo wg-quick down /etc/wireguard/wg0.conf $ sudo vi /etc/wireguard/wg0.confで以下を変更 ``` [Interface] PrivateKey = BgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Address = 10.0.0.111/32 ``` $ sudo wg-quick up /etc/wireguard/wg0.conf IPは現在のIP 新しい0x10000006の鍵を指定

Slide 35

Slide 35 text

まとめ セキュアエレメントを用いることで対応できるNISTIR 8259Aの項目 項目 概要 デバイスの識別 IoTデバイスは、論理的にも物理的にも一意に識別できる デバイス構成 IoT デバイスのソフトウェア構成は変更できるが、そのような変更は許可されたエンティ ティのみが実行できる データ保護 保存、または転送されるデータを未承認のアクセスと変更から保護できる インターフェースへの論理アクセス ローカル・インターフェースおよびネットワーク・インターフェース、ならびにそれらの インターフェースで使用されるプロトコルおよびサービスへの論理アクセスを、許可され たエンティティのみに制限することができる ソフトウェア更新 IoT デバイスのソフトウェアは、安全で構成可能なメカニズムを使用して、承認されたエ ンティティのみが更新できる サイバーセキュリティ状態の認識 IoTデバイスは、そのサイバーセキュリティの状態を報告し、その情報を許可されたエン ティティのみがアクセスできるようにすることができる

Slide 36

Slide 36 text

まとめ セキュアエレメントを用いることで対応できるNISTIR 8259Aの項目 項目 概要 データ保護 保存、または転送されるデータを未承認のアクセスと変更から保護できる 1. 標準化された暗号アルゴリズム (認証による暗号化、暗号 ハッシュ、デジタル署名の検証など) に対して明らかに安全な 暗号モジュールを使用して、デバイスの保存および送信データ の機密性と完全性が侵害されるのを防ぐ機能 セキュアエレメントにより、耐タンパ性による保護と、 RFC8410で定められたX25519共有鍵生成を行え、WireGuard VPN接続を行うための秘密鍵の保存、および送信データの機密 性と完全性が侵害されるのを防ぐ 2. 認可されたエンティティが、事前に認可されているかどうか にかかわらず、デバイス上のすべてのデータをすべてのエン ティティがアクセスできないようにする機能 (例: 内部スト レージのワイプ、暗号化されたデータの暗号キーの破壊など) ー 3. デバイス構成機能で使用する構成設定。これには、許可され たエンティティが暗号化の使用自体を構成する機能 (キーの⾧ さの選択など) が含まれますが、これに限定されません。 ー

Slide 37

Slide 37 text

まとめ クラウド接続が増加してくるIoTデバイスでのセキュアエレメントの実装は ネットワーク、扱うデータ、デバイスをより信頼できるため、活用の幅が広まる GitHubレポジトリ https://github.com/kmwebnet/wireguard-se https://github.com/kmwebnet/wireguard-tools-se

Slide 38

Slide 38 text

まとめ 想定用途: IoTデバイスのメンテナンスネットワーク 既存のMQTTなどのプロトコル保護 IoTセキュリティについて継続勉強中。 https://speakerdeck.com/kmwebnet https://qiita.com/kmitsu76

Slide 39

Slide 39 text

参考文献 1,https://www.mdpi.com/2624-831X/3/1/1 Mario Noseda 1,†, Lea Zimmerli 1,† , Tobias Schläpfer 2,† and Andreas Rüst 1,∗,† 1, Institute of Embedded Systems, Zurich University of Applied Sciences, 8401 Winterthur, Switzerland; [email protected] (M.N.); [email protected] (L.Z.) 2, NatWest Group, NatWest Services (Switzerland) Ltd., 8045 Zuerich, Switzerland; [email protected] Correspondence: [email protected]; Tel.: +41-(0)-58-934-77-01 † These authors contributed equally to this work. CCライセンス 表示 4.0 国際(https://creativecommons.org/licenses/by/4.0/deed.ja)、データカタログサイト利用規約(http://www.data.go.jp) 2,作って理解するWireGuard https://speakerdeck.com/fadis/zuo-tuteli-jie-suruwireguard