PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。

【ハッシュ・MAC編】衝突・Length Extension・HMAC誤用|CTF思考フレームワーク #56

【ハッシュ・MAC編】衝突・Length Extension・HMAC誤用|CTF思考フレームワーク #56 アイキャッチ画像
安全に生きたい編集部

広告・PRを含みます。この記事にはアフィリエイトリンクが含まれます。掲載内容は編集方針に基づいて作成していますが、価格・在庫・キャンペーン内容はリンク先で最新情報を確認してください。

ハッシュって一方向だから安全じゃないの?MACも?📊

正しく使えば安全。でも MD5・SHA-1 の衝突攻撃、HMAC の誤用、Length Extension Attack、Hash-Then-Encrypt の誤実装――歴史的に多数の穴が見つかってきました。「ハッシュを使う」だけでは足りません。

ハッシュとMACは、データ完全性検証の基本。MD5・SHA-1 はすでに衝突攻撃が実用可能(Google が2017年にSHA-1衝突を公表)。HMAC は正しく実装すれば安全ですが、自前で『key+message のSHA256』のように作るとLength Extension Attackで破れます。実装ミスが致命的な分野です。

MD5って今でも使われてるところあるよね…ちょっと心配。

この記事は、CTF思考フレームワーク第56回。ハッシュ・MACの基本と、CTFで頻出の攻撃(MD5/SHA-1 衝突・Length Extension・HMAC誤用)、開発側の正しい使い方(HMAC-SHA256・BLAKE2・KMAC)を整理します。

📖 この記事はシリーズの一部です
CTF思考フレームワーク#56 / 全86記事 → シリーズ一覧を見る →

#️⃣ ハッシュとMACは「データの指紋」と「鍵付き指紋」。衝突、Length Extension、HMAC誤用、タイミング攻撃。CTFで最頻出のクラスタの一つで、現代Webの認証も土台ここです。

MD5は衝突が現実、SHA-1も衝突済み(SHAttered)。署名・トークン検証で旧世代ハッシュを使っていれば、それだけで脆弱性。HMACは安全ですが「鍵管理」「比較方法」「等価実装」で穴が開きます。

難易度:★★★(上級)

衝突・Length Extension・HMAC誤用の世界へ🔨

ハッシュ関数は一方向のはずだけど、誤用するとあっさり穴が空くんだ🔨

この記事で出てくる言葉

先に意味を押さえておくと読みやすい用語です。

  • CTF: セキュリティの練習問題を解く競技。必ず許可された環境だけで試します。
  • マルウェア: 情報を盗む、端末を壊す、勝手に操作するなど悪意あるソフトの総称です。
  • JWT: ログイン状態や権限情報を安全に渡すために使われるトークン形式です。

👀 観察フェーズ:まず何を見る?

使われてるアルゴリズムを見る!MD5/SHA-1は終わり、SHA-256以上、できればSHA-3 / BLAKE2/3へ🔍

ハッシュ・MACが絡む箇所を見たら、まずアルゴリズム種別と長さを確認。MD5(128bit)、SHA-1(160bit)、SHA-256(256bit)、SHA-512(512bit)。さらに鍵付きならHMACか単純連結か。

  • ハッシュ種別(MD5/SHA1/SHA2/SHA3/BLAKE2/BLAKE3)
  • MACがHMAC or 単純連結(H(secret || msg))
  • 比較関数(== / compare_digest
  • 署名検証でalgフィールド信用(JWT alg=none)
  • パスワードハッシュ(bcrypt / Argon2 / 旧PBKDF2)
  • BloomFilter等の特殊用途(衝突許容かどうか)

「衝突発見」と「原像発見」は別問題。MD5/SHA-1は衝突計算可能だが原像はまだ困難です👀

CertificateやTLSでまだMD5使ってる古いシステムって2026年の今でもあるからこわいね😨

🤔 仮説フェーズ:攻撃者は何を考える?

ハッシュ・MAC攻撃の典型は4方向

🕶️ 攻撃者は「ハッシュ衝突を作る/既存衝突を再利用する」「MACをLength Extensionでforge」「JWTの alg を none に書き換える」「比較タイミングからMACを推定」と多角的に攻めます。

💥 仮説①:衝突攻撃

MD5(2008年)・SHA-1(2017年SHAttered)で同じハッシュ値の異なる平文が現実的に作れる。

🪶 仮説②:Length Extension

Merkle-Damgård構造のMD5/SHA-1/SHA-2で“H(secret||msg)” のMACに追加メッセージを継ぎ足せる

🎯 仮説③:HMAC鍵長問題

HMAC鍵がブロックサイズより長いとSHA処理される。鍵管理での想定漏れに注意。

🏃 仮説④:Race / Timing差分

HMAC比較を早期returnで実装するとタイミング攻撃で1バイトずつ復元可能。

ハッシュは「アルゴリズム選定 + 比較ロジック」がペアで重要なんだね💡

🔬 検証フェーズ:どうやって確かめる?

Length Extension はhashpump / hash_extenderで実演できる。Flickr事件の追体験🧪

ハッシュの脆弱性検証はCVE/学術論文の追跡が中心。実装側の確認は compare_digest 使用の確認、JWTライブラリのallow_listオプション設定、bcrypt適用ラウンド数。

# Pythonで定数時間比較
import hmac
hmac.compare_digest(a, b)

# Length Extension判定
# H(secret || msg) が既知 → hashpumpでext付きMAC生成可能

# JWT alg=none チェック
# ライブラリオプションで algorithms=['HS256']を必ず指定

タイミング攻撃はhmac.compare_digestみたいな定数時間比較関数を使うんだね💡

⚔️ 攻撃フェーズ:実際の手口

ハッシュ・MAC攻撃の代表トップ3

攻撃の代表:①MD5衝突を使ったファイル偽装、②SHAttered SHA-1衝突、③Length Extension(連結MAC)、④HMAC比較タイミング、⑤JWT alg=none / HS256→RS256公開鍵trick。

# JWT alg=none攻撃
# header: {"alg":"none","typ":"JWT"}
# payload: {"role":"admin"}
# signature: ""(空)
# サーバが alg=none を許容すると認証突破

# JWT HS256 ↔ RS256 confusion
# サーバが公開鍵をHMAC鍵として使ってしまう実装ミスを突く
# 公開鍵を取得 → HS256で署名 → サーバはRS256検証のつもりが鍵=公開鍵

JWTライブラリのalg=noneHMAC↔RSA混同は今でも本番環境で発見される典型脆弱性。ライブラリ側で許容アルゴリズムをホワイトリスト化するのが対策の決め手🔑

① 衝突を悪用した署名偽造

MD5衝突を悪用して正規証明書と同じハッシュの偽証明書。FlameマルウェアがMS署名を偽造した実例。

② Length Extension API偽造

token = MD5(secret + payload)のAPI仕様でpayload+追加の正規トークンを生成。

③ Timing差分でHMAC復元

比較関数の早期returnで正答に近づくほどレスポンスが遅い。1バイトずつ完全復元。

🛡️ 防御フェーズ:どう守る?

ハッシュ・MAC安全運用の3鉄則!🛡️

ハッシュ運用は「現役アルゴリズム(SHA-256以上)使用」「HMAC一択」「JWTライブラリの設定見直し」。パスワードはbcrypt/Argon2、衝突許容用途と認証用途を混同しない。

  • ハッシュ:SHA-256 / SHA-3 / BLAKE2/3
  • MAC:HMAC-SHA256以上(連結MACは禁止)
  • パスワード:Argon2id / bcrypt
  • JWT検証時 algorithms ホワイトリスト
  • 比較は必ず 定数時間
  • Length Extension耐性のあるSHA-3/BLAKE系を選ぶ
✅ SHA-256以上、できればBLAKE2/3

MD5/SHA-1は完全廃止。新規はSHA-256/SHA-3/BLAKE2bが標準。

🛡️ MACはHMACかKMAC

hash(secret || msg)を絶対やらない。HMAC-SHA256SHA-3のKMACでLength Extensionを根絶。

⏱️ 比較は定数時間関数

Pythonならhmac.compare_digest、Node.jsならcrypto.timingSafeEqual==で比較しない

「アルゴ選択+HMAC+定数時間比較」の3点セットで現代の課題はほぼ解決💪

⚠️ よくある落とし穴

  1. MD5を「ハッシュだから安全」と理解せず使う
  2. 単純連結MAC(H(secret + msg))でLength Extension に開けっぱなし
  3. JWT alg を信じて検証アルゴリズムを動的選択
  4. パスワードをSHA-256単純ハッシュで保存(rainbow tableで終了)
  5. MAC比較を == で行いタイミング攻撃に脆弱
  6. HMAC鍵をハードコードしてGitリポジトリに混入

🧰 ツール早見表

ツール用途備考
hashpumpLength Extension古典MAC構造攻撃
hashcat / Johnパスワードハッシュ攻撃辞書+ルール
jwt_toolJWT解析・改ざんalg confusion対応
HashID / hash-identifierハッシュ種別判定長さと文字種から
Project Wycheproofcrypto実装テストJCA/Bouncy Castle検証

🎓 本気で学びたい人へ

暗号技術を「趣味」から「仕事」に変えたい方へ。🎓 ササエルはセキュリティ・インフラを体系的に学べるスクールです。

PR / 広告

ササエル

📚 もっと深く学びたい人へ

体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚

📚 次に読みたい

✍️ 学んだことを発信する

学んだことをWordPressブログでアウトプットしたい方は、ConoHa WINGから始めるのが手軽です。

PR / 広告

ConoHa WING

⚖️ 大事なお約束

必ず守ってね

この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝

この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏

記事URLをコピーしました