この記事はCTFのWebセキュリティ Advent Calendar 2021の16日目の記事です。
本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。
レースコンディション Race Condition
- Race Condition
- 競合状態。攻撃対象に対して同時に操作を行ったときに、意図しない動作になることを利用する
- CWE-362
- 参考
- MSDNにガイドラインがあった
- OWASP_NZDay_2011_BrettMoore_ConcurrencyVulnerabilities.pdf
どういう問題を発生させられるか
例えば、クーポンを使用する処理があって以下のようなフローになっているとする。
- クーポンがあるか確認
- クーポンを使用して、クーポンを消す
2つのプロセスで同一クーポンに対してリクエストをほぼ同時に投げたとする。
プロセスAとプロセスBにおいて、「A1 → B1 → A2 → B2」のような順番で処理が行われてしまうと、
クーポンは1つなんだけれど、クーポン使用が2回行われてしまう可能性がある。
このように、排他処理を適切に行わないことで、競合状態を発生させて、攻撃を行う。
- 他問題
- Race conditions
- TOCTOU
- コンテキスト外でオブジェクトが再利用される
- 処理フロー内でオブジェクトが編集される
- Deadlocks
- 2箇所からアップデートされる
- ロック、データベースのトランザクションの不整合
- Race conditions
体系的にはどんな問題に適用される?
- 整合性チェックと実際の処理に時間差がある場合
- 整合性チェックを行う場合に一般的に紛れ込むのかもしれない
- 他にもロジックミスとしてrace conditionが絡んでいる場合もあり、一概に言えない
攻撃シナリオ
- ファイルをアップロードして何かを行うサービス
- サーバ側処理
- ファイルをtmpフォルダにアップロード
- アップロードファイルに対してサーバ側が処理を行う
- アップロードしたファイルを削除する
- 攻撃
- 1でファイルをアップロードするときにphpファイルをアップロードしておく。その直後、3で削除される前に参照して、任意コード実行を達成する
- サーバ側処理
- 購入サイト
- サーバ側処理「お金があるか確認→購入処理→お金を減らす」
- 同時に購入することでお金の消費は1回で複数個数買える場合がある
- これはお金を減らす処理が「最初にお金があるか確認したものから金額を減らして更新する」場合に特に有効
- 送金システム
- サーバ側処理「送金→記録」
- これも同時に行えば、お金の減りは1回だけど複数回送れたりする
tips
- TOCTOU
- Time of check to time of use
- チェックしてから使用するまでに変更があるときに発生するバグの総称
- 上で紹介してるのもこれ
- 大抵の解説記事に存在するファイル名重複チェック時のTOCTOU競合脆弱性 - YouTube 徳丸動画を見ればいい