概要
サイドチャネル攻撃(Side-Channel Attack)とは、暗号アルゴリズムの数学的な弱点を突くのではなく、暗号処理が実行される際に生じる物理的な「副次情報(サイドチャネル)」を計測・解析することで秘密情報(暗号鍵など)を推定する攻撃手法の総称である。
典型的なサイドチャネルには「消費電力」「電磁波放射」「処理時間」「音響」「光(LED の点滅パターン)」などがある。どれだけ数学的に安全なアルゴリズムを使っても、その実装が物理的な情報を漏洩させていれば攻撃を受ける可能性がある。
組み込み機器・IoT デバイスは物理的にアクセス可能なケースが多く、サイドチャネル攻撃への耐性は特に重要なセキュリティ要件となっている。高いセキュリティ認証(Common Criteria EAL5+ など)を要求するセキュアエレメントはこれらの攻撃への対策が設計レベルで組み込まれている。
歴史・背景
- タイミング攻撃(1996年): Paul Kocher が RSA の復号処理時間の差から秘密鍵を推定できることを発表。暗号実装に処理時間の均一化が必要であることが認識された。
- 単純電力解析 SPA(1999年): Kocher らが電力消費の波形から鍵ビットを直読みできることを示した Simple Power Analysis を発表。
- 差分電力解析 DPA(1999年): 同論文で多数のトレースの統計解析による Differential Power Analysis も発表。少ない知識でも鍵全体を復元できる強力な手法。
- 電磁波解析 EMA(2001年): 電力線に接触せず、電磁波プローブで非接触に解析できる手法が実証された。
- フォルト攻撃(1997年〜): 電圧・クロック・レーザーで誤動作を引き起こし、誤った出力から鍵を推定する攻撃が登場。
- Spectre/Meltdown(2018年): CPU の投機的実行に起因するキャッシュタイミングサイドチャネルがソフトウェアレベルでも大問題となった。
技術仕様
サイドチャネル攻撃の分類
| 攻撃種別 | 情報源 | 手法 | 必要なアクセス |
|---|---|---|---|
| タイミング攻撃 | 処理時間 | 統計解析 | 遠隔からも可能 |
| SPA(単純電力解析) | 消費電力波形 | 波形の直接読み取り | 物理的接触が必要 |
| DPA(差分電力解析) | 消費電力波形 | 多トレース統計解析 | 物理的接触が必要 |
| EMA(電磁波解析) | 電磁放射 | プローブでの計測 | 近接アクセス |
| フォルト注入 | 誤動作出力 | 電圧グリッチ、EM パルス、レーザー | 物理的接触 |
| 音響攻撃 | 動作音 | 音声解析(稀) | 近接アクセス |
| キャッシュタイミング | CPU キャッシュ | アクセスパターン計測 | 同一システム上のプロセス |
攻撃の難易度と影響範囲
攻撃の複雑さ(低→高):
タイミング攻撃 < SPA < DPA < 高次 DPA(HO-DPA)
必要な機器:
タイミング攻撃: PC のみ
SPA/DPA: オシロスコープ、電流プローブ(数十万円〜)
EMA: 電磁波プローブ、スペクトラムアナライザ(数百万円〜)
フォルト注入: 専用機器(数百万〜数千万円)
レーザーフォルト: レーザー照射装置(数千万円〜)
成功時の影響:
いずれも秘密鍵の完全復元が可能であり、影響は甚大
動作原理
タイミング攻撃の仕組み
# 脆弱な実装例: 比較に時間差がある
def verify_password_vulnerable(stored: bytes, input_bytes: bytes) -> bool:
"""バイト単位で比較するため、一致するバイト数が多いほど時間がかかる"""
if len(stored) != len(input_bytes):
return False
for a, b in zip(stored, input_bytes):
if a != b:
return False # ← ここで早期リターン。時間が変わる!
return True
# 攻撃者は入力の最初のバイトを 0x00〜0xFF まで試し、
# 処理時間が最も長いものを「一致」と判定→2バイト目へ
# 安全な実装: 定数時間比較
import hmac
def verify_password_safe(stored: bytes, input_bytes: bytes) -> bool:
"""全バイトを必ず比較する(処理時間が入力に依存しない)"""
return hmac.compare_digest(stored, input_bytes)
DPA(差分電力解析)の仕組み
1. 多数の暗号化処理を実行しながら電力波形を収集
(例: AES 暗号化を 1000 回実行)
2. 鍵の候補 k を仮定し、各暗号化の中間値を予測
例: AES の最初の SubBytes 出力の特定ビット
3. 予測した中間値のビットで波形をグループ分け
・ビット=1 のグループの平均波形
・ビット=0 のグループの平均波形
4. 二つの平均波形の差分(差分電力)を計算
5. 正しい鍵候補では特定タイミングで大きなピークが現れる
← AES の非線形演算が電力と相関を持つため
6. 全16バイトの鍵サブキーをそれぞれ解析 → 完全な鍵を復元
フォルト注入攻撃の仕組み
/* 攻撃対象コード(概念) */
int verify_signature(const uint8_t *sig, const uint8_t *data) {
int result = crypto_verify(sig, data);
/* ↑ このときに電圧を瞬間的に下げると... */
/* result が "成功" を示す値になる可能性がある */
if (result == SUCCESS) { /* 検証をスキップ */
boot_kernel();
}
}
/* 攻撃者は crypto_verify の実行中に電圧グリッチを注入し、
検証失敗のはずが "成功" になるよう誘導する */
キャッシュタイミング攻撃(Flush+Reload)
攻撃者プロセスと被攻撃プロセスが同一 CPU を共有する環境での攻撃:
1. 攻撃者が特定のキャッシュラインを Flush(無効化)
2. 被攻撃プロセスが暗号処理を実行
(AES テーブルルックアップなど)
3. 攻撃者が Reload(再ロード時間を計測)
・速い → 被攻撃プロセスがそのアドレスにアクセスした
・遅い → アクセスしなかった
4. アクセスパターンから鍵情報を推定
用途・ユースケース(攻撃の観点と対策)
スマートカード・決済端末
高額な決済機器や政府系スマートカードは DPA、EMA、フォルト注入の主要ターゲット。Common Criteria EAL5+ 以上の認定取得が必要で、製造段階で対策が組み込まれる。
組み込み IoT デバイス
コスト重視で設計された IoT デバイスはサイドチャネル対策が不十分なことが多い。物理的なアクセスが容易な屋外設置機器(スマートメーター、路上機器)では攻撃リスクが高い。
産業用制御機器
PLC や HMI に対するサイドチャネル攻撃で暗号鍵を入手し、通信の盗聴・改ざんや不正制御が可能になる。
実装・開発のポイント
ソフトウェアレベルの対策
定数時間(Constant-Time)実装:
/* 脆弱: 条件分岐で処理時間が変わる */
uint32_t bad_conditional(uint32_t secret_bit, uint32_t a, uint32_t b) {
if (secret_bit) return a;
else return b;
}
/* 安全: ビット演算で定数時間 */
uint32_t constant_time_select(uint32_t condition, uint32_t a, uint32_t b) {
/* condition は 0 または 0xFFFFFFFF */
uint32_t mask = -(uint32_t)(condition != 0);
return (mask & a) | (~mask & b);
}
/* 定数時間の比較 */
int constant_time_memcmp(const uint8_t *a, const uint8_t *b, size_t len) {
uint8_t diff = 0;
for (size_t i = 0; i < len; i++) {
diff |= a[i] ^ b[i]; /* 全バイトを必ず処理 */
}
return diff != 0; /* 一致なら 0、不一致なら非零 */
}
ランダム化(マスキング):
/* AES 処理のマスキング例(概念) */
void aes_with_masking(uint8_t *data, const uint8_t *key) {
uint8_t random_mask[16];
generate_random(random_mask, 16); /* TRNG から生成 */
/* データにランダムマスクを適用 */
for (int i = 0; i < 16; i++) {
data[i] ^= random_mask[i];
}
/* マスクを考慮した暗号化処理 */
/* → 電力消費がランダムマスクに依存し、鍵との相関が断ち切られる */
/* マスクを除去 */
for (int i = 0; i < 16; i++) {
data[i] ^= random_mask[i];
}
}
ハードウェアレベルの対策
| 対策 | 効果 | コスト |
|---|---|---|
| 電力ノイズの付加 | DPA への耐性向上 | 中 |
| クロックジッター | タイミング攻撃への耐性 | 低 |
| 電磁シールド | EMA への耐性 | 中〜高 |
| 電圧・クロック監視センサー | フォルト注入検知 | 中 |
| フォトセンサー | レーザー注入検知 | 中 |
| アクティブシールド(メッシュ) | プロービング・レーザー対策 | 高 |
| 専用 SE の使用 | 全攻撃への包括対応 | 高 |
実装ガイドラインの参照
- NIST SP 800-90A: 安全な乱数生成器の仕様
- ISO/IEC 17825: タイミング攻撃対策テスト
- Common Criteria PP (Protection Profile): セキュア IC 向けの対策要件
他技術との比較
| 攻撃分類 | 対象 | 対策 |
|---|---|---|
| サイドチャネル攻撃(本項) | 実装の物理特性 | 定数時間実装、マスキング、SE 使用 |
| 暗号解読攻撃 | アルゴリズムの数学的弱点 | 強いアルゴリズム(AES、ECDSA)の使用 |
| 中間者攻撃(MitM) | 通信路 | TLS/DTLS、証明書検証 |
| ファームウェア改ざん | ソフトウェア | セキュアブート、ファームウェア署名 |
| リプレイ攻撃 | プロトコル | ノンス、タイムスタンプ、シーケンス番号 |
サイドチャネル攻撃は「実装の問題」であり、どれだけ強い暗号アルゴリズムを使っても実装が不適切であれば無効化される。高いセキュリティを要求するシステムでは、セキュアエレメントのような専用チップを使うことが最も現実的な対策である。