Записки о вдумчивом участии в Gnosis Safe кошельках
----
В запросе (proposal) выполнить транзакцию должно быть четко сформулировано намерение: какое контракт (его адрес) или контракты будут вызываться в ходе исполнения транзакции. Какие данные будут передаваться в вызов, и что эти данные значат.
Также запрос простыми словами объясняет, что делает транзакция и почему необходимо сделать то или иное действие.
Варианты действий, которые будут рассматриваться ниже:
- переводит токены
- апгрейдит контракты
- изменяет настройки контрактов
Step 1:
В интерфейсе GnosisSafe смотрим с какими контрактами происходит взаимодействие.
Какой метод контракта вызвается, какие данные передаются в метод.
Сравниваются адрес контракта и данные с намерением.
Step 2:
Делаем симуляцию исполнения в tenderly -- для этого нужно начать подтверждение транзакции, после чего появится ссылка на симуляцию.
На что смотрим в Tenderly:
1. Если это перевод токенов, то смотрим в Events - количество Transfer должно быть столько сколько намеревалось. В событии смотрим:
- контракт испускающий событие - контракт токена
- кто отправитель
- кто получатель
- сумма
- соответствуют ли эти данные намерению
Метод Transfer может отсутствовать, если выполняется перевод нативных токенов. Тогда нужно в tenderly оценить изменение баланса в State Changes для соответствующих отправителя и получателя.
2. Если это апгрейд контрактов, то смотрим по трейсам (для контрактов поддерживающих стандартный proxy шаблон):
- у каких proxy вызваются методы апгрейда имплементации
- какой адрес имплементации передается в метод апгрейда
- происходит ли вызова методов совместно с вызовом апгрейда
- соответствуют ли эти данные намерению
В запросе на апгрейд должна быть представлена delta для имплементации. Необходимо оценить дельту - нет ли там очевидных внедрений вредоносного кода.
Также важно пройтись по имплементациям в блок эксплорере и оценить их код, соответствует ли он коду из delta, кем и когда он был задеплоен.
При этом, если вызывалась метод имплементации, как часть апгрейда, оценить логику этого метода используя исходный код в блок эсплорере и tenderly.
Если в запросе на апгрейд обновляются несколько контрактов, то необходимо выполнить шаги выше для каждого из контрактов.
3. Если вызывается метод для изменения настройки параметров (или вызов контрактов для других целей), то в tenderly нужно оценить вызываются ли те методы и с теми данными, которые намеревались.
Важно зайти в исходный код контракта и посмотреть код вызываемых методов, чтобы оценить не выполняется ли в них вредоносный код.
По tenderly оценить трейсы, какие методы и какие контракты выполняются ниже по стеку. Не содержит ли трейс каких-то подозрительных действий.
Отдельно нужно проинспектировать события в tenderly - нет ли там чего-то подозрительного. Если есть Transfer или изменения балансов нативного токена в State Changes, то нужно оценить отправителя, получателя, сумму -- соотносятся ли они с намерением.