Linuxでデジタル署名を使用してバイナリファイルの完全性を検証する方法
はじめに

データが傍受または改ざんされる可能性がある世界では、受信ファイルの真正性への信頼が最重要です。例えば、ユーザーAがバイナリファイルをメールでユーザーBに送信する場合、Bはそのファイルが改ざんされていないことをどのように確認できるでしょうか?デジタル署名(DS)は、データを送信者の固有の資格情報に結びつけることで、信頼性の高いソリューションを提供します。
- 署名は署名済みメッセージから導出される必要があります。
- 送信者の固有情報を含む必要があります。
- 作成が容易である必要があります。
- 偽造が計算上不可能である必要があります。
- 署名サイズは小さく保たれる必要があります。
この記事では、Linux上で64ビットELFバイナリの完全性を検証するための実用的なDS実装を示します。このアプローチは直接署名スキーム(サードパーティの仲裁者なし)を使用し、署名用の秘密鍵と検証用の公開証明書に依存します。
DS実装例
署名の実装には以下の手順が含まれます:
- ソースバイナリのMD5ハッシュを生成。
- 秘密鍵と自己署名公開証明書を作成。
- バイナリに署名:
- MD5ハッシュを秘密鍵で暗号化。
- 暗号化されたハッシュをELFファイルの新しい
.sigセクションに格納。 - 後で検証するために証明書を
~/.sshに保存。
プロセス全体は openssl、objcopy、md5sum を使用してスクリプト化できます。以下は、ELFバイナリの署名を自動化するサンプルスクリプト sign_elf.sh です(行番号なしのソースコードは記事末尾にあります)。
#!/bin/bash KEY_DIR="$HOME/.ssh" PRIVATE_KEY="$KEY_DIR/priv.key" CERTIFICATE="$KEY_DIR/pub.crt" SUBJECT="/C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com" if [ "$#" = "0" ]; then echo "Usage: sign_elfs.sh [ELF files]" exit 1 fi [ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR" # 秘密鍵と証明書を生成 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT" for ELF_BIN in "$@"; do ELF_BASE_NAME="${ELF_BIN##*/}" ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256" ELF_BIN_MD5="$ELF_BASE_NAME.md5" if [ ! -f "$ELF_BIN" ]; then echo "Error: no such file $ELF_BIN" exit 103 fi # 既存の .sig セクションを削除 objcopy --remove-section=.sig "$ELF_BIN" # 512バイトのゼロ埋め .sig セクションを追加 rm -f dummy.txt touch dummy.txt truncate --size=512 dummy.txt objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN" # バイナリのMD5ハッシュを計算(.sigセクション含む) md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5" # 秘密鍵でMD5ハッシュに署名 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # 署名を即座に検証(オプション) openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # 暗号化されたハッシュを .sig セクションに埋め込み objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN" # 検査用に .sig セクションの内容を表示 objdump -sj .sig "$ELF_BIN" done rm -f dummy.txt ls -ls ~/.ssh

図1. ELFバイナリ署名のプロセス。(出典:Auriga)
スクリプトは以下のタスクを詳細に実行します:
19行目 – 証明書生成
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT"
reqは証明書署名要求を作成。-nodesは平文の秘密鍵を生成。-x509は自己署名証明書を出力。-sha256はハッシュにSHA-256を選択。-newkey rsa:4096は4096ビットRSA鍵を生成。SUBJECTフィールドはRFC 5280形式に従う(例:/C=RU/ST=…/CN=…)。
このステップ後、~/.ssh/priv.key に秘密鍵、~/.ssh/pub.crt に証明書が保持されます。秘密鍵はデータを暗号化し、証明書には検証に必要な公開鍵が含まれます。
ELFファイルのループ処理(21行目)
コマンドラインで指定された各バイナリが順次処理されます。スクリプトは署名前に既存の .sig セクションが削除されることを保証します。
セクション管理(33〜40行目)
- 既存の
.sigセクションをobjcopy --remove-section=.sigで削除。 - 512バイトのプレースホルダーファイルを作成し、読み取り専用、非ロード可能な
.sigセクションとして追加。
ハッシュ計算(42行目)
md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5"
プレースホルダー .sig セクションを含むバイナリのMD5を計算し、binary_name.md5 に格納。
ハッシュの署名(45行目)
openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
MD5ハッシュを秘密鍵で暗号化し、署名ファイル(例:binary_name.sha256)を生成。
検証(オプション)(48行目)
openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5"
このステップでは、証明書から抽出した公開鍵を使用して署名がハッシュと一致することを確認。
署名の埋め込み(52行目)
objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN"
暗号化されたハッシュがプレースホルダーを置き換え、署名済みELFバイナリが完成します。
スクリプトを一連のELFファイルで実行すると、安全に配布可能な署名済みバイナリが生成されます。受信者は .sig セクションを抽出し、公開証明書で復号化し、結果のハッシュを受信ファイルの新しく計算されたハッシュと比較することで完全性を検証できます。
モノのインターネットテクノロジー
- インダストリー4.0を活用せよ:勝利のデジタルロードマップ構築のための実証済み戦略
- ニューラルネットワークがX線イメージング再構成を高速化
- IoTシナジーを推進:BoschのConnectivity CoCが描くコネクテッド未来
- IoTで製造オペレーションをAI対応へ — ビッグデータ活用で次世代ファクトリーを準備
- デジタルツイン:製造業におけるインテリジェントエッジIoTの解放〜第2部
- 予知保全:インダストリー4.0を活用した無停止生産の実現
- 製造現場はIoT導入の準備ができているか? 実践ガイド
- デジタル保険:購入と管理を変える5つのトレンド
- Western Digital、産業用IoTとエッジコンピューティング向け堅牢な64層3D NANDストレージを発表
- Western Digital、産業用IoT向け堅牢64層3D NANDストレージを発表
- IoTデータ保存にクラウドコンピューティングが不可欠な理由