【ブロック暗号応用編】Bit-flip・Padding Oracle・Nonce再利用|CTF思考フレームワーク #55
広告・PRを含みます。この記事にはアフィリエイトリンクが含まれます。掲載内容は編集方針に基づいて作成していますが、価格・在庫・キャンペーン内容はリンク先で最新情報を確認してください。

ブロック暗号の応用攻撃って、Padding Oracle以外に何があるの?

(注: Length Extension は MAC編で扱います) Attack((MAC編参照))、Nonce再利用(GCM/CTRが完全に破れる)、Bit-Flip攻撃(CBCで暗号文を改ざんできる)――AESアルゴリズム自体は無事でも、運用で破れる。これがブロック暗号の現代攻撃の主戦場です。
ブロック暗号応用攻撃は、AES等のアルゴリズム自体を破るのではなく、運用・実装の穴を突くもの。Padding Oracle(CBCの典型)、(注: Length Extension は MAC編で扱います)(Merkle-Damgård系ハッシュ)、Nonce再利用(GCM/CTR壊滅)、Initial Vector の不適切設定。実際のWeb・APIで多数発見されています。

アルゴリズムが安全でも、運用ミスでこんなに壊れるんだ…
この記事は、CTF思考フレームワーク第55回。ブロック暗号応用攻撃(Bit-Flip・(注: Length Extension は MAC編で扱います)・Nonce再利用・Padding Oracle)の手口と、開発側の防御策(認証付き暗号AEAD・Nonce管理・IV検証)を整理します。
📖 この記事はシリーズの一部です
「CTF思考フレームワーク」 #55 / 全86記事 → シリーズ一覧を見る →
⚙️ Bit-flipping、(注: Length Extension は MAC編で扱います)、Nonce再利用。応用編はAES入門の隙間にもう一段深い穴を掘る話。「認証なし暗号」「同一nonce」「ストリーム暗号誤用」が三大死線です。
ブロック暗号応用は「暗号文を一部だけ書き換えて意味を変える」「認証鍵をすり抜ける」「鍵を一切知らずに既存の暗号化機能を悪用する」という、攻撃側目線が一段抽象化される領域。
Bit-flip・(注: Length Extension は MAC編で扱います)・Nonce再利用の応用攻撃を学びます🧨

ブロック暗号応用は「正しいプリミティブを誤った文脈で使う」ところに穴がある🧨
先に意味を押さえておくと読みやすい用語です。
- CTF: セキュリティの練習問題を解く競技。必ず許可された環境だけで試します。
- 権限昇格: 一般ユーザーから管理者権限など、より強い権限を得ることです。
- 脆弱性: ソフトや仕組みにある弱点。攻撃者に悪用されると不正アクセスにつながります。
👀 観察フェーズ:まず何を見る?

まず「認証はどこにあるか」「IV/nonceの管理は誰が」を観察。設計の歪みを探す🔍
まず使われているモードと、認証(MAC/AEAD)の有無を確認。CBC/CTRに認証が付いていなければBit-flipping・MAC偽造の余地が大きく、GCMでもnonce再利用なら全壊。
- モード(CBC / CTR / GCM / OCB / SIV)
- 認証の有無(HMAC、Poly1305、AESのGCM/SIV)
- IV/nonceの管理(ランダム / カウンタ / 静的)
- パディング種別(PKCS#7 / ZeroPadding / Random)
- 鍵スケジュール(毎セッション再生成 / 静的)
- タイミングサイドチャネル(MAC比較の早期return等)

応用攻撃って「鍵を知らないままできること」がメインなんだね😨
🤔 仮説フェーズ:攻撃者は何を考える?

応用攻撃の典型は4パターン。
🕶️ 攻撃者は「暗号文の一部だけ書き換えて、復号後の値を狙った値に変える」ことを考えます。CBCならbit-flip、CTRなら直接XOR、AES-GCMはnonce再利用でforbidden attack。(注: Length Extension は MAC編で扱います)は古典MD系MAC(Merkle-Damgard)の宿命。
🪞 仮説①:CBC Bit-flipping
CBCの構造特性で前ブロック暗号文を1bit変えると次ブロックの平文も同じビットが反転。
🪶 仮説②:(注: Length Extension は MAC編で扱います)(MD5/SHA-1)
H(secret || data)のMACは追加データを付けたMACが計算可能。HMACなら防げる。
🎲 仮説③:Nonce再利用 in CTR/GCM
同じnonceで2つ平文を暗号化→XOR取ると平文XORが判明。GCMなら認証鍵漏洩で偽造可能。
⚠️ 仮説④:Padding Oracle 拡張
CBC暗号化APIに対する攻撃者制御の暗号化要求からも復号可能(Encryption Oracle)。

応用攻撃は「アルゴリズムと使い方の境界」に潜むんだね💡
🔬 検証フェーズ:どうやって確かめる?

これらはcryptopals challenge(Set 2-4)で全部訓練できる。CTFerなら必修🧪
実装を見て、bit-flip/nonce再利用/SIV未使用などの構造的弱点を炙り出す。MAC比較が == 演算子で早期returnしているとタイミング攻撃も成立。
# CBC bit-flip:認証なし'admin=0'を'admin=1'に
# C_{i-1}[byte] ^= old_value ^ new_value
# → P_i[byte] が書き換わる(前ブロックは壊れる)
# CTR nonce再利用検出(同一nonceで2つの暗号文)
ctxt1 ^ ctxt2 # = ptxt1 ^ ptxt2 の関係露呈
# Forbidden attack(AES-GCM nonce再利用)
# 認証鍵Hを多項式から復元できる

GCM nonce再利用については“forbidden attack”と呼ばれていて、Streamのスポンサー鍵が漏れるんだね😱
⚔️ 攻撃フェーズ:実際の手口

応用攻撃の代表トップ3。
応用攻撃:①CBC Bit-flipping(認証なし時)、②CTR nonce再利用(XOR露呈)、③GCM forbidden attack(認証鍵漏洩)、④(注: Length Extension は MAC編で扱います)(MD5/SHA1のM-D構造)、⑤Padding Oracle拡張版(CBC-MAC等)。
# (注: Length Extension は MAC編で扱います)(MD5/SHA-1)
# H(secret || msg)が既知のとき H(secret || msg || pad || ext) を計算可能
# 攻撃ツール:hashpump
hashpump -s ORIG_HASH -d "user=alice" -k 16 -a "&admin=1"
# 16はsecretの推定長
# AES-GCM forbidden attack 概念
# 同一nonceで2つのct/tagを得ると、Hが多項式根として解ける
AES-SIV / AES-GCM-SIVはnonce再利用に耐性のある「Misuse-Resistant」モード。実装で nonce 管理に自信がない場合は SIV系を採用するのが現代の正解✨
Cookieuser=guest&role=userをrole=adminにbit-flip。MACがなければ即成立。
MD5(secret || msg)の値が分かっていればmsg||extraの正規MACを計算可。FlickrのAPI事故で有名。
同nonceの2暗号文+認証タグから認証鍵Hを復元。任意メッセージの偽造が可能になる。
🛡️ 防御フェーズ:どう守る?

応用攻撃を防ぐ3鉄則!🛡️
防御は「認証付き暗号を使う」「nonce重複を物理的に不可能にする」「MAC比較を定数時間で行う」の三本柱。標準ライブラリのAEAD一択で大半は防げます。
- AEAD(GCM / ChaCha20-Poly1305 / SIV)を必ず使用
- nonceは 96bit乱数 or 単調増加カウンタ
- 鍵を 2^32ブロック使用したらローテ
- MAC比較は constant_time_eq
- (注: Length Extension は MAC編で扱います)に弱いMD5/SHA1ベースMACを廃止(HMAC使用)
- nonce重複検知ログを運用に組み込み
生のCBCやCTRを直接使わず、認証付き暗号を選ぶ。
メッセージ認証はHMAC-SHA256以上。MD5/SHA-1の単純連結は禁止。
カウンタやランダム生成で絶対に重複しない設計。鍵交換のたびにnonce空間をリセット。

「AEADがあれば応用攻撃のほとんどは死ぬ」。これが現代暗号の結論💪
⚠️ よくある落とし穴
- CBC + 自作CRCを「認証付き」と誤認
- CTR/GCMでnonceを乱数生成しつつ 誕生日攻撃のサイズ制限を考慮しない
- (注: Length Extension は MAC編で扱います)対策にHMACでなく単純連結MACを使う
- MAC検証を
==で行いタイミング情報を漏らす - AES-GCMのタグを切り詰めて高速化(forge容易になる)
- nonceに hostname や PIDを混ぜて「ユニーク」と思い込む
🧰 ツール早見表
| ツール | 用途 | 備考 |
|---|---|---|
| hashpump | (注: Length Extension は MAC編で扱います)自動化 | MD5/SHA1/SHA2系 |
| cryptopals tools | 攻撃テクニック網羅 | 学習にも実戦にも |
| PyCryptodome AEAD | 実装の参考 | GCM/ChaCha20-Poly1305 |
| libsodium | 安全な高水準API | nonce誤用を防ぐ設計 |
| Project Wycheproof | crypto実装テスト | Google製テストベクター |
🎓 本気で学びたい人へ
暗号技術を「趣味」から「仕事」に変えたい方へ。🎓 ササエルはセキュリティ・インフラを体系的に学べるスクールです。
📚 もっと深く学びたい人へ
体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚
📚 次に読みたい
- AES入門編|CTF思考フレームワーク #54
- ハッシュ・MAC編|CTF思考フレームワーク #56
- RSA応用編|CTF思考フレームワーク #53
- 楕円曲線・近代暗号編|CTF思考フレームワーク #57
✍️ 学んだことを発信する
学んだことをWordPressブログでアウトプットしたい方は、ConoHa WINGから始めるのが手軽です。
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝
この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏


