ZenGo — это безопасный кошелек Web 3, использующий технологию многосторонних вычислений (MPC).
Недавно команда CertiK SkyFall провела тщательный аудит и исследование многочисленных мобильных кошельков и обнаружила, что решение ZenGo MPC обеспечивает более надежную защиту, чем обычные мобильные кошельки. Пользователи кошельков ZenGo, особенно те, у кого есть кошельки с высокой стоимостью. Пользователи защищены от прямых атак со стороны продвинутых злоумышленников: например, использование уязвимостей нулевого дня или передовых вредоносных программ для получения root-доступа на устройстве пользователя.
Эта угроза является последней и была обнаружена только командой CertiK, поэтому разработчикам кошелька MPC следует обратить внимание на детали атаки!
Защита от привилегированных злоумышленников является сложной задачей. В результатах отчета мы предлагаем новый метод атаки и вектор атаки для метода MPC в ZenGo. Поэтому мы немедленно сообщили об этой проблеме безопасности в ZenGo, и ZenGo быстро отреагировала и устранила проблему.
В этой статье мы углубимся в технические детали открытия и расскажем, как мы работаем с ZenGo над улучшением общей безопасности кошелька MPC.
Основываясь на нашем тщательном анализе структуры безопасности ZenGo и их профессиональных ответах на проблемы, CertiK считает, что ZenGo можно назвать самым безопасным решением для кошельков на рынке в настоящее время.
Что такое МПЦ?
Многосторонние вычисления (MPC), иногда также называемые безопасными многосторонними вычислениями (SMPC), — это область криптографии. Это позволяет нескольким сторонам совместно подписывать транзакции, гарантируя при этом, что ключи каждой стороны не будут скомпрометированы.
Поскольку технология MPC может распределять ключи между несколькими сторонами, тем самым устраняя любую единственную точку отказа, она позволяет пользователям лучше защищать закрытые ключи Web 3. Этот метод также часто называют «пороговым подписанием» и в настоящее время используется многими Web 3. хранители и разработчики кошельков для защиты активов Web 3. Среди них ZenGo — один из самых известных и наиболее используемых разработчиков кошельков MPC.
Как показано на рисунке ниже, кошелек не использует традиционный закрытый ключ для контроля подписания транзакций. Вместо этого несколько закрытых ключей сегментируются для участия в процессе подписания транзакции и создания окончательной подписи для проверки.
Общий дизайн MPC, генерирующий подписи
Благодаря этому исследованию мы осознали проблемы и потенциальные риски безопасности, связанные с подходом MPC, а также важность защиты активов Web 3. Поэтому мы хотим лучше защитить пользователей Web3, изучая и решая эти проблемы.
Итак, мы можем задуматься над вопросом: почему кошельки MPC могут обеспечить более высокий уровень безопасности по сравнению с традиционными криптокошельками? Как это делается?
Проектирование ZenGo MPC и обеспечение безопасности
Благодаря этому исследованию мы осознали проблемы и потенциальные риски безопасности, связанные с подходом MPC, а также важность защиты активов Web 3. Поэтому мы хотим лучше защитить пользователей Web3, изучая и решая эти проблемы.
Итак, мы можем задуматься над вопросом: почему кошельки MPC могут обеспечить более высокий уровень безопасности по сравнению с традиционными криптокошельками? Как это делается?
Оценив дизайн различных кошельков Web 3, мы рассмотрели кошельки MPC Web 3 — мы оценили один из самых уважаемых кошельков MPC на рынке и ведущий кошелек MPC с самостоятельным размещением — ZenGo.
Для этой оценки мы использовали ту же модель угроз, что и в предыдущем исследовании: «Если ваше устройство заражено вредоносным ПО, будет ли этот кошелек по-прежнему защищать ваши активы?»
Обзор архитектуры безопасности ZenGo
Как показано на рисунке выше, кошелек ZenGo имеет уникальный дизайн безопасности, а архитектура безопасности и процесс восстановления более многоуровневые, чем у традиционных кошельков. Функции безопасности, предоставляемые ZenGo, включают, помимо прочего:
Схема двухсторонней подписи. В конструкции ZenGo MPC реализована схема двусторонней подписи. Каждый пользователь использует два фрагмента ключа при создании подписи транзакции: один хранится на серверах ZenGo (главный ключ ①), а другой хранится на устройстве пользователя (главный ключ ②). Ни ZenGo, ни пользователь не знают, какие клавиши есть у другого.
Защита на основе TEE: Кроме того, чтобы предотвратить атаки «человек посередине» и «перехват приложения», приложение ZenGo использует решение TEE (Trusted Execution Environment) и закрытый ключ TEE для подписи HTTPS. коммуникационный контент для запроса связанных API. Этот ключ устройства на основе TEE генерируется в TEE, когда пользователь настраивает устройство, и не может быть извлечен даже самой операционной системой.
Благодаря этим функциям безопасности злоумышленники больше не смогут красть личные ключи пользователей из памяти или файлов хранилища и получать контроль над активами пользователей ZenGo. ZenGo также использует TEE для защиты взаимодействия между сервером и клиентом от несанкционированного доступа. Это также означает, что атаки «человек посередине» и «перехват приложений» эффективно блокируются и защищаются.
Наш аудит подтвердил, что ZenGo имеет безопасную конструкцию и реализацию, способную противостоять этим атакам, и это самый высокий уровень безопасности среди проверенных кошельков, с которыми мы сталкивались.
Проектирование и реализация безопасности ZenGo успешно защищают от атак, включая привилегии и вышеупомянутые атаки. Однако справиться со всеми типами привилегированных атак непросто, особенно если учесть, что злоумышленники могут читать (а в некоторых случаях и записывать) произвольную память.
Проведя аудит всего кошелька, мы смогли обнаружить проблему реализации в ZenGo, которая позволяла нам действовать как привилегированный злоумышленник и обходить определенные меры защиты.
Но прежде чем обсуждать детали, давайте рассмотрим механизм безопасности кошелька ZenGo.
Безопасные методы работы с кошельком ZenGo
Благодаря этому исследованию мы осознали проблемы и потенциальные риски безопасности, связанные с подходом MPC, а также важность защиты активов Web 3. Поэтому мы хотим лучше защитить пользователей Web3, изучая и решая эти проблемы.
Итак, мы можем задуматься над вопросом: почему кошельки MPC могут обеспечить более высокий уровень безопасности по сравнению с традиционными криптокошельками? Как это делается?
Для классического кошелька Web 3 требуется только закрытый ключ. Однако всегда существует вероятность того, что пользователь раскроет закрытый ключ или мнемоническую фразу. Таким образом, они могут потерять свои секретные ключи, а затем увидеть, как злоумышленник завладеет активами.
Кошелек MPC работает по-другому. В кошельке нет ни одного секретного ключа. Теперь пользователь владеет только одним фрагментом секретного ключа и ничего не знает об остальных фрагментах секретного ключа. С этой точки зрения, даже если злоумышленник получит персональный ключ пользователя, он не сможет напрямую перевести средства. Для дальнейшей защиты пользователей ZenGo использует различные средства для усиления своей системы безопасности: не только вышеупомянутую схему двусторонней подписи и защиту устройств на основе TEE, но также биометрическую аутентификацию на основе сканирования лица и дополнительное шифрование ключей.
Меры защиты при регистрации пользователя и восстановлении учетной записи пользователя
В процессе регистрации пользователя и восстановления учетной записи ZenGo принимает следующие меры защиты для защиты активов пользователя.
Защита идентификации пользователя: схема двусторонней подписи требует, чтобы пользователи могли получить доступ к своим средствам только тогда, когда они взаимодействуют с другой стороной (серверная часть в настройках ZenGo). Чтобы иметь возможность идентифицировать пользователя и связанные с ним общие ключи, хранящиеся на сервере, ZenGo требуется адрес электронной почты пользователя для регистрации учетной записи.
Чтобы избежать взлома электронной почты, ZenGo использует технологию сканирования лица (Zoom от FaceTec) для привязки биометрической информации к учетным записям пользователей. В процессе восстановления учетной записи после регистрации и проверки электронной почты пользователям необходимо «провести пальцем по лицу» для аутентификации.
Защита связи приложения с сервером. Чтобы гарантировать взаимодействие серверов ZenGo с устройствами законных пользователей, ZenGo генерирует и регистрирует асимметричный ключ в среде TEE во время процесса регистрации и восстановления учетной записи. Все взаимодействия между приложением ZenGo и сервером должны быть подписаны этим конкретным ключом. Поскольку он защищен аппаратным решением безопасности, злоумышленник не может напрямую прочитать этот ключ, и им трудно злоупотребить.
Процесс регистрации пользователя ZenGo и восстановления учетной записи
Защита совместного использования ключей пользователей: разрешать пользователям хранить и создавать резервные копии своих фрагментов ключей рискованно, поскольку это может поставить под угрозу все меры безопасности, предоставляемые ZenGo. Чтобы решить эту проблему безопасности, ZenGo генерирует ключ шифрования во время процесса регистрации. Ключ шифрования шифрует общий ключ пользователя и сохраняет зашифрованный текст на своем сервере.
Однако ключи шифрования не передаются ZenGo, вместо этого требуется синхронизация с Google Drive или iCloud пользователя. Зашифрованный ключ можно передать и в дальнейшем расшифровать только после того, как пользователь пройдет проверку электронной почты и биометрическую аутентификацию на сервере. Среди них биометрическую аутентификацию на основе сервера (распознавание лиц FaceTec) практически невозможно «обмануть» с помощью обычной 2D/3D-реконструкции лица.
Генерация подписи транзакции Процесс транзакции ZenGo
Чтобы подписать транзакцию, приложение ZenGo выполняет ряд взаимодействий с сервером ZenGo. Во время взаимодействия ZenGo использует свое решение для двусторонней подписи с открытым исходным кодом и сегментирование пользовательских ключей для создания двусторонних подписей. Затем сервер ZenGo делает еще один шаг, подписывая и транслируя транзакцию. Все запросы в этом процессе имеют временные метки и подписываются в TEE для обеспечения целостности и невозможности повторного воспроизведения информации.
Обнаружение проблем при проектировании ZenGo MPC
Как мы уже обсуждали ранее, конструкция безопасности ZenGo включает в себя множество ключей шифрования, каждый из которых имеет разные обязанности. В таблице ниже мы показываем, какие ключи используются ZenGo и как они защищены.
Из этой таблицы мы видим, что на стороне клиента используются три ключа: главный ключ ②, ключ устройства и ключ шифрования. Злоумышленнику необходимо получить как главный ключ②, так и ключ устройства, чтобы взаимодействовать с сервером ZenGo и украсть средства пользователей.
Как было сказано в предыдущем разделе сведений о транзакции, главный ключ ② участвует в создании подписей обеих сторон в виде текста в памяти, что позволяет злоумышленнику читать память процесса и извлекать главный ключ ②. В качестве частичного решения все запросы транзакций к серверу ZenGo должны быть подписаны ключом устройства, который нельзя прочитать или извлечь. Этот процесс выполняется в TEE и не имеет никакого контроля над злоумышленником.
Однако, несмотря на множество аспектов системы безопасности ZenGo, команда CertiK SkyFall все же обнаружила в ней уязвимость. Проведя детальный аудит всех API в приложении ZenGo, мы заметили, что некоторые API позволяют злоумышленнику подделать серверы ZenGo и легко сгенерировать новый ключ устройства для использования на других устройствах.
В этом API, зарегистрированном с помощью ключа устройства, отсутствует необходимая защита: злоумышленник может сгенерировать новый ключ эллиптической кривой NIST P-256 на другом устройстве, а затем злоумышленник может использовать API, зарегистрированный с ключом устройства, и зарегистрировать новый ключ. Сгенерировать пару ключей , притворитесь новым пользовательским устройством и запросите транзакцию.
Мы называем это атакующее устройство разветвлением атаки.
Атака с разветвлением устройства на кошелек ZenGo
Как упоминалось выше, злоумышленнику потребуется главный ключ пользователя ZenGo ② и действительный ключ устройства, чтобы украсть его активы.
Главный ключ ②: Главный ключ ② — это фиксированный ключ, который используется в виде обычного текста в памяти для участия в процессе подписи обеих сторон. Из-за сложности и уникальности алгоритмов подписи обеих сторон этот процесс не может быть завершен в TEE. Таким образом, привилегированный злоумышленник может просто сбросить память процесса или захватить определенные системные API, чтобы извлечь главный ключ. На снимке экрана ниже показан главный ключ, который можно извлечь на платформе iOS ②.
Ключ устройства: во время процесса регистрации или восстановления учетной записи на устройстве пользователя в TEE генерируется действительный ключ устройства в качестве решения вышеупомянутой угрозы извлечения открытого текста. Ключ устройства не может быть прочитан привилегированным злоумышленником. Однако злоумышленник может использовать тот же API регистрации ключа устройства, чтобы зарегистрировать другую пару ключей и использовать ее.
API регистрации ключа устройства имеет только очень простой механизм аутентификации: злоумышленник может использовать общий открытый текстовый токен JWT, хранящийся локально, и извлеченный главный ключ ② для аутентификации API. По задумке серверный код, задействованный в этом API, также должен пройти биометрическую аутентификацию Face tec. Однако на практике код не может выполнить этот шаг из-за логических ошибок.
В нашей моделируемой атаке мы имитировали привилегированного злоумышленника и постоянно отслеживали устройство жертвы. Как только приложение ZenGo запускается, мы извлекаем мастер-ключ из памяти и читаем API-токен из локальной базы данных. И этой информации достаточно, чтобы злоумышленник украл все средства пользователя!
Получив токен API, мы генерируем новый ключ устройства и вызываем API регистрации ключа устройства, чтобы зарегистрировать ключ устройства на сервере ZenGo. Затем мы создали все запросы API для взаимодействия с сервером ZenGo для инициации транзакций. Для кошелька MPC генерация подписей обеих сторон — очень уникальный и сложный процесс. К счастью, процесс разработки ZenGo всегда придерживался духа открытого исходного кода, поэтому мы смогли скомпилировать библиотеку двусторонних подписей, используемую в официальном приложении ZenGo, и запустить ее локально.
На изображении выше показано, как мы извлекаем главный ключ ② и регистрируем новый ключ устройства от имени жертвы. Затем мы использовали эти два ключа для отправки 0,00222 ETH на «учетную запись злоумышленника». Весь процесс занимает всего несколько секунд и происходит совершенно без ведома жертвы.
Чтобы решить эту проблему, ZenGo реализовала биометрическую аутентификацию FaceTec на стороне сервера для регистрации устройств. Обходные пути на уровне API сервера исключают возможность этой атаки и не требуют обновления клиентского кода.
Подведем итог
При оценке ZenGo компанией CertiK мы тщательно изучили и проверяли все меры безопасности, которые он имеет для защиты пользовательских активов. К ним относятся схемы взаимной подписи, защита устройств на основе TEE и биометрия для регистрации и восстановления учетной записи.
Хотя ZenGo обладает высоким уровнем осведомленности о безопасности и приняла множество мер для повышения своей безопасности, CertiK обнаружила ключевой риск аутентификации доступа к API в реализации ZenGo. Эта уязвимость может позволить привилегированному злоумышленнику обойти существующие меры безопасности и украсть средства пользователя, если его устройство будет скомпрометировано.
ZenGo оперативно устранила проблему и развернула исправление, а CeritK впоследствии провела тщательный дополнительный аудит и определила, что исправление устраняет риски, упомянутые в отчете.
Мы считаем, что благодаря установке исправлений ZenGo сможет эффективно предотвратить незаконный доступ привилегированных пользователей к средствам пользователей в будущем. Защита от привилегированных злоумышленников — сложная задача, и методы обеспечения безопасности ZenGo показывают нам комплексный подход к защите пользователей. Этот кошелек делает больше, чем большинство обычных кошельков, представленных в настоящее время на рынке.
Мы гордимся партнерством с ZenGo и гордимся тем, что работаем вместе с ZenGo над защитой безопасности пользователей Web 3 и решением проблем безопасности. Мы также хотели бы поблагодарить ZenGo за своевременную реакцию на обнаруженные нами уязвимости и за эффективное исправление уязвимостей.
Как специалисты в области безопасности, мы очень рады видеть, что ведущая компания, производящая кошельки Web 3, так серьезно относится к безопасности и имеет такое высокое чувство ответственности за пользователей и их средства. Мы надеемся, что на пути к безопасности в будущем мы сможем повысить безопасность большего числа проектов и дать их пользователям «душевное спокойствие».
