В ноябре 2020 года критическая уязвимость в хранилище комиссий протокола Loopring (LRC Protocol Fee Vault) позволила злоумышленникам воспользоваться недостатками контроля доступа и манипулировать ценами токенов с помощью атак с использованием мгновенных займов (flash loans). Этот инцидент подчеркивает важность надежного контроля доступа и непрерывного мониторинга безопасности DeFi для предотвращения дорогостоящих взломов.
Введение в инцидент с протоколом Loopring (LRC)
В конце 2020 года несколько DeFi-платформ на базе Ethereum, включая Pickle Finance и 88mph, столкнулись с инцидентами безопасности. Для обнаружения подобных уязвимостей компания BlockSec разработала систему ThunderForecast, которая выявила подозрительные транзакции с необычно большими расхождениями в курсах обмена и систематическим получением прибыли в Ether одним и тем же внешним адресом (EOA).
Используя нашу систему EthScope, мы проанализировали эти транзакции и обнаружили эксплойт, нацеленный на уязвимость в протоколе хранилища Loopring, а именно в LRC Protocol Fee Vault (LRCPFV). В этом блоге подробно описывается атака, ее последствия и уроки, извлеченные для сообщества безопасности DeFi.
Обзор LRC Protocol Fee Vault
Loopring — это протокол децентрализованной биржи (DEX) с открытым исходным кодом на базе Ethereum. Его нативный токен, LRC (ERC-20), используется внутри экосистемы. Протокол хранилища Loopring, известный как LRC Protocol Fee Vault (LRCPFV), хранит комиссии протокола и позволяет обменивать их на токены LRC.
Уязвимая функция в LRCPFV — sellTokenForLRC, которая позволяет обменивать токены на LRC без надлежащего контроля доступа, позволяя любому пользователю вызвать её.
function sellTokenForLRC(
address token,
uint amount
)
external
nonReentrant
{
require(amount > 0, "ZERO_AMOUNT");
require(token != lrcAddress, "PROHIBITED");
address recipient = tokenSellerAddress == address(0) ? owner : tokenSellerAddress;
if (token == address(0)) {
recipient.sendETHAndVerify(amount, gasleft());
} else {
token.safeTransferAndVerify(recipient, amount);
}
require(
tokenSellerAddress == address(0) ||
ITokenSeller(tokenSellerAddress).sellToken(token, lrcAddress),
"SELL_FAILURE"
);
emit TokenSold(token, amount);
}
Поскольку в этой функции отсутствует контроль доступа, злоумышленники могли неоднократно вызывать ее для манипулирования ценами токенов и извлечения прибыли из арбитражных возможностей.
Детали атаки
Мы проанализировали показательную транзакцию атаки: 0x00b2c.... Атака состояла из шести ключевых этапов:

- Мгновенный заем (Flash Loan): Заимствовано 3 773,88 ETH у провайдера мгновенных займов (
0xEB7e...). - Первоначальный обмен: Конвертировано 3 773,88 ETH в 5 014,68 LRC на Uniswap V1-LRC по курсу 1 ETH = 1,32878 LRC.
- Обмен в хранилище комиссий: Обменено 0,231 ETH комиссии, хранящейся в LRCPFV, на 0,000219 LRC путем вызова уязвимой функции
sellTokenForLRC. Этот неавторизованный вызов манипулировал ценой LRC на Uniswap, резко увеличив ее стоимость по отношению к ETH (1 ETH = 0,00094 LRC). - Прибыльный обмен: Обменено 5 014,68 LRC обратно на 3 774,09 ETH на Uniswap V1-LRC, получив дополнительно 0,215 ETH благодаря манипуляции ценой.
- Возврат займа: Возвращен мгновенный заем в размере 3 773,88 ETH.
- Перевод прибыли: 0,215 ETH прибыли переведено на EOA злоумышленника.
Этот эксплойт использовал атаку с мгновенным займом в сочетании с манипуляцией ценой и отсутствием контроля доступа в контракте хранилища.
Воздействие и масштаб атаки
Проанализированная транзакция произошла 13 октября 2020 года. Согласно данным CoinGecko, цена LRC в то время составляла приблизительно 0,0005175 ETH.
Наше расследование показало:
- Вредоносные контракты: 3, развернутые злоумышленником (
0xa896...,0x414a...,0xd91d...). - Объем атак: 90 транзакций, инициированных EOA злоумышленника (
0x81e8...) начиная с блока 9 644 449, в котором был развернут LRCPFV. - Максимальная прибыль: Одна транзакция (
0x33eab...) принесла 9,89 ETH прибыли. - Общая прибыль: Приблизительно 80,97 ETH (~48 849 долларов США по состоянию на 1 октября 2020 года).
Первопричиной стало отсутствие контроля доступа в функции sellTokenForLRC, что позволило многократно эксплуатировать уязвимость.
Уроки и заключение
По мере роста экосистемы Ethereum DeFi проблемы безопасности, такие как уязвимости контроля доступа, становятся все более критичными. Хотя громкие атаки часто привлекают внимание, менее заметные уязвимости могут привести к значительным финансовым потерям, как показал этот инцидент.
Loopring потеряла около 80,97 ETH из-за этого эксплойта, что подчеркивает необходимость строгого аудита смарт-контрактов и непрерывного мониторинга безопасности.
Для DeFi-протоколов внедрение строгого контроля доступа, использование инструментов, таких как аудит смарт-контрактов и Phalcon Security от BlockSec, а также проактивное управление рисками имеют важное значение для защиты цифровых активов.
Хронология инцидента
- 30.11.2020: Подозрительные транзакции обнаружены системой ThunderForecast.
- 01.12.2020: Завершен детальный анализ с использованием EthScope.
- 02.12.2020: Об уязвимости сообщено команде Loopring.
- 03.12.2020: Уязвимость подтверждена; реализовано исправление.
- 03.12.2020: Публичное раскрытие деталей инцидента.
- 03.01.2021: Уязвимости присвоен идентификатор CVE-2020-35962.



