ECBモードの弱点を見抜く|暗号文に浮かぶパターン
ブロック暗号には「動作モード」という、ブロックをどう繋いで暗号化するかのルールがあります。最も単純なECBモードは、同じ平文ブロックを常に同じ暗号文ブロックに変換してしまうため、暗号文を見るだけで平文の構造が漏れてしまいます。
📋 目次
💭 前回の振り返り|数学の前提から、運用方法の罠へ
暗号方式は正しくても、使い方を誤ると弱くなる
第5話は「鍵が小さい」、今回は「使い方」
第5話のRSAは、鍵のサイズという数学的な前提の話でした。今回のテーマは、AESのような優れたブロック暗号そのものに欠陥がなくても、「ブロックをどう繋いで暗号化するか」という運用方法(動作モード)を誤ると、暗号文から平文の構造が漏れてしまうという話です。
ブロック暗号(AESなど)は、固定サイズの「ブロック」単位でデータを暗号化します。データがブロックサイズより長い場合、複数のブロックをどう組み合わせて暗号化するかにはいくつかの方式があり、これを「動作モード(mode of operation)」と呼びます。今回はその中で最も単純で、最も危険なECB(Electronic Codebook)モードを扱います。
🔀 ブロック暗号の動作モードとは何か
各ブロックを独立に暗号化するか、前のブロックと繋ぐか
ECBモードは、平文を固定サイズのブロックに分割し、各ブロックを完全に独立して、まったく同じ手順で暗号化します。これは実装が最も簡単な反面、ある重大な性質を持ちます。「同じ平文ブロックは、常に同じ暗号文ブロックになる」のです。
CBCモードはどう違うのか
CBC(Cipher Block Chaining)モードは、各ブロックを暗号化する前に、1つ前のブロックの暗号文とXORしてから暗号化します。最初のブロックには「初期化ベクトル(IV)」というランダムな値を使います。これにより、同じ平文ブロックでも前後の文脈が違えば暗号文も変わり、パターンが残りません。
CTR(Counter)モードは少し違う考え方です。連番のカウンタ値を暗号化したものを平文とXORするという、ストリーム暗号に近い動作をします。カウンタが毎回必ず変化するため、同じ平文ブロックが現れても暗号文は毎回変わります。今回のラボで使うAES-CTRも本来はこの仕組みですが、学習のためにあえてカウンタを固定し、ECBと同じ弱点を再現しています。
🔍 なぜECBは危険なのか
「内容を読めなくても、構造が分かる」という漏洩
ECBモードの危険性は、暗号文を復号できなくても、暗号文を「見るだけ」でさまざまな情報が分かってしまう点にあります。2つの暗号文ブロックが完全に一致していれば、元の平文ブロックも完全に一致していると確実に分かります。画像をECBモードで暗号化すると、輪郭や色の塊がそのまま暗号文に透けて見えてしまう「ECBペンギン」と呼ばれる有名な実例もあります。
| モード | 仕組み | パターン漏洩 |
|---|---|---|
| ECB | 各ブロックを完全に独立して暗号化 | ⚠ する(同じ平文 → 同じ暗号文) |
| CBC | 前のブロックの暗号文とXORしてから暗号化 | しない(IVと連鎖で毎回変わる) |
| CTR / GCM | カウンタを暗号化した値とXOR(ストリーム的) | しない(カウンタが必ず変化する前提) |
もう1つの危険:ブロックの並べ替え(cut-and-paste攻撃)
ECBは各ブロックが完全に独立しているため、攻撃者は暗号文のブロックを並べ替えたり、別の暗号文から持ってきたブロックと差し替えたりできます。サーバーが「正しい鍵で復号できた」ことしか確認していない場合、ブロックを入れ替えただけの偽造データを正規のものとして受け入れてしまうことがあります。
🧪 実践チャレンジ:パターンを見抜き、ブロックを差し替える
2つの攻撃を1話で体験する
このラボは、Web Crypto APIに直接ECBモードが用意されていないため、AES-CTRモードのカウンタを全ブロックで固定して再利用することで、ECBと同じ「同じ平文ブロック→同じ暗号文ブロック」という性質を再現しています(本来CTRモードでカウンタを再利用するのは別の種類の脆弱性であり、それ自体が学びになる豆知識です)。
ステージ1の手順:パターンを見抜く
5人の社員のパスワードがECBモードで暗号化され、ブロックとして表示されています。中身は復号できませんが、暗号文ブロックを見比べるだけで、2人が同じパスワードを使っていることが分かります。一致しているブロックを持つ2人の名前を見つけてください。
ステージ2の手順:ブロックを差し替える
下のラボでアカウントを作成すると、username=...&role=userという文字列がECBモードで暗号化され、ブロックに分かれて表示されます。ユーザー名の長さを調整して、role=の値(user)がちょうど1つのブロックに収まるようにしてください(ヒント:1文字のユーザー名で試してみましょう)。揃ったら、リークした管理者レコードの最後のブロックと差し替えて、なりすましリクエストを送信します。
あなたのレコードのブロック:
リークした管理者レコードのブロック(エラーログより):
🎉 なりすまし成功!
最終フラグ:CTF{ECB_BL0CK_SW4P}
ステージ1をクリアすると、ステージ2が解放されます。両方クリアした時点でスコアが確定します。
📊 ステージ進捗: 0/2|挑戦回数: 0回
同じパスワードブロックを持つ2人の名前をMATCH-名前1-名前2の形式で、アルファベット順に入力してください。
「5人分のパスワードを暗号化して表示」を押すと、各ユーザーの暗号文ブロックが緑色でハイライトされ、一致しているペアが分かるようになっています。
なりすましリクエストが成功すると表示される最終フラグを入力してください。
ユーザー名を1文字(例:Z)にしてアカウントを作成すると、ブロックがちょうど揃います。その状態で「なりすましリクエストを送信する」を押してください。
🛡️ なぜECBは今も使われてしまうのか
「とりあえず動く」設定がデフォルトになっていることがある
多くの暗号ライブラリでは、動作モードを指定する際に何も考えずデフォルト値を使ってしまうと、ECBが選ばれてしまう実装が過去に存在しました。「暗号化さえしていれば安全」という誤解から、動作モードの選択が見落とされやすいことが背景にあります。
現在推奨されているモード
現在の実務では、暗号化と改ざん検知を同時に行うAES-GCMのような認証付き暗号モードが推奨されています。GCMは内部的にCTRに似たカウンタ方式を使いつつ、認証タグによって「暗号文が改ざんされていないか」も検証できるため、cut-and-paste攻撃のような並べ替えも検出できます。ECBは新しい実装では使うべきではないモードとして扱われています。
セキュリティ診断ツールや静的解析ツールの中には、コード中でAES/ECBのような文字列を検出すると警告を出すものもあります。動作モードの選択ミスは、コードを少し検索するだけで見つけられることが多いため、定期的なコードレビューやスキャンの対象に含めておく価値があります。
次回はフォレンジック実践編に入ります。メモリダンプという、実行中のプログラムの生のメモリ内容から、ノイズに紛れたflagの断片を抜き出す体験をします。
📝 まとめ+FAQ+次回予告
暗号化=安全、ではない
第6話では、ECBモードが暗号文に平文の構造を漏らしてしまう様子と、ブロックを差し替えるcut-and-paste攻撃を体験しました。「暗号化されている」という事実だけでは安全性を保証できず、どのモードで・どう運用されているかまで見なければならないことを実感できたはずです。
・ECBは各ブロックを独立に暗号化し、同じ平文ブロック→同じ暗号文ブロックになる
・暗号文を比較するだけで、復号せずに平文の一致・構造が分かってしまう
・ECBはブロックの並べ替え(cut-and-paste攻撃)にも弱い
・CBC・CTR・GCMはこの弱点を解消する設計になっている
・採点ルールは前話までと同じ(ヒント-15pt、両ステージ解決でスコア確定)
Q. ECBモードは絶対に使ってはいけないのですか?
暗号学的には、複数ブロックにわたる機密データの暗号化にはECBを使うべきではないとされています。今回学んだ通りパターン漏洩や並べ替え攻撃のリスクがあるためです。現在の暗号ライブラリやプロトコルでは、CBC・CTR・GCMなど他のモードが標準として推奨されています。1ブロックしかないごく短いデータを1回だけ暗号化するような特殊な用途であれば、ECB特有の弱点が現れにくい場合もありますが、判断には専門知識が必要なため、初心者の方は「ECBは避ける」と覚えておくのが安全です。
Q. 今回のラボは本物のAES-ECBを使っているのですか?
厳密には異なります。Web Crypto APIにはECBモードが用意されていないため、AES-CTRのカウンタを全ブロックで同じ値に固定して再利用することで、ECBと同じ「同じ平文ブロック→同じ暗号文ブロック」という性質を再現する簡易モデルを使っています。学習目的の簡略化です。
Q. パスワードが一致していることが分かっても、パスワードの内容は分かりませんよね?
その通りです。ECBが漏らすのは「平文ブロックが一致しているかどうか」という情報だけで、実際の値までは分かりません。値を知るには、第12話で学んだような辞書攻撃など別の手段が必要です。今回は「内容を知らなくても構造が漏れる」という点が学びのポイントです。
Q. cut-and-paste攻撃を防ぐにはどうすればいいですか?
暗号化と改ざん検知を同時に行う認証付き暗号(AES-GCMなど)を使うのが最も確実です。暗号文に認証タグを付け、ブロックが少しでも入れ替えられていれば検証時に検出できるようにします。ECBやCBC単体では、暗号化はできても改ざん検知の仕組みがありません。
メモリダンプから断片化したflagを拾う
実行中のプログラムのメモリ内容を模したダンプから、ノイズに紛れたflagの断片をstrings的に抜き出す、フォレンジック実践編の最初の話です。
📚 参考情報
- NIST SP 800-38A — ブロック暗号の動作モードに関する推奨事項
- OWASP「Cryptographic Storage Cheat Sheet」


コメント