Отчёт об аудите читают не с перечня дефектов, а с раздела Scope. Там стоит список файлов и хеш коммита, по которому работал аудитор. Дальше идёт сверка: тот ли коммит развёрнут в сети, тот ли адрес, та ли сеть. Проверить каждый шаг — пройти цепочку от строки Scope до верифицированного исходника по адресу контракта. Перечень дефектов смотрят последним. Без совпадения ревизии он не значит ничего.
Как выглядит схема со стороны жертвы
Картина однотипная. На странице проекта висит плашка «audited by», рядом логотип известной компании и ссылка на PDF. Документ открывается, оформлен по шаблону, внутри девять закрытых замечаний и ни одного критического. Доверие складывается за полминуты, после чего человек подписывает разрешение на расходование токенов, не вчитываясь в окно кошелька.
Расхождение всплывает позже — когда с адреса уходит баланс. Выясняется, что аудит проводился по ревизии, которая в сеть так и не попала: команда переписала модуль вывода средств уже после начала проверки, собрала новый байт-код и развернула его, не заказывая повторного прохода по изменённым файлам. Отчёт настоящий, подпись настоящая, компания существует. Проверяли другой код.
Из обращений читателей складывается ещё один сюжет: аудит касался только контракта токена, а пользовательские средства лежали в стейкинг-контракте, которого в разделе Scope нет ни одной строкой, — и потому выводы отчёта к нему не относились с самого начала. Формально никто не соврал. Строка «out of scope» стояла на четвёртой странице.
Признаки, по которым распознаётся подмена
- В Scope нет хеша коммита — только названия файлов или ссылка на ветку. Ветка движется, хеш нет.
- Дата отчёта старше даты развёртывания контракта на месяцы, а в разделе про исправления нет ссылок на итоговую ревизию.
- Адрес контракта в отчёте не указан ни одной строкой. Сверять нечего.
- Исходник по адресу в обозревателе не верифицирован, видно только байт-код.
- Проверенных файлов три, а в развёрнутой системе их двенадцать, включая прокси и хранилище.
- Раздел с исправлениями заполнен фразами «исправлено командой» без хеша исправляющего коммита.
Проверка за 60 секунд: что открыть и на что смотреть
Порядок короткий и повторяемый. Нужны три окна: PDF отчёта, обозреватель сети, репозиторий проекта.
- Откройте Scope и выпишите хеш коммита целиком, а не первые семь знаков.
- Найдите в отчёте адрес развёрнутого контракта и сеть. Нет адреса — отчёт не привязан к тому, чем вы пользуетесь.
- Вбейте адрес в обозреватель. Смотрите вкладку с исходным кодом: верифицирован или нет.
- Сверьте имена файлов и версию компилятора из обозревателя с перечнем в Scope.
- Откройте коммит из Scope в репозитории. Он должен существовать и быть предком той ревизии, из которой собран развёрнутый код.
- Проверьте, сколько адресов в системе. Прокси, реализация, хранилище, раздатчик награды — каждый адрес либо в Scope, либо вне проверки.

Шестой шаг люди пропускают чаще прочих. Система из одного контракта встречается нечасто: средствами обычно распоряжается связка из прокси и реализации, а права на обновление лежат у отдельного адреса, иногда вынесенного в мультиподпись, иногда оставшегося у одного ключа без всякого таймлока. Если аудит смотрел реализацию, но не смотрел, кто и как её меняет, вывод отчёта говорит о прочности замка, а не о том, у кого ключ. Отдельный разбор того, что показывает кошелёк в момент подтверждения, собран в материале про вредоносную подпись транзакции.
Пошаговые действия, если деньги уже ушли
Возврат не гарантирован никем. Дальше описан порядок, который сохраняет доказательства и даёт следствию материал.
- Зафиксируйте хеши транзакций, адреса отправителя и получателя, время по UTC. Скриншот без хеша бесполезен.
- Снимите с адреса все действующие разрешения на расходование токенов, начиная с бессрочных и неограниченных по сумме.
- Переведите остаток на адрес, ключ которого никогда не был на том же устройстве.
- Сохраните сам PDF отчёта и страницу проекта целиком: через неделю формулировки на сайте могут измениться.
- Подайте заявление в полицию через приёмную МВД или отделение по месту жительства; приложите распечатку транзакций и расчёт суммы в рублях на дату операции.
- Если деньги уходили с банковской карты на платёжный шлюз, направьте претензию в банк и параллельно жалобу в Банк России через интернет-приёмную.
Доля возврата по банковским операциям не превышает шести процентов. В сетях без посредника возвращать нечего и некому: подтверждённая транзакция окончательна, отмена не предусмотрена протоколом, а адрес получателя не привязан к лицу, которому можно направить претензию. Поэтому порядок действий после потери — это работа с доказательствами, а не ожидание компенсации. Как выстраивается такая работа, подробно описано в разборе про движение украденных средств и остаточный риск.
Как закрыть дыру, чтобы не повторилось
Привычка одна: отчёт читается до подписи, а не после. Таблица ниже переводит каждую значимую строку документа в проверяемое действие и показывает, какой именно признак говорит о том, что проверка не прошла и выводы аудитора на развёрнутый код не переносятся.
| Строка отчёта | Что проверять | Признак, что проверка не прошла |
|---|---|---|
| Scope: список файлов и хеш коммита | Коммит существует в репозитории и является предком развёрнутой ревизии | Указана ветка вместо хеша либо коммит в репозитории не находится |
| Deployed addresses: адреса и сети | Адрес из отчёта совпадает с адресом, с которым работает интерфейс проекта | Адресов в отчёте нет или сеть указана другая |
| Severity: распределение дефектов по уровням | Каждый критический и высокий дефект имеет статус и хеш исправления | Статус «исправлено» без ссылки на коммит с правкой |
| Out of scope: что не проверяли | Контракты, где лежат пользовательские средства, входят в проверку | Хранилище, прокси или права на обновление вынесены за границу аудита |
| Disclaimer: оговорки аудитора | Текст не снимает ответственность за весь разобранный класс дефектов | Оговорка исключает экономическую модель и права администратора целиком |
Чек-лист
- Хеш коммита из Scope выписан полностью и найден в репозитории.
- Адрес и сеть из отчёта совпали с тем, что открывает интерфейс проекта.
- Исходник по адресу верифицирован, имена файлов и версия компилятора сошлись.
- Все адреса системы распределены: либо в Scope, либо честно вынесены из него.
- Каждый критический дефект закрыт коммитом, а не фразой.
- PDF скачан с домена аудитора и сохранён локально вместе с датой загрузки.
- Разрешения на расходование выданы под конкретную сумму, а не бессрочно.
- Как распознать вредоносную подпись транзакции — что показывает кошелёк в момент подтверждения и где читается подвох.
- Как распознать отравление истории адресов — почему скопированный из истории адрес приводит не туда.
- Как проследить движение украденных средств — порядок фиксации следов и оценка того, что ещё под угрозой.
- Как выделить отдельное устройство под криптооперации — настройка рабочего контура и уведомлений о расходе.
Частые вопросы
Если аудит прошёл без критических замечаний, контракт безопасен?
Нет. Отчёт говорит об отсутствии дефектов из проверенного списка в проверенной ревизии кода, и не более того. Экономическая модель, права администратора и внешние источники цены часто выносятся за границу аудита отдельной строкой, после чего любые претензии по этим классам риска формально к аудитору не относятся. Читайте «out of scope» раньше выводов.
Как понять, что развёрнут именно проверенный код?
Сверяйте три вещи: хеш коммита из Scope, верифицированный исходник по адресу в обозревателе и версию компилятора. Совпали имена файлов, ревизия и компилятор — проверенный код в сети. Любое расхождение означает, что аудит относится к другой версии и выводы на развёрнутый контракт не переносятся.
Отчёт лежит только на сайте проекта. Это проблема?
Это повод проверить происхождение документа. Серьёзные аудиторы публикуют отчёты в собственном репозитории или на своём домене, и копия у проекта должна совпадать с оригиналом страница в страницу. Расхождение в составе файлов или в статусах дефектов означает, что копия правилась после выдачи.
Сколько живёт результат аудита?
До следующего обновления кода. Контракт за прокси меняется без смены адреса, и отчёт месячной давности может описывать реализацию, которой уже нет. Смотрите историю обновлений по адресу прокси: дата последнего изменения реализации важнее даты на обложке документа.
Вердикт
Аудит — не печать качества, а протокол осмотра конкретной ревизии в конкретный день. Ценность отчёта определяется двумя разделами: что вошло в Scope и что из него вынесено. Сверка хеша коммита с развёрнутым байт-кодом занимает минуту и отсекает большую часть историй, которые потом приходят в редакцию. Если сверить нечего, считайте, что аудита нет, какой бы логотип ни стоял на обложке.
Разборы инцидентов и предупреждения публикуем в Telegram-канале Cryptium.
Обсуждение
Добавить комментарий