Solidity. Смарт контракты и аудит – Telegram
Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
547 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Damn Vulnerable Defi. Задачи 11, 12 и 13

Задача 13. Safe miners

Указано, что она перерабатывается и в GitHub сборнике ее нет.

Задача 11. Backdoor

Эта задача требует навыков работы с Gnosis Safe Wallet. Вообще с Gnosis у меня давняя проблема понимания, поэтому хочу однажды более прицельно разобраться в этом сервисе и его услугам.

Просто копировать решение не вижу смысла. Вернусь к задаче в момент изучения Gnosis.

Задача 12. Climber

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

Я хочу чуть больше почитать примеров о работе прокси контрактов и отложить эту задачу также на потом.

Я разобрал несколько решений, которые нашел в сети; понял, что от нас требовалось; понял смысл реализации. И вместе с тем понял, что не смогу находить уязвимости в других подобных задачах, если не поработаю с прокси вообще. Поэтому решил дать себе время.

Итого, 10 из 12 задач для новичка звучит не плохо. Останавливаться же мы не собираемся и пойдем искать другие задачи для практики поиска уязвимостей.

#dvd #DamnVulnerableDefi
Новая неделя - новые задачи

Нас уже 102!
🥳🥳🥳 Это настолько же классно, насколько и невероятно для меня. По началу я задумывал этот канал, как совместное обучение Solidity для небольшой группы людей, но постепенно он вырос в полноценный обучающий мини-портал, где собрана актуальная информация по блокчейн разработке.

И, несмотря на отсутствие мемов, развлекательного контента, прогнозов на крипто торговлю и прочую лабуду, у нас получается понемногу расти. Это здорово!

По традиции, напишу пару слов о том, чем мы будем заниматься в течение этой недели.

Прежде всего, я накопил пару десятков твитов и статей по Solidity, сервисам, новым течениям и т.д. Я постараюсь разобрать их, сделать посты и поделиться в группе. Понятное дело, сюда попадут только самые интересные материалы.

Далее мы посмотрим и попробуем разобрать два новых видео на канале Ильи про хранение данных и работу с памятью.

Также продолжим работать с вопросам безопасности смарт контрактов. И для начала подведем итоги работы с Ethernaut и DVD. Возможно, сделаем закрепленный пост с навигацией по темам. Еще хотелось бы проходить пару задач в день на других проектах, типа speedrunethereum или ethereumhacker.

Вот такой примерный план.

Приятной недели и легкого обучения!
5👍3
Безопасность и взлом контрактов 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% гарантии взлома.

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

#безопасность
👍5
Что такое динамические NFT?

Статья на английском языке вышла еще в начале апреля, но до этого момента я еще ни разу нигде не встречал упоминание о динамических NFT, или dNFT.

Все мы знаем, что как только NFT был создан, то информацию о нем нельзя изменить. При этом, обязательным параметром токена является его id, а метадата - полностью опциональна.

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

Такие dNFT могут найти широкое применение в играх, где не нужно будет каждый раз минтить новый лут при обновлении его характеристик, а можно будет просто обновить информацию об уже имеющимся.

Или при покупке недвижимости, обновлять информацию о ней в блокчейне, без необходимости "сжигать" старый токен и создавать новый.

Также мне понравился пример с видео в dNFT, когда организаторы добавляли по одному кадру в видео при покупке 1 внутреннего токена сервиса. Т.е. они выпустили 1 млн токенов, которые могли купить их пользователи. При каждой покупке, организаторы обновляли метаданные NFT и пользователям постепенно открывалось все видео! Круто, да?

Как я понял, dNFT не имеют своего стандарта и обновление метаданных происходит силами разработчиков, поэтому каждый может создать свой dNFT, немного пораскинув наработками.

#nft #dnft
👍3
Пара интересный сервисов

Нашел пару интересных сервисов для блокчейн разработчика.

Abi Ninja

Мини проект для взаимодействия с ABI контракта в различных сетях Эфира. Вы можете использовать как адрес контракта, который уже был подтвержден на etherscan, или же скопипастить адрес и abi.

Eth-toolbox

Прикольный мультитул для разработчика: делает конвертацию uint, хеширование инпутов, форматирование адреса, переводы hex и многое другое.

Создание древа Меркла

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

#abininja #toolbox #merkletree #merkle
👍3
Оракулы Binance

В октябре этого года Binance запустила свой сервис оракулов.

В некотором роду он выступает конкурентом Price Feeds от Chainlink и некоторым сервисам TheGraph, так как позволяет мониторить цены на популярные активы.

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

Чуть больше почитать об этом можно тут.

#binance
👍4
Out of Gas

В Твиттере встретил код assembly, который пытается сохранить 1 бит очень "глубоко" в памяти, что приводит к перерасходу газа.

assembly {
mstore(not(0),1)
}

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

#assembly #gas
👍2
MetaMask Flask and Snaps

А знаете ли вы, что у Метамаск есть собственная программа для разработчиков, которые могут создавать и внедрять свои предложения \ наработки прямо в кошелек Метамаск?

Они сделали форк от основного проекта, того приложения, которым мы все пользуемся на телефонах и в браузере, назвали его Metamask Flask и сказали разработчиками, что они теперь могут писать свои мини приложения на js (Snaps).

Вот главная страница проекта, откуда можно скачать Flask и испытать его возможности. А тут почитать документацию.

В рамках данного поста, также хочу вам рассказать об одном из таких приложений для кошелька под названием Snapshot Snap

Приложение использует внутренний функционал кошелька с уведомлениям и позволяет создавать свои собственные уведомления на события в блокчейн.

Например, вы можете подписаться на события по какому-либо адресу, протоколу или цене.

В видео там приводится пример, когда пользователь устанавливает уведомление на ставку на его NFT, загруженного на Opensea. Каждый раз, когда кто-то делает новую ставку, владелец получает уведомление на свой кошелек Метамаск.

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

Однажды Метамаск может стать эдаким Google Play в мире блокчейна.  

#metamask #flask #snaps
👍2
Структура/хранение данных

Очередной прекрасный видео урок от Ильи на его Youtube канале.

Это видео подойдет скорее для продвинутых учеников Solidity, так как без практики будет немного сложно соотнести знания с теорией.

Видео урок.

Особо добавить или разобрать тут нечего. Рекомендую посмотреть на досуге.

#memory
👍2
Динамические массивы и мэппинги в storage

И сразу по следам предыдущего видео мы посмотрим другой урок о storage.

Видео урок.

Здесь лектор более наглядно рассказывает о том, как располагаются значения в хранилище. Особое внимание он уделяет динамическим массивам и mapping.

В задачах на взлом контрактов мы встречали несколько упражнений, где требовалось знать работу памяти и уметь доставать значения через getStorageAt(). Поэтому эта тема является достаточно важной для обучения блокчейн разработчика!

#mapping #array #storage
👍1
NFT и сервисы Alchemy

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

- владельца NFT;
- всю коллекцию;
- коллекцию с одного адреса;
- историю перемещения NFT;
- список адресов владельцев данной коллекции;
- адрес контракта создателя коллекции;
- метаданные токена;
- перемещения NFT у одного адреса;

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

#alchemy #nft
👍2
Мысли вслух

Как я уже писал ранее, я хочу найти работу в сфере безопасности смарт контрактов и аудита, поэтому начал активно штурмовать эту тему. И столкнулся с небольшой проблемой.

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

И теперь, когда я стараюсь найти что-то новое через гугл, youtube, twitter, то попадается также очень много повторного материала. Те же описания уязвимостей, те же простые примеры атак... Короче, я столкнулся с лимитом общедоступного материала. А повторяться совсем не хочется.

Я пошел немного дальше и залез на форумы специализированных компаний, которые предлагают программы bug bounty и поддерживают форумы для white hat хакеров. И там наткнулся на хороший материал / ссылки / примеры по безопасности.

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

Потом нужно будет взять какую-нибудь легкую тему на недельку, типа работы с ethers.js, и поразбирать несколько примеров, как соединять сайт и контракт.

Всем хорошего дня!
👍6
Как скачать смарт контракт из сети?

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

Вот ссылка на проект. Возможно, кому-то однажды пригодится.

P.S. В комментариях Nekto делится еще одной ссылкой на крутой проект Smart Contract Sanctuary.

#download #tools #toolbox
1👍1
Набор ресурсов для разработчика

Еще одна отличная подборка ресурсов / программ / github репо, которые будут полезны для всех, кто работает в сфере блокчейна.
Как я понял это авторская упорядоченная подборка на все случаи жизни.

Тут есть материалы для работы с API, ABI, транзакциями, аналитика и еще куча всего!

Жаль, что пока я не понял, как сохранить все в отдельный файл.

#tools #toolbox
👍31
Я тебя по IP вычислю!

А знали ли вы, что закинув NFT на кошелек, можно спокойно вычислить IP пользователя? А вместе с этим и геолокацию, которая порой бывает довольно точна.

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

Уязвимость кроется в некоторых кошельках, включая Метамаск, которые автоматически "подтягивают" NFT для вашего адреса. К примеру, вы создали NFT или купили его на OpenSea, и через некоторое время он появился у вас на балансе в кошельке.

Так, зная ваш адрес кошелька, хакер может создать NFT, указать url нужный ему и передать права на NFT вам. После этого токен появится в вашем кошельке. А что это значит? То, что Метамаск отправит запрос на url для скачивания картинки, а вместе с этим передаст и ваш IP.

Старая угроза заиграла новыми красками!

#nft #metamask #security
👍5
Разбор задачи от Immunefi

Нашел в сети небольшую задачу от популярной компании Immunefu, которая занимается безопасностью смарт контрактов.

Предлагаю ее вашему внимаю по этой ссылке. Целю является получить желаемый NFT. Ниже будет представлен разбор решения, поэтому вы сможете сначала сами разобрать его, а потом свериться с ответом.

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

Далее идет функция list(), которая создает токен и устанавливает время ставок, и collect(), которая позволяет забрать токен победителю. Обе они защищены модификатором от reentrancy. Да и в целом, выглядят ок.

А вот bid() выглядит очень интересно. 4 проверки в начале и запись ставки для NFT, если ранее такой не существовало.

А если уже есть ставка на данный NFT?

В этом случае идет проверка на сумму ставки, если она меньше предложенной ранее, то идет откат транзакции. Если же больше, то предыдущему владельцу возвращается его Эфир, и уже после записывается новый владелец ставки.

Вот тут и кроется уязвимость! Если ставку предыдущего участника не получается вернуть, то выполнение функции дальше тормозится, и новый адрес установить невозможно. Всего-то останется дождаться конца аукциона и забрать свой приз.

Простой контракт может выглядеть так:

contract Attack {
  Auction auction;
  constructor (address _auction) {
    auction = Auction(_auction);
  }
  function attack (uint256 _id) external payable {
   
auction.bid{value:2 ether}(_id);
  }
  receive() external payable {
    revert ("...");
  }
}

Это простая DoS атака, при этом интересная задача с аукционом.

#dos #challenge
👍3
Защити свой Метамаск

Мы все знаем про случаи махинаций с криптовалютами и токенами в смарт контрактах. Там были зайдествованы смарт контракты, биржи и обменники. Но мошенники развиваются вместе с нами, и теперь они стали чаще использовать web2 для своих атак. Хочу рассказать вам несколько способов, которые участились в последнее время.

Тут нужно еще пояснить про работу кошелька Метамаск в браузере.

Вы замечали, что для сjdершения транзакций сперва нужно ввести свой пароль и открыть кошелек? До тех пор он остается залочен. И после ввода пароля, он открывается и сайт получает информацию об адресе. А значит может узнать все ваши транзакции, состояние счета и т.д.

Более того, если у вас в одной вкладке открыт кошелек с одним адресом, а потом вы открываете новую вкладку и меняете адрес в кошельке, то все сайты получат доступ к обоим адресам! Поэтому тут надо быть внимательным.

При этом, даже если у вас кошелек залочен, то сайт все равно узнает, что вы пользователь метамаска!

И вот как все это может быть использовано.

1. Уведомление о том, что последняя транзакция не прошла. Такое случается, когда вы заходите на сайт злоумышленника, и там, обычно в правом верхнем углу, всплывает уведомление о не прошедшей транзакции. При этом сумма, цель и другие данные совпадают на 100%! И все потому, что данные в блокчейне открыты. Вы нажимаете на уведомление, открывается Метамаск с предлагается выполнить транзакцию. Понятное дело, адрес уже изменен и деньги будут перенаправлены туда.

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

3. Копирование дизайна окна Метамаск. Вы заходите на сайт и через некоторое время появляется окно в точности похожее на окно приложения. Пара просты движений и деньги украдены.

При всех этих махинациях ваш кошелек должен быть разлочен в браузере. Также есть несколько способов и с закрытым кошельком.

4. Уведомление на действие. Для начала каким-либо уведомлением или окном мошенник попытается убедить вас разлочить кошелек. Потом идет одно из вышеперечисленных действий.

5. Окно копирующее Метамаск, куда вас попросят ввести секретную фразу. Тут без комментариев.

6. Временная атака. Сайты могут отлавливать разлочивание кошелька, предлагая потом одно из действий перевода средств.

В общем, не попадайтесь на подобные уведомления и берегите свою секретную фразу.

#безопасность #securiry #metamask
👍3
Отслеживание стоимости газа

Встретил интересный сервис, который отслеживает стоимость газа и перекладывает ее на различные графики. Тут можно посмотреть стоимость транзакций (газ и $), среднюю стоимость за час, за день, за квартал и т.д.

В общем еще один инструмент для разработчика.

#tool #toolbox #gas #price
👍1