こんにちは。AndGoのハードウェア担当の片山です。毎週水曜日はAndGoのエンジニアが交代で技術に関する記事を皆様にお送りしています。

前回(2021.10.20)はハードウェアウォレットSecuX V20を入手し分解をしました。SecuX V20にはLedger Nano S/Xもと同様にセキュアエレメントが搭載されていて高いセキュリティを謳っています。今回はセキュアエレメントについての解説をしつつ,セキュアエレメントとマイコン間の通信を覗いてみたので,レポートしていきます。

セキュアエレメントとは?

ハードウェアウォレットは生成した秘密鍵で電子署名をする装置です(Fig. 1)。通常使用している範囲内では秘密鍵はハードウェアウォレットの外に出てくることはないので,電子署名をできるのは世界でそのハードウェアウォレットだけということが保証されます。Trezorのハードウェアウォレットは汎用的なマイコンのフラッシュメモリの中に秘密鍵を保存しています。Trezorに使われているマイコンはある設定をすることでフラッシュメモリの内容を正規の方法(デバックポートを使った方法)では取り出すことができないないことになっています。しかしながら,絶対に秘密鍵を取り出すことができないかというとそのようなことはなく,マイコンの蓋をあけて顕微鏡とプローブを使えば,直接フラッシュメモリの内容にアクセスできてしまいます。もちろん,それなりの専門知識と設備が必要なので,多額の費用をかければの話です。

一方でセキュアエレメントはフラッシュメモリの構造を複雑にするなどして,直接フラッシュメモリの無いようにアクセスすることを難しくしたものになっています。ただし,秘密鍵の保管の他は,電子署名や乱数生成など,暗号技術に特化した機能しか入っていないため,汎用マイコンのような複雑なことはできません。さらに,セキュアエレメントはドキュメントは公開されていませんし,設計や製造工程なども非常に厳重に管理されています。

実はクレジットカード等のICチップも中身はセキュアエレメントそのものです(Fig. 2)。カード類といえば磁気ストライプもついていることがあります。磁気ストライプは磁性体のNとSで情報を記録しているため,簡単に情報を読み書きできてしまいますので,偽造も簡単にできてしまいます。ICチップの場合には秘密鍵が中に入っていて,その秘密鍵を使って送られてきたデータに対して電子署名することで,正当性を証明します。もちろん秘密鍵はそう簡単には取り出すことができないので,偽造することはほぼ不可能です。

SecuX V20のマイコン・セキュアエレメント間の通信

ハードウェアウォレットを機能させるのはセキュアエレメントだけでは不十分で,PCやスマートフォンなどとの通信,ディスプレイへの表示,UIの処理,他さまざまな制御や演算などをするのはマイコンです。マイコンからは必要なときにセキュアエレメントに司令を送ってその機能を利用します。秘密鍵の生成や保存,公開鍵の生成,署名などのときにはマイコンとセキュアエレメントが通信をするはずです。今回の記事では実際にこのような通信が行われているのかを見ていきます。(通信内容の解析については行いません。)

マイコンとセキュアエレメントのような周辺IC間の通信には一般的なプロトコルがいくつかありますが,前回の分解記事でご紹介したように通信のための導線が4本(それに加えて電源とグラウンドで計6本)あるのでSPIという通信方式だという検討をつけていました。SPIというのはSerial Peripheral Interfaceの略で,身近なものでは少し昔のSDカードはSPIでデータを読み書きすることができます。4本の通信線にはCS,CLK,MOSI,MISOという名前がついています。CS (cable select)はマイコン側から周辺ICに対して「今から君の出番ですよ」という合図を送るためのものです。CLKは通信の同期をとるためのクロックで,通信の際に数MHz程度のON/OFFの信号が送られます。MOSI (Master-out Slave-in)はマイコンから周辺ICへデータを送る通信線,MISO (Master-in Slave-out) は周辺ICからマイコンにデータを送る線です。

これらが実際に動作しているか見てみます。前回ご紹介したようにFig. 3の左下がセキュアエレメントです。 このままだと通信線にアクセスできないのでちょっとした細工をします。まず,導線上の電子回路基板表面のレジストという保護している層を剥がし取ります(Fig. 4)。銅の色が見えてきます。ここに細い導線をはんだ付けしていきます(Fig. 5)。最終的にピンヘッダをはんだ付けします(Fig. 6)。このあと,ロジックアナライザを接続します(Fig. 7)。実は途中でピンヘッダが外れてしまったので,ICテストクリップで接続しました。

この状態でSecuX V20の電源を入れ,通信線の信号をみていきます。起動時のPIN入力や公開鍵の表示のときに,どうやらマイコンとセキュアエレメントの間で通信していることが分かります。実際に4本に流れている信号を見てみると(Fig. 8),上からCS,MOSI,MISO,CLKということがわかります(MOSIとMISOは見た目だと区別つかないので逆かもしれません)。さらに0/1の信号を16進数で表すと少しだけわかりやすくなります(Fig. 9)。他にも様々な動作させてみるとセキュアエレメントが必要そうな処理のときに通信しているようです。

オープンソース VS クローズドソース

Trezorのようなオープンソースハードウェアの場合には,部品は一般的に入手可能なものである必要があります。セキュアエレメントは電子回路基板の製造者ごとにカスタマイズして販売するものですので,オープンソースハードウェアでは使用することができません。一方でLedgerのように回路やファームウェアを非公開とする選択肢もあります。オープンソースの場合にはファームウェアもオープンにすることになりますが,多くの人にセキュリティホールが監視されることになります。一から自分で作り,その中身を理解し納得の上で使用できるので,安心感があります。しかしオープンソースは諸刃の剣でもあり,セキュリティホールを発見されやすいというデメリットもあります。クローズドソースの場合にはセキュアエレメントのようにセキュリティ関連の機能をブラックボックス化できるという意味でセキュリティを高めることができます。しかしLedgerを信用する必要があります。

どちらが優れているかというのは一概に判断をすることがなかなか難しく個人の信条に委ねられるものであると思います。どちらを取るにしてもメリットとデメリットを理解した上で使用し,さらに二重三重のセキュリティ対策をすることが大切です。例えばハードウェアウォレットを物理的に盗まれない場所に保管しておいたり,分散管理するなどの対策を取ることができます。