はまやんはまやんはまやん

hamayanhamayan's blog

CTFのWebセキュリティにおけるRace Condition

この記事はCTFのWebセキュリティ Advent Calendar 2021の16日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

レースコンディション Race Condition

どういう問題を発生させられるか

例えば、クーポンを使用する処理があって以下のようなフローになっているとする。

  1. クーポンがあるか確認
  2. クーポンを使用して、クーポンを消す

2つのプロセスで同一クーポンに対してリクエストをほぼ同時に投げたとする。
プロセスAとプロセスBにおいて、「A1 → B1 → A2 → B2」のような順番で処理が行われてしまうと、
クーポンは1つなんだけれど、クーポン使用が2回行われてしまう可能性がある。
このように、排他処理を適切に行わないことで、競合状態を発生させて、攻撃を行う。

  • 他問題
    • Race conditions
      • TOCTOU
      • コンテキスト外でオブジェクトが再利用される
      • 処理フロー内でオブジェクトが編集される
    • Deadlocks

体系的にはどんな問題に適用される?

  • 整合性チェックと実際の処理に時間差がある場合
  • 整合性チェックを行う場合に一般的に紛れ込むのかもしれない
  • 他にもロジックミスとしてrace conditionが絡んでいる場合もあり、一概に言えない

攻撃シナリオ

  • ファイルをアップロードして何かを行うサービス
    • サーバ側処理
        1. ファイルをtmpフォルダにアップロード
        1. アップロードファイルに対してサーバ側が処理を行う
        1. アップロードしたファイルを削除する
    • 攻撃
      • 1でファイルをアップロードするときにphpファイルをアップロードしておく。その直後、3で削除される前に参照して、任意コード実行を達成する
  • 購入サイト
    • サーバ側処理「お金があるか確認→購入処理→お金を減らす」
    • 同時に購入することでお金の消費は1回で複数個数買える場合がある
      • これはお金を減らす処理が「最初にお金があるか確認したものから金額を減らして更新する」場合に特に有効
  • 送金システム
    • サーバ側処理「送金→記録」
    • これも同時に行えば、お金の減りは1回だけど複数回送れたりする

tips