メインコンテンツにスキップ

オープンソースコードで OneKey Pro ファームウェアを検証する

昨日アップデートされました

この記事では、OneKey Pro ハードウェアウォレットにインストールされているファームウェアが、公式の OneKey GitHub リポジトリで公開されているオープンソースのファームウェアと一致しているかどうかを確認する手順を説明します。SHA-256 チェックサムを比較することで、ファームウェアが信頼できるソースから来ていることを確認し、デバイスの安全性を保証できます。


チェックサムとは?

チェックサムはデータの整合性を検証する方法です。ファイルから固定長の英数字列を算出し、その列を用いてファイルが改ざんされていないかどうかを確認できます。


⚠️ 重要な注意事項

  • すべての OneKey ハードウェアウォレット内のセキュアエレメントチップには、工場出荷時に公式のマルチシグ検証がプリロードされています。

  • デバイスが非公式のファームウェアで書き換えられている場合、起動時に"非公式ファームウェア"と表示されます。

  • この記事は、現在のファームウェアが GitHub に公開されているバージョンと完全に一致するかどうかを確認するための追加手順を提供します。


検証手順

ステップ1: 最新の公式ファームウェアをダウンロードしてインストールする

  1. OneKey 公式ファームウェア更新サイトにアクセスしてください。

  2. USB ケーブルを使って OneKey ハードウェアウォレットをコンピュータに接続してください。

  3. ウェブサイトが自動的にデバイス情報を検出します。表示された情報に基づいて最新のファームウェアを選択してインストールできます。

  4. 画面の指示に従い、ハードウェアウォレット上でインストールを確認してください。


ステップ2: デバイスのファームウェアチェックサムを取得する

  1. ハードウェアウォレット上で System Settings → About Device に移動してください。

  2. ファームウェア情報欄に、ファームウェアのバージョンとそのチェックサムが表示されます。

    • 例: 4.9.0[fccbac8-5ff2c88]

      • fccbac8 → ファームウェアバージョンID

      • 5ff2c88 → ファームウェアチェックサムの先頭7文字


ステップ3: GitHubからファームウェアのチェックサムを計算する

  1. お使いのデバイスに一致するファームウェアバージョンを見つけ、Assets の下にある .bin ファイルをダウンロードしてください。

⚠️ 注意: .bin ファイルには複数のパーツが含まれています:

  • MCU(メインコントローラのファームウェア)

  • 1つ以上のセキュアエレメント(SE)ファームウェア

  • 署名情報

検証には、MCU ファームウェアのみを抽出する必要があります。


ファームウェアの抽出

次のスクリプトを split_firmware.sh として保存してください(macOS/Linux 用):

#!/bin/bash

if [ $# -ne 1 ]; then
echo "Usage: $0 <binary_file>"
exit 1
fi

INPUT_FILE="$1"


TOTAL_FILE_SIZE=$(stat -f %z "$INPUT_FILE")

MAGIC=$(dd if="$INPUT_FILE" bs=1 count=4 2>/dev/null)

calculate_total_size() {
local offset=$1
local size_bytes=$(dd if="$INPUT_FILE" bs=1 skip="$offset" count=4 2>/dev/null | od -An -tu4)
echo $((size_bytes + 1024))
}

if [[ "$MAGIC" == "TRZF" ]]; then
TOTAL_SIZE=$(calculate_total_size 12)
elif [[ "$MAGIC" == "OKTV" ]]; then
HEAD1_SIZE=$(dd if="$INPUT_FILE" bs=1 skip=4 count=4 2>/dev/null | od -An -tu4)
HEAD1_SIZE=$(echo $HEAD1_SIZE)
FILE_SIZE_BYTES=$(dd if="$INPUT_FILE" bs=1 skip=$((HEAD1_SIZE + 12)) count=4 2>/dev/null | od -An -tu4)
TOTAL_SIZE=$((HEAD1_SIZE + 1024 + FILE_SIZE_BYTES))
else
echo "Unknown file format"
exit 1
fi

dd if="$INPUT_FILE" bs=1 count="$TOTAL_SIZE" of=firmware.bin 2>/dev/null

REMAINING_SIZE=$((TOTAL_FILE_SIZE - TOTAL_SIZE))
if [ $REMAINING_SIZE -gt 0 ]; then
SECOND_HEADER=$(dd if="$INPUT_FILE" bs=1 skip="$TOTAL_SIZE" count=4 2>/dev/null)
if [[ "$SECOND_HEADER" == "TF89" ]]; then
dd if="$INPUT_FILE" bs=1 skip="$TOTAL_SIZE" of=se.bin 2>/dev/null
echo "Split successfully: firmware.bin and se.bin extracted."
else
echo "Extra data exists but second file header is not 'TF89'. Only firmware.bin is extracted."
fi
else
echo "No extra data, only firmware.bin extracted."
fi

スクリプトを実行してください:

chmod +x split_firmware.sh ./split_firmware.sh onekey-firmware.bin

実行後、firmware.bin(MCU ファームウェア本体)が得られます。


チェックサムを計算する

ターミナルで次のコマンドを実行してください:

tail -c +2561 firmware.bin | shasum -a 256 -b

このコマンドは長い SHA-256 ハッシュを出力します。例:

abcdef1234567890... -

先頭7文字を取得してください。例:abcdef1


ステップ4: 結果を比較する

  • 計算したチェックサムの先頭7文字と、デバイスに表示されているチェックサムを比較してください。

  • 一致する場合、デバイスのファームウェアは GitHub に公開されているオープンソースコードと同一であることを意味します。


✅ なぜこれが重要か

  • デバイスが OneKey の公式オープンソースリポジトリから直接ビルドされたファームウェアを実行していることを確認できます。

  • セキュアエレメントの組み込みマルチシグ検証と合わせて、ハードウェアウォレットのファームウェアの整合性と安全性を確保します。

こちらの回答で解決しましたか?