Состояния гонки и TOCTOU: когда тайминг становится уязвимостью
Коротко: Состояние гонки возникает, когда результат зависит от случайного тайминга параллельных процессов; при «проверил — использовал» (TOCTOU) состояние может измениться между шагами, например с купонами, переводами или файлами.
Подробнее: Когда два запроса читают и меняют одни и те же данные одновременно, результат может стать неверным. Это ошибка параллелизма и одновременно уязвимость, если она подрывает правила (купон использован дважды, двойная выплата).
Подробности
Пример: использование купона
Запрос A: читает купон (не использован) Запрос B: читает купон (не использован)
Запрос A: помечает как использованный Запрос B: помечает как использованныйОба проходят успешно. Решение: атомарные операции, блокировки и транзакции базы данных.
См. также: транзакции БД и ACID, мьютекс, взаимная блокировка, ограничение частоты