TOCTOU
概要
チェックした時点と、実際に使う時点の間にデータが変わってしまう脆弱性。
CheckとUseのタイミングのズレによって起こるバグ。バグというより、checkとuseの間で「世界が止まっている」と暗黙に仮定した設計の前提が崩壊する現象と捉えるのが本質に近い。
成立の3条件
1. 確認操作と利用操作が時間的に分離している
2. その時間幅の中で第三者(攻撃者、別スレッド、別プロセス、外部システム)が状態を変えうる
3. 後段の処理が「確認結果は依然として真」と暗黙に信頼している
3つ揃って初めて成立する。逆に言えば、どれか1つでも成立しなければ防げる。
TOCTOU例
ファイルシステムでは、access() で読めると確認したファイルが open() 直前に /etc/shadow へのシンボリックリンクに差し替わる。stat()→open() や lstat()→rename() も同類である
DBでは、SELECT で在庫ありを確認してから UPDATE で減算するまでの間に並行トランザクションに買い切られ、マイナス在庫が発生する。残高の read-modify-write による二重出金も同型である
IAM・認可では、判定でOKになったユーザーから判定直後にロールが剥奪され、剥奪済みのまま下流操作が通る。STS一時クレデンシャル発行と利用の間にポリシーが変わるケースもある
/icons/hr.icon