Кирилл Горшков, эксперт компании SmartDec, которая занимается исследованиями в области безопасности смарт-контрактов, рассказал о том, что такое баги и уязвимости, чем они различаются и как с ними бороться.
В ходе проведенных нами аудитов смарт-контрактов мы пришли к выводу, что существует два принципиально разных типа проблем безопасности — баги и уязвимости. Однако сообщество в основном их не различает, что лично мне кажется неправильным. Баги и уязвимости требуют разных подходов для обнаружения и предотвращаются на различных этапах SDLC (Software development lifecycle, жизненный цикл разработки системы). В этой статье я дам определения багов и уязвимостей, опишу, в каких аспектах они различаются или похожи, и расскажу, что с ними делать.
Я буду говорить о багах и уязвимостях в контексте смарт-контрактов Ethereum, но эти рассуждения применимы к любым типам программ и языкам программирования.
Содержание:
Баг vs. Уязвимость
Итак, проблемы безопасности могут быть разделены на баги и уязвимости. Во-первых, давайте определим, что мы считаем проблемой безопасности:
Особенность системы, приводящая к нежелательным последствиям, называется проблемой безопасности.
Во-вторых, в чем разница между багами и уязвимостями? Мы с коллегами нашли много определений того и другого. Мы остановились на следующем, которое кажется наиболее строгим и включает в себя все остальные:
Если проблема безопасности приводит к невыполнению запланированного сценария, то это баг.
Если проблема безопасности приводит к выполнению незапланированного сценария, то это уязвимость.
Поясним на примерах:
Если у вас не получается залогиниться с корректными данными, это баг.
Если у вас получается залогиниться с некорректными данными, это уязвимость.
Откуда берутся баги и уязвимости
Согласно определению, баги появляются из-за проблем с задуманным сценарием. Причиной может быть недостаточно продуманная логика, плохая реализация или случайные ошибки (например, опечатки).
Уязвимости же появляются из-за недостаточного понимания некоторых аспектов технологии (например, языков смарт-контрактов Solidity/Vyper, исполнения кода на EVM или компиляторов). Таким образом, баги уникальны, тогда как уязвимости более стандартны и поддаются классификации.
На что могут повлиять баги и уязвимости
Как баги, так и уязвимости могут нарушать критические свойства программы. С одной стороны, может быть потеряна функциональность проекта (например, невозможно снять токен с паузы). С другой стороны, проблемы безопасности могут быть использованы злоумышленниками для проведении различных атак. Или, например, увеличить стоимость исполнения кода в сети Ethereum.
Как предотвратить угрозу
Давайте рассмотрим различные подходы защиты проектов:
В первую очередь для проверки исполняемости всех задуманных сценариев важно писать тесты, а также необходима проверка покрытия для оценки качества тестов проекта. После этого стоит воспользоваться инструментами безопасности для обнаружения известных уязвимостей. Кроме того, из-за уникальности багов код должен быть проверен вручную. Наилучший способ — использование code review, программы bug bounty, а также нескольких независимых аудитов. Такие меры помогают справиться как с багами, так и с уязвимостями.
Источник: ru.ihodl.com