Solidity. Смарт контракты и аудит
2.62K subscribers
246 photos
7 videos
18 files
550 links
Обучение Solidity. Уроки, аудит, разбор кода и популярных сервисов
Download Telegram
Письменное задание в Spearbit

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

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

Есть два контракта: прокси и Логики. Деплой логики делается только однажды для всех пользователей. Прокси - для каждого свой.

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

Тут есть критическая уязвимость. Задание: найти ее и дать свои рекомендации по ее устранению.

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

Вот ссылка на репо задания: https://github.com/spearbit-audits/writing-exercise

Удачи в поисках!

#proxy #bug #spearbit
👍111🔥1
Баг из протокола Mia

На днях выпустили отчет по аудиту Mia DAO, где был один примечательный med issue, о котором хочется рассказать.

Посмотрите на код ниже и подумайте, в чем тут может быть проблема:

function _normalizeDecimalsMultiple(uint256[] memory _deposits, address[] memory _tokens) internal view
        returns (uint256[] memory deposits)
{
   for (uint256 i = 0; i < _deposits.length; i++) {
      deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());
   }
}


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

Ответ:

Функция не будет работать, так как deposits никогда не были сохранены в памяти.

Вот как правильно нужно было сделать:

{
  uint len = _deposits.length;      
  deposits = new uint256[](len);
  for (uint256 i = 0; i < len; i++) {
     deposits[i] = _normalizeDecimals(_deposits[i], ERC20(_tokens[i]).decimals());
  }
}

Интересный пример, не так ли?

#bug
👍12