A04: Insecure Design

Некоторые уязвимости заложены не в коде, а в самой задумке системы — и патчем их не исправить.

Insecure Design — небезопасный дизайн: дефекты, возникшие на этапе проектирования из-за отсутствия или слабости защитных механизмов в самой логике приложения.

Важно различать: дефект реализации — это правильная идея, плохо закодированная (и её можно пропатчить). Дефект дизайна — это изначально неверная идея; даже идеальный код её не спасёт.

Пример небезопасного дизайна

Форма восстановления пароля задаёт «секретный вопрос» вроде «девичья фамилия матери». Ответ часто можно найти в соцсетях — значит, сам механизм слаб независимо от качества кода. Другой пример: магазин разрешает заказать товар, а оплату проверяет только асинхронно через час — за это время можно успеть получить товар бесплатно. Логика дырявая по замыслу.

Бизнес-логика и злоупотребления

Небезопасный дизайн часто проявляется как злоупотребление бизнес-логикой: бесконечное применение промокода, отрицательное количество товара в корзине (возврат «лишних» денег), обход лимитов через гонку запросов. Код «работает как написано», но сценарий злоупотребления не предусмотрен.

Как защищаться

  • Проводите моделирование угроз на этапе проектирования (см. урок про модель угроз).
  • Закладывайте в дизайн ограничения: лимиты, проверки последовательности шагов, идемпотентность платежей.
  • Используйте проверенные защитные паттерны вместо самодельной логики.
  • Пишите «злоупотребительные» сценарии (abuse cases) рядом с обычными пользовательскими историями: «как этим можно злоупотребить?».
  • Закрывайте гонки (race conditions) на уровне транзакций и блокировок.
Пользовательская история: покупатель применяет промокод и получает скидку.
Abuse case: покупатель применяет один промокод многократно за счёт гонки запросов.
Мера: промокод одноразовый, проверка и списание в одной транзакции.

Частые ошибки разработчиков

  • Думают, что безопасность — это только «защита от хакеров», и забывают про злоупотребление честной логикой.
  • Пытаются «пропатчить» дизайн-дефект точечной заплаткой вместо пересмотра механизма.
  • Не проверяют последовательность шагов: можно ли пропустить оплату и сразу попасть на «спасибо за заказ».

Итог

  • Insecure Design — это дефект замысла, а не кода; патчем не лечится.
  • Закладывайте безопасность в архитектуру через threat modeling и abuse cases.
  • Особое внимание — злоупотреблениям бизнес-логикой и гонкам.
Проверьте себя
1. Чем дефект дизайна отличается от дефекта реализации?
AНичем, это синонимы
BДефект дизайна — ошибка в замысле, его нельзя исправить просто патчем кода
CДефект дизайна всегда менее опасен
DДефект реализации нельзя исправить
2. Что такое abuse case?
AОтчёт об ошибке
BСценарий злоупотребления функцией, который продумывают на этапе проектирования
CТест производительности
DЮридический документ