Mastodon Mastodon Mastodon Mastodon

Стан гонитви

Оновлено: · CyberSecureFox Editorial Team

Стан гонитви (race condition) — помилка, за якої результат роботи програми залежить від порядку виконання паралельних операцій, і зловмисник може «вклинитися» між перевіркою та дією, що на неї спирається.

Як виникає стан гонитви

Сучасні програми роблять багато чого паралельно: потоки, процеси й запити спільно використовують файли, пам’ять і записи в базі даних. Якщо код спершу щось перевіряє, а потім діє двома окремими кроками, стан між ними може змінитися. Цей класичний шаблон називають TOCTOU (time-of-check to time-of-use, CWE-367), а загальну слабкість — CWE-362.

Приклади:

  • Привілейована програма перевіряє, що файл безпечний, і відкриває його, а зловмисник у проміжку підміняє його символьним посиланням на системний файл.
  • Інтернет-магазин перевіряє, що подарунковий сертифікат не використано, і списує його; безліч одночасних запитів дає змогу списати його кілька разів (limit overrun).
  • У ядрі два потоки звільняють чи змінюють той самий об’єкт, що призводить до пошкодження пам’яті, наприклад use-after-free.

Чому це важливо

Стани гонитви важко знайти під час тестування: вони проявляються лише за певних таймінгів, але зловмисник може надійно їх викликати, повторюючи спроби. Помилка Dirty COW у ядрі Linux (CVE-2016-5195) дозволяла будь-якому локальному користувачу отримати root через гонитву в роботі з пам’яттю й використовувалася в реальних атаках, зокрема на Android. Багато вразливостей локального підвищення привілеїв у Windows і Linux — це стани гонитви, а у вебзастосунках вони відкривають шлях до фінансового шахрайства. Поряд із переповненням буфера це одні з найбільш технічно складних класів вразливостей.

Як запобігти

  • Використовувати атомарні операції, блокування й транзакції бази даних з обмеженнями.
  • Уникати окремих кроків «перевірити — використати» для файлів: працювати з дескрипторами, а не шляхами.
  • Робити чутливі вебоперації ідемпотентними й обмежувати частоту запитів.
  • Тестувати за допомогою інструментів для конкурентності, фазерів і thread sanitizer.
Синоніми:
стан гонки, race condition, стан перегонів