Баг vs. Уязвимость: В чем разница и как защититься

Делитесь и голосуйте:

Кирилл Горшков, эксперт компании SmartDec, которая занимается исследованиями в области безопасности смарт-контрактов, рассказал о том, что такое баги и уязвимости, чем они различаются и как с ними бороться.

В ходе проведенных нами аудитов смарт-контрактов мы пришли к выводу, что существует два принципиально разных типа проблем безопасности — баги и уязвимости. Однако сообщество в основном их не различает, что лично мне кажется неправильным. Баги и уязвимости требуют разных подходов для обнаружения и предотвращаются на различных этапах SDLC (Software development lifecycle, жизненный цикл разработки системы). В этой статье я дам определения багов и уязвимостей, опишу, в каких аспектах они различаются или похожи, и расскажу, что с ними делать.

Я буду говорить о багах и уязвимостях в контексте смарт-контрактов Ethereum, но эти рассуждения применимы к любым типам программ и языкам программирования.

Баг vs. Уязвимость

Итак, проблемы безопасности могут быть разделены на баги и уязвимости. Во-первых, давайте определим, что мы считаем проблемой безопасности:

Особенность системы, приводящая к нежелательным последствиям, называется проблемой безопасности.

Во-вторых, в чем разница между багами и уязвимостями? Мы с коллегами нашли много определений того и другого. Мы остановились на следующем, которое кажется наиболее строгим и включает в себя все остальные:

Если проблема безопасности приводит к невыполнению запланированного сценария, то это баг.

Если проблема безопасности приводит к выполнению незапланированного сценария, то это уязвимость.

Поясним на примерах:

Если у вас не получается залогиниться с корректными данными, это баг.

Если у вас получается залогиниться с некорректными данными, это уязвимость.

Откуда берутся баги и уязвимости

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

Уязвимости же появляются из-за недостаточного понимания некоторых аспектов технологии (например, языков смарт-контрактов Solidity/Vyper, исполнения кода на EVM или компиляторов). Таким образом, баги уникальны, тогда как уязвимости более стандартны и поддаются классификации.

На что могут повлиять баги и уязвимости

Как баги, так и уязвимости могут нарушать критические свойства программы. С одной стороны, может быть потеряна функциональность проекта (например, невозможно снять токен с паузы). С другой стороны, проблемы безопасности могут быть использованы злоумышленниками для проведении различных атак. Или, например, увеличить стоимость исполнения кода в сети Ethereum.

Как предотвратить угрозу

Давайте рассмотрим различные подходы защиты проектов:

  • Инструменты безопасности — инструменты для автоматического поиска известных проблем;
  • Тесты — автоматическая проверка функциональности проекта;
  • Покрытие тестами — проверка того, какие части кода покрыты, а какие не покрыты тестами;
  • Code review — проверка кода более опытным членом команды;
  • Аудиты — проверка безопасности проекта (включает в себе все вышеуказанные методы) внешним аудитором;
  • Bug bounty — программа вознаграждений за найденные проблемы безопасности.

В первую очередь для проверки исполняемости всех задуманных сценариев важно писать тесты, а также необходима проверка покрытия для оценки качества тестов проекта. После этого стоит воспользоваться инструментами безопасности для обнаружения известных уязвимостей. Кроме того, из-за уникальности багов код должен быть проверен вручную. Наилучший способ — использование code review, программы bug bounty, а также нескольких независимых аудитов. Такие меры помогают справиться как с багами, так и с уязвимостями.

Государство и общество

События и встречи

Ждем новостей

Нет новых страниц

Следующая новость