«Доверяй, но проверяй» (доверяй, но проверяй), не делай «постфактум». Самый серьезный баг - черный под фарами.
Из-за неизменяемости контракта проект будет неявно полагаться на код, написанный много лет назад, и когда мы исправляем ошибки, нам нужно уделять больше внимания их потенциальному влиянию.
В этот раз случилось так.
Лента новостей
В этой статье я буду использовать «мы» для обозначения всех, кто усердно работал над этим событием. Я чувствую, что, хотя я изначально внес небольшой вклад в поиск ошибки, бесчисленное количество людей помогало гораздо больше на протяжении всего процесса.
13:10 UTC pETH/ETH $11 млн [1] осушать.
13:19 UTC Михал пишет на ETHSecurity о внезапном падении цены pETH.
Игорь первым заметил, что что-то не так. Благодаря ему мы начали расследование дальше.
Но как робот повторно вводит add_liquidity() в вызове remove_liquidity()?
14:01 UTC Сформирована группа на случай непредвиденных обстоятельств.
14:07 UTC Используем наш любимый декомпилятор [2] Декомпилировал контракт JPEGd и заметил, что слоты защиты от повторного входа немного отличаются.
// Запись таблицы отправки для add_liquidity(uint256 [2] ,uint256)
метка_0057:
если (хранилище [0x00] ) { вернуть (память [0x00:0x00]); }
хранилище [0x00] = 0x01;
// Запись таблицы отправки для remove_liquidity(uint256,uint256 [2] )
метка_1AF3:
если (хранилище [0x02] ) { вернуть (память [0x00:0x00]); }
хранилище [0x02] = 0x01;
14:27 UTC Мы подтвердили эту проблему с помощью простого локального тестового контракта.
@внешний
@nonreentrant("блокировка")
def test(addr: адрес) -> bool:
вернуть Истина
@внешний
@nonreentrant("блокировка")
def test2 (адрес: адрес) -> логическое значение:
вернуть ложь
Это не просто еще одна ошибка повторного входа.
В этот момент мы поняли, какое влияние это окажет. Заблокировать сообщение, мы удалили публичные сообщения об этой уязвимости.
14:37 UTC Wavey помог определить уязвимую фиксацию и затронутую версию. Чарльз и я также подтвердили это, вручную проверив вывод компилятора Vyper.
Это гонка против хакеров.
К счастью, люди также путают его с повторным входом только для чтения. Выдержка из канала Web3 Security Alert — Alchemix и Metronome DAO также были взломаны из-за ошибки повторного входа только для чтения [3]
Майкл также обнаружил потенциальные уязвимости в пулах alETH и msETH, работающих под управлением версии 0.2.15.
14:50 UTC msETH/ETH исчерпаны [4] 。
15:34 UTC alETH/ETH исчерпан [5] 。
15:43 UTC Мы обнаружили уязвимость в CRV/ETH, скомпилированную с помощью Vyper версии 0.3.0. [6] . Крайне важно, чтобы мы сохраняли конфиденциальность затронутых контрактов как можно дольше.
16:11 UTC Мы начинаем работать над белыми уязвимостями.
К сожалению, слишком много организаций одновременно проводят независимые исследования, и слухов предостаточно. В 16:44 UTC мы решили опубликовать публичное заявление относительно затронутой версии. [7] 。
К 18:32 UTC у нас был экспериментальный эксплойт, который можно было использовать для потенциального спасения белых шляп. Bpak от Chainlight одновременно работает над уязвимостью и поделился ею в 19:06 UTC.
Пять минут спустя, в 19:11 UTC, кто-то украл средства. [8] 。
Структура атаки сильно отличается от нашего доказательства концепции и вряд ли является утечкой от нашей команды. В любом случае, это очень расстраивает.
Тем не менее, есть много сделать.
21:26 UTC Эддисон придумал амбициозный план по спасению оставшихся активов в пуле CRVETH.
Если вы отправите 30 тыс. crv в пул crv/eth,
Вы можете обновить плату администратора
затем установите скорость crv/eth около 0,15 eth за crv
Практически все сотни тысяч crv в пуле можно извлечь
21:52 UTC bpak сделал рабочее доказательство концепции, которая может сэкономить 3100 ETH.
Через десять минут, в 22:02 UTC, мы снова потерпели поражение. Удивительно, но CRV управляет расходными роботами [9] Средства были изъяты, а бассейн слит [10] 。
обвинять
винить (Бальме) - сильно сказано. Тыкать пальцами бесполезно. Думаю, полезно подумать о том, что можно было бы сделать лучше.
Конкурс
Все усилия Белой Шляпы были подавлены менее чем за полчаса. Иногда каждая секунда на счету.
Возможно, эти атаки можно было бы провести с лучшей подготовкой и ресурсами. В то же время это представляется палкой о двух концах. Действительно ли это хорошая идея собрать информацию о том, как выполнить взлом? Кому мы должны доверять?
С другой стороны, я думаю, что весь процесс очень эффективен. Мы прошли путь от первоначального подозрения до подтверждения уязвимости за 2 часа и 4 минуты.
Раскрытие информации
Я и аудитор, и белый хакер.
Аудиторская индустрия имеет уникальную издательскую культуру. Нам платят за лидерство в технической мысли и глубокое понимание уязвимостей. Один из способов продемонстрировать свое лидерство и глубину — опубликовать [11] «Совок» по взлому. Исследователи стоят дорого, а отдача от инвестиций — это известность.
С другой стороны, есть веский аргумент в пользу того, что раннее раскрытие затронутой версии окажет значительное влияние на спасение «белых шляп».
Если бы это были лишние полчаса, можно было бы сэкономить 18 миллионов долларов.
Аудиторы не платят за влияние своих отчетов. Вместо этого они получают лайки, ретвиты и охват. Кажется, это проблема.
Следующий шаг
Я не согласен с «нам нужна формальная проверка, чтобы решить эту проблему» и тому подобное. Эта ошибка может быть обнаружена с помощью модульного тестирования. Формальная проверка очень полезна для многих типов ошибок, но я не думаю, что она столь же полезна для относительно простых, неоптимизирующих компиляторов.
Обратите внимание, что эта ошибка была исправлена в ноябре 2021 г. [12] 。
Я думаю, что эта уязвимость Vyper связана не с технологией или языком самой команды Vyper, а скорее с проблемой процесса. Эта ошибка была исправлена давным-давно, не осознавая ее потенциального влияния во время исправления.
К сожалению, общественные блага легко упустить из виду. Из-за неизменяемости контрактов проекты неявно полагаются на код, написанный много лет назад. Разработчики протоколов и эксперты по безопасности должны быть в курсе последних разработок в области безопасности в стеке выполнения.
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
Хронология и размышления о взломе Vyper
«Доверяй, но проверяй» (доверяй, но проверяй), не делай «постфактум». Самый серьезный баг - черный под фарами.
В этот раз случилось так.
Лента новостей
В этой статье я буду использовать «мы» для обозначения всех, кто усердно работал над этим событием. Я чувствую, что, хотя я изначально внес небольшой вклад в поиск ошибки, бесчисленное количество людей помогало гораздо больше на протяжении всего процесса.
13:10 UTC pETH/ETH $11 млн [1] осушать.
13:19 UTC Михал пишет на ETHSecurity о внезапном падении цены pETH.
Игорь первым заметил, что что-то не так. Благодаря ему мы начали расследование дальше.
14:01 UTC Сформирована группа на случай непредвиденных обстоятельств.
14:07 UTC Используем наш любимый декомпилятор [2] Декомпилировал контракт JPEGd и заметил, что слоты защиты от повторного входа немного отличаются.
// Запись таблицы отправки для add_liquidity(uint256 [2] ,uint256) метка_0057: если (хранилище [0x00] ) { вернуть (память [0x00:0x00]); } хранилище [0x00] = 0x01; // Запись таблицы отправки для remove_liquidity(uint256,uint256 [2] ) метка_1AF3: если (хранилище [0x02] ) { вернуть (память [0x00:0x00]); } хранилище [0x02] = 0x01;
14:27 UTC Мы подтвердили эту проблему с помощью простого локального тестового контракта.
@внешний @nonreentrant("блокировка") def test(addr: адрес) -> bool: вернуть Истина @внешний @nonreentrant("блокировка") def test2 (адрес: адрес) -> логическое значение: вернуть ложь
Это не просто еще одна ошибка повторного входа.
В этот момент мы поняли, какое влияние это окажет. Заблокировать сообщение, мы удалили публичные сообщения об этой уязвимости.
14:37 UTC Wavey помог определить уязвимую фиксацию и затронутую версию. Чарльз и я также подтвердили это, вручную проверив вывод компилятора Vyper.
Это гонка против хакеров.
К счастью, люди также путают его с повторным входом только для чтения. Выдержка из канала Web3 Security Alert — Alchemix и Metronome DAO также были взломаны из-за ошибки повторного входа только для чтения [3]
Майкл также обнаружил потенциальные уязвимости в пулах alETH и msETH, работающих под управлением версии 0.2.15.
14:50 UTC msETH/ETH исчерпаны [4] 。
15:34 UTC alETH/ETH исчерпан [5] 。
15:43 UTC Мы обнаружили уязвимость в CRV/ETH, скомпилированную с помощью Vyper версии 0.3.0. [6] . Крайне важно, чтобы мы сохраняли конфиденциальность затронутых контрактов как можно дольше.
16:11 UTC Мы начинаем работать над белыми уязвимостями.
К сожалению, слишком много организаций одновременно проводят независимые исследования, и слухов предостаточно. В 16:44 UTC мы решили опубликовать публичное заявление относительно затронутой версии. [7] 。
К 18:32 UTC у нас был экспериментальный эксплойт, который можно было использовать для потенциального спасения белых шляп. Bpak от Chainlight одновременно работает над уязвимостью и поделился ею в 19:06 UTC.
Пять минут спустя, в 19:11 UTC, кто-то украл средства. [8] 。
Структура атаки сильно отличается от нашего доказательства концепции и вряд ли является утечкой от нашей команды. В любом случае, это очень расстраивает.
Тем не менее, есть много сделать.
21:26 UTC Эддисон придумал амбициозный план по спасению оставшихся активов в пуле CRVETH.
21:52 UTC bpak сделал рабочее доказательство концепции, которая может сэкономить 3100 ETH.
Через десять минут, в 22:02 UTC, мы снова потерпели поражение. Удивительно, но CRV управляет расходными роботами [9] Средства были изъяты, а бассейн слит [10] 。
обвинять
винить (Бальме) - сильно сказано. Тыкать пальцами бесполезно. Думаю, полезно подумать о том, что можно было бы сделать лучше.
Конкурс
Все усилия Белой Шляпы были подавлены менее чем за полчаса. Иногда каждая секунда на счету.
Возможно, эти атаки можно было бы провести с лучшей подготовкой и ресурсами. В то же время это представляется палкой о двух концах. Действительно ли это хорошая идея собрать информацию о том, как выполнить взлом? Кому мы должны доверять?
С другой стороны, я думаю, что весь процесс очень эффективен. Мы прошли путь от первоначального подозрения до подтверждения уязвимости за 2 часа и 4 минуты.
Раскрытие информации
Я и аудитор, и белый хакер.
Аудиторская индустрия имеет уникальную издательскую культуру. Нам платят за лидерство в технической мысли и глубокое понимание уязвимостей. Один из способов продемонстрировать свое лидерство и глубину — опубликовать [11] «Совок» по взлому. Исследователи стоят дорого, а отдача от инвестиций — это известность.
С другой стороны, есть веский аргумент в пользу того, что раннее раскрытие затронутой версии окажет значительное влияние на спасение «белых шляп».
Если бы это были лишние полчаса, можно было бы сэкономить 18 миллионов долларов.
Аудиторы не платят за влияние своих отчетов. Вместо этого они получают лайки, ретвиты и охват. Кажется, это проблема.
Следующий шаг
Я не согласен с «нам нужна формальная проверка, чтобы решить эту проблему» и тому подобное. Эта ошибка может быть обнаружена с помощью модульного тестирования. Формальная проверка очень полезна для многих типов ошибок, но я не думаю, что она столь же полезна для относительно простых, неоптимизирующих компиляторов.
Обратите внимание, что эта ошибка была исправлена в ноябре 2021 г. [12] 。
К сожалению, общественные блага легко упустить из виду. Из-за неизменяемости контрактов проекты неявно полагаются на код, написанный много лет назад. Разработчики протоколов и эксперты по безопасности должны быть в курсе последних разработок в области безопасности в стеке выполнения.