Безопасность и взлом контрактов v1.0
За последние три недели мы в хорошем темпе прогнали задачи Ethernaut и Damn Vulnerable Defi с одной целью: научиться видеть места, в которых могут таиться уязвимости контрактов.
Да, это несомненно клево суметь решить каждую задачу самому. Однако, теперь я могу с уверенность сказать, что проходить конкретно эти и любые другие задачи нужно дважды. Первый раз - после изучения основ языка Solidity, и второй раз - после полугода обучения.
Теме безопасности уделяется неимоверно мало времени на курсах и в сети. А между тем, взломы контрактов происходят чуть ли не каждый день. Зная, о потенциальных угрозах с практической точки зрения, мы можем перестроить свою разработку на более безопасный путь.
Научиться видеть и понимать угрозы взлома должны стать базисом обучения разработчиков смарт контрактов.
Предлагаю вспомнить некоторые моменты в контрактах из задач, которые таили в себе уязвимости.
1. Версии Solidity. Достаточно много задач и примеров "плохого" кода были реализованы на старых версиях языка (ниже 0.8). Разработчики Solidity стараются фиксить баги и повышать безопасность с каждым новым релизом. Поэтому крайне рекомендовано использовать последние версии языка.
2. Права доступа. Продумывайте, кто и к каким функциям будет иметь доступ: админ, модератор, обычный пользователь или кто-то еще. Старайтесь максимально обезопасить функции передачи прав собственности и возможность принимать решения по выводу средств.
3. Области видимости функций. Не забывайте, что вызывать из могут и пользователи, и контракты, и callback функции и еще куча всего.
4. Обрабатывайте return, где это только можно. Многие функции, типа transfer и call, возвращают return (true, false, 0), который должен быть обработан перед продолжением выполнения логики функции.
5. Опасный delegatecall. Используйте его, только если наверняка знаете, как он работает и кто его сможет вызвать. Достаточно большое количество взломов было из-за него.
6. Callback функции. Встаньте на место хакера и подумайте, может ли он использовать callback функцию, чтобы забрать деньги с вашего контракта или заполучить права админа.
7. Знание всех функций стандартов. Если работаете с каким-либо стандартом (ERC20, ERC721 и другие), то следует понимать и знать, какие функции там существуют. Если контракт наследует от, например ERC20, то следовательно он имеет доступ ко всем функциям стандарта, даже если они не указны напрямую.
8. Базовые принципы работы. Вообще, связываясь например с прокси контрактами, не следует просто брать готовые шаблоны, даже на openzeppelin. Прежде всего следует изучить как можно больше материалов по работе и безопасности прокси. Бездумное копирование кода приведет к практически 100% гарантии взлома.
Уверен, позже мы еще добавим несколько пунктов в этот список. Но это то, что мы должны были понять после разбора задач.
#безопасность
Post #453
183
- 👍 5