EMZETT.
Войти

Состояния гонки и TOCTOU: когда тайминг становится уязвимостью

Коротко: Состояние гонки возникает, когда результат зависит от случайного тайминга параллельных процессов; при «проверил — использовал» (TOCTOU) состояние может измениться между шагами, например с купонами, переводами или файлами.

Подробнее: Когда два запроса читают и меняют одни и те же данные одновременно, результат может стать неверным. Это ошибка параллелизма и одновременно уязвимость, если она подрывает правила (купон использован дважды, двойная выплата).

Подробности

Пример: использование купона

Запрос A: читает купон (не использован)   Запрос B: читает купон (не использован)
Запрос A: помечает как использованный     Запрос B: помечает как использованный

Оба проходят успешно. Решение: атомарные операции, блокировки и транзакции базы данных.

См. также: транзакции БД и ACID, мьютекс, взаимная блокировка, ограничение частоты