Визначення
Replay attack (атака повторного відтворення) — це тип атаки, за якої зловмисник перехоплює легітимно підписану транзакцію та повторно відправляє її в мережу. Мета — змусити систему виконати ту саму дію ще раз: повторно списати кошти, здійснити переказ або змінити стан контракту.
Як працює
У блокчейні кожна транзакція містить криптографічний підпис відправника. Підпис підтверджує, що власник ключа санкціонував операцію, але сам по собі не прив'язує транзакцію до конкретного моменту чи конкретної мережі. Без додаткового захисту підписану транзакцію можна скопіювати та відправити повторно.
Solana вирішує це через механізм recent blockhash — кожна транзакція містить хеш недавнього блоку. Цей хеш дієє приблизно 1–2 хвилини (близько 150 блоків), після чого транзакція з таким blockhash вважається недійсною. Таким чином, повторна відправка тієї самої транзакції в мережу Solana після закінчення цього вікна буде відхилена.
Однак захист не є абсолютним у двох випадках:
- Cross-chain replay — якщо інша мережа приймає такий самий формат транзакцій, перехоплену транзакцію можна спробувати відправити туди. Solana-транзакції мають специфічну структуру, тому пряма міграція на інші мережі малоймовірна, але для деяких побудованих поверх Solana ланцюжків цей ризик існує.
- Durable nonce — спеціальний механізм, який дозволяє транзакціям залишатися чинними необмежений час замість використання recent blockhash. Такі транзакції потребують окремого захисту від повторного відтворення, зокрема через унікальні ідентифікатори на стороні програми.
Приклад
Користувач підписує транзакцію на переказ 5 SOL на інший гаманець. Зловмисник отримує доступ до підписаної транзакції до того, як вона буде включена в блок. На Solana спроба повторно відправити цю транзакцію в ту саму мережу майже напевно завершиться невдачею — recent blockhash швидко застаріє, а мережа відхилить дублікат у межах того самого вікна. Але якщо розробник смарт-контракту використовує durable nonce і не реалізував власну перевірку на повторне виконання, атака стає можливою: підписана транзакція залишиться чинною й може бути відправлена повторно в будь-який момент.
Типова помилка
Вважати, що наявність recent blockhash повністю захищає від replay attack за будь-яких обставин. Насправді цей механізм захищає лише від повторного відтворення в межах тієї самої мережі Solana та в обмеженому часовому вікні. Розробники, які працюють з durable nonce або створюють суміжні ланцюжки, повинні реалізовувати додатковий захист на рівні програмної логіки — наприклад, зберігати ідентифікатори оброблених транзакцій і відхиляти дублікати.
Пов'язані матеріали
Внутрішні переходи
- Dust attack — інший тип атаки, спрямований на деанонімізацію гаманця через надсилання мінімальних сум
- Wallet drain — клас атак, що призводять до повного виведення коштів із гаманця
Додаткові ресурси
- Офіційна документація Solana щодо структури транзакцій та механізму recent blockhash
- Документація до Anchor щодо роботи з durable nonce та запобігання повторному виконанню інструкцій