Race condition (стан гонитви) це вразливість, коли результат залежить від того, у якому порядку виконуються одночасні операції. Окремий випадок це TOCTOU (time-of-check to time-of-use): між моментом перевірки й моментом використання є проміжок, у який стан можна змінити. Це CWE-362.
Як це зустрічається на практиці
Джеймс Кеттл із PortSwigger назвав цей клас limit-overrun атаками: синхронні запити долають ліміт, який мав спрацювати один раз. Так виносять промокоди, реферальні бонуси, ліміти на виведення і залишки на балансі.
Приклад
Код перевіряє «промокод ще не використаний», а потім списує його. Якщо надіслати сто запитів одночасно, усі сто пройдуть перевірку до того, як перший встигне записати результат. У 2024 в системі продажу квитків alf.io виправили саме таку вразливість (CVE-2024-45300): race condition давав використати купон на знижку кілька разів.
Як захиститись
Робіть перевірку й списання однією атомарною операцією в базі, з блокуванням рядка. Перевірка в коді застосунку від гонитви не рятує.
