Cryptonomist часто публикует новости о том, что в криптовалютных или блокчейн-проектах обнаружились баги либо уязвимости, которые привели к потере средств пользователями. Разбираемся, чем баг отличается от уязвимости, как от них защититься и как на них заработать.
Почему это важно
Вопрос состоит не только в правильной классификации для четкой формализации понятий. Баги и уязвимости предполагают разные подходы к обнаружению. Кроме того, появление багов и уязвимостей можно обнаружить и предотвратить на различных этапах жизненного цикла программного обеспечения.
Стоит признать, что баги и уязвимости могут иметь немало общего. Но нас интересуют, в первую очередь, различия между ними.
Проще всего попять суть различий на примере смарт-контрактов Ethereum. Их достаточно много, при этом значительная часть контрактов составляется неспециалистами, отсюда — огромное количество багов и уязвимостей.
Проблемы безопасности
Проблема безопасности — это такая особенность системы, которая может привести к нежелательным последствиям. Она может быть как багом, так и уязвимостью. Логичнее всего показать разницу так:
- Если из-за проблемы безопасности запланированный сценарий поведения системы не отрабатывается, то это баг.
- Если, напротив, проблема безопасности приводит к выполнению незапланированного сценария, то это уязвимость.
Ещё проще разницу между багом и уязвимостью демонстрирует следующий пример: если вы не можете пройти авторизацию в системе с корректными данными, то это баг. Если же вы можете авторизоваться с некорректными данными, то в системе есть уязвимость. Впрочем, вполне возможно, что при авторизации вы можете столкнуться и с багом, и с уязвимостью одновременно.
Подчеркнем: в данном случае мы рассматриваем только баги, которые касаются безопасности. Багом может считаться и кнопка не того цвета, но так как она вряд ли может привести к краже активов, такой баг имеет низкий приоритет и будет исправлен в последнюю очередь.
Причины появления
Давайте вернемся к определению бага. Если следовать ему, то становится понятно, что баги в системе возникают из-за проблем с задуманным сценарием. Причин может быть несколько: к примеру, разработчик случайно допустил ошибку или опечатку в коде смарт-контракта, не продумал логику системы или плохо её реализовал.
Уязвимости чаще возникают из-за того, что разработчик недостаточно хорошо понимает отдельные аспекты технологии. К примеру, он не до конца разобрался в особенностях языков смарт-контрактов Solidity, принципах исполнения кода на виртуальной машине Ethereum или методах работы компиляторов.
Аналитики утверждают, что уязвимости хорошо поддаются классификации. Баги же чаще всего уникальны, поэтому обнаруживать и закрывать их сложнее.
Почему баги и уязвимости опасны
И уязвимости, и баги могут нарушать критически важные свойства программы. Кроме того, они могут обеспечивать потерю проектом функциональности. К примеру, из-за уязвимости может не получаться снять токен с паузы.
Кроме того, злоумышленники могут эксплуатировать проблемы безопасности для проведения атак. В отдельных случаях у хакеров получалось увеличивать стоимость исполнения кода в сети Ethereum, не говоря уже о краже криптоактивов с кошельков или платформ.
Предотвращение угроз
Эксперты выделяют несколько классов средств, которые помогут предотвратить появление и эксплуатацию багов и уязвимостей в криптовалютных проектах.
- Инструменты безопасности: позволяют находить и закрывать известные (классифицированные) уязвимости.
- Автоматические тесты: обеспечивают всестороннюю оценку систему и отслеживание сохранения её состояния после проведения обновлений и внесения изменений.
- Оценка покрытия тестами: позволяет определить, какая часть кода тестируется, и постепенно увеличивать эту долю до 100%.
- Code review: оценка чужого кода опытными участниками проекта, его совершенствование.
- Bug bounty: программа поиска багов и уязвимостей в коде за вознаграждение. Как правило, количество токенов, которые предоставляет проект, пропорционально сложности и опасности бага или уязвимости.
Отметим, что опытные разработчики и тестировщики могут зарабатывать на bug bounty. Это полезно как в финансовом плане, так и для повышения собственного уровня.