Как восстановить кошелек MetaMask? Утерянный пароль, хранилище Vault, шифрование и криминалистическая экспертиза данных

Аватар Питера CryptoRecovery
Как восстановить кошелек MetaMask? Утерянный пароль, хранилище Vault, шифрование и криминалистическая экспертиза данных

Как восстановить кошелек MetaMask? Утерянный пароль, хранилище Vault, шифрование и криминалистическая экспертиза данных

Если вы читаете это, то, скорее всего, потеряли доступ к кошельку MetaMask и уже не знаете, что делать. Я много лет занимаюсь восстановлением кошельков для людей — от трейдеров DeFi, которые переформатировали свои ноутбуки, до бабушек и дедушек, которые «почистили» расширения в браузере. В этом руководстве собрано все, что я знаю о том, как MetaMask хранит ваши ключи, где на диске находятся эти данные и как их вернуть, если что-то пошло не так. Ничего из этого не является теоретическим. Каждый метод, описанный здесь, основан на реальных случаях восстановления.

Как MetaMask на самом деле хранит ваши ключи

Прежде чем восстанавливать что-либо, вам необходимо понять, что именно вы восстанавливаете. MetaMask не хранит ваши закрытые ключи в файле с именем private_keys.txt. Он сохраняет их в зашифрованном блоке данных, называемом хранилище, который хранится в хранилище расширений вашего браузера.

Когда вы создаете кошелек MetaMask и устанавливаете пароль, вот что происходит «под капотом». MetaMask генерирует мнемоническую фразу по стандарту BIP-39 (вашу 12-сложную Секретная фраза для восстановления) и объединяет его — вместе со всеми импортированными закрытыми ключами — в массив JSON, состоящий из объектов «keyring». Этот массив преобразуется в строку, а затем шифруется с помощью AES-256 с GCM с помощью ключа, полученного на основе вашего пароля посредством PBKDF2-HMAC-SHA256. В результате получается JSON-объект с тремя или четырьмя полями, который записывается в chrome.storage.local (в браузерах на базе Chromium) или IndexedDB (в Firefox).

В старых версиях зашифрованное хранилище выглядит следующим образом:

{"data":"SGFuZGxlIHRoaXMgZW5jcnlwdGVkIGRhdGE=","iv":"MTIzNDU2Nzg5MDEyMzQ1Ng==","salt":"cmFuZG9tMzJieXRlc2FsdHZhbHVlaGVyZQ=="}

А в более новых версиях (после v11.16.x) появилось четвёртое поле:

{"data":"...","iv":"...","keyMetadata":{"algorithm":"PBKDF2","params":{"iterations":600000}},"salt":"..."}

Это keyMetadata От этого зависит, займет восстановление несколько минут или несколько недель. Подробнее об этом чуть позже.

Алгоритм шифрования прост, но его важно точно понимать. Ваш пароль в кодировке UTF-8 импортируется в виде необработанного ключа PBKDF2 через Web Crypto API. A 32-байтовый случайный солевой ключ (создано на основе crypto.getRandomValues()) используется вместе с паролем для вычисления 256-битного ключа AES-GCM. Затем 16-байтовый случайный IV шифрует сериализованные данные связки ключей. data поле содержит как зашифрованный текст, так и тег аутентификации GCM, закодированные в формате Base64. Стоит отметить одну особенность: MetaMask использует 16-байтовый IV для AES-GCM, что является нестандартным — в документе NIST SP 800-38D рекомендуется использовать 12 байт. Это вызывает проблемы с совместимостью с некоторыми криптографическими библиотеками (например, OpenSSL для Ruby откажется с ним работать).

Когда вы разблокируете MetaMask с помощью пароля, процесс происходит в обратном порядке. KeyringController извлекает зашифрованную строку хранилища из постоянного хранилища, передает её в browser-passworder’s decrypt функция, которая анализирует JSON, извлекает соль, вычисляет ключ с помощью PBKDF2 с теми же параметрами, расшифровывает с помощью AES-GCM и обратно преобразует результат в объекты ключевого кольца. Расшифрованные ключевые кольца хранятся только в памяти – они хранятся в memStore (один ObservableStore (например) и никогда не записываются на диск в виде открытого текста.

Расшифрованное хранилище содержит массив, который обычно выглядит следующим образом:

[
  {
    "type": "HD Key Tree",
    "data": {
      "mnemonic": "abandon ability able about above absent ...",
      "numberOfAccounts": 3,
      "hdPath": "m/44'/60'/0'/0"
    }
  },
  {
    "type": "Simple Key Pair",
    "data": ["0xabc123..."]
  }
]

Этот HD Key Tree Брелок хранит ваш мнемонический ключ и количество созданных на его основе учетных записей. Simple Key Pair эти записи представляют собой импортированные отдельно закрытые ключи. Если вы подключили аппаратные кошельки, вы также увидите Trezor Hardware и Ledger Hardware типы ключевых цепочек — хотя в них хранятся только пути вывода и открытые адреса, а не закрытые ключи (последние остаются на аппаратном устройстве).

С появлением Manifest V3 (архитектуры сервисных рабочих процессов, которую Chrome начал внедрять с 2023 года) в MetaMask была добавлена возможность кэширования ключа шифрования в виде экспортированного файла JWK, что позволяет повторно расшифровать хранилище при перезапуске сервисного рабочего процесса без повторного запроса пароля. encryptionKey и encryptionSalt поля отображаются в memStore когда cacheEncryptionKey включена.

Где MetaMask хранит ваши данные на каждой платформе

Найти хранилище — это уже половина дела. MetaMask хранит данные в разных местах в зависимости от браузера и операционной системы, и эти различия имеют значение для восстановления.

Браузеры на базе Chromium (Chrome, Brave, Edge)

В браузерах на базе Chromium, chrome.storage.local сохраняется в База данных LevelDB на диске. Идентификатор расширения определяет имя папки.

Идентификатор расширения Chrome является nkbihfbeogaeaoehlefnkodbefgpgknn – навсегда запечатлелось в памяти каждого специалиста по реабилитации. Храбрый использует тот же идентификатор, поскольку устанавливается из Chrome Web Store. Край получает собственный идентификатор при установке из магазина дополнений Edge: ejbalbakoplchlghecdalmeeeajnimhm. Однако если пользователь установил MetaMask в Edge через Chrome Web Store (который поддерживается Edge), приложение сохраняет идентификатор Chrome. Это различие постоянно сбивает людей с толку.

Вот полные пути:

Chrome в Windows:
C:\Users\<USER>\AppData\Local\Google\Chrome\User Data\Default\Local Extension Settings\nkbihfbeogaeaoehlefnkodbefgpgknn\

Chrome на macOS:
~/Library/Application Support/Google/Chrome/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/

Chrome в Linux:
~/.config/google-chrome/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/

Brave для Windows:
C:\Users\<USER>\AppData\Local\BraveSoftware\Brave-Browser\User Data\Default\Local Extension Settings\nkbihfbeogaeaoehlefnkodbefgpgknn\

Brave на macOS:
~/Library/Application Support/BraveSoftware/Brave-Browser/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/

Edge в Windows (установка из магазина Edge):
C:\Users\<USER>\AppData\Local\Microsoft\Edge\User Data\Default\Local Extension Settings\ejbalbakoplchlghecdalmeeeajnimhm\

Важная деталь: если у пользователя есть несколько профилей Chrome, замените Default с Profile 1, Profile 2и т. д. Я видел, как люди часами искали не тот профиль.

Firefox — это совсем другое дело

Firefox не использует LevelDB. Он хранит данные расширений в IndexedDB, который Firefox реализует на базе SQLite. Идентификатор расширения: webextension@metamask.io, но Firefox присваивает каждой установке уникальный внутренний UUID — что-то вроде 196319ec-3a5e-4efe-9413-c327a770d874. Вы можете найти его по адресу about:debugging в разделе «Этот Firefox».

Данные находятся по адресу:

Windows: %APPDATA%\Mozilla\Firefox\Profiles\<PROFILE>\storage\default\moz-extension+++<UUID>^userContextId=4294967295\idb\

macOS: ~/Library/Application Support/Firefox/Profiles/<PROFILE>/storage/default/moz-extension+++<UUID>^userContextId=4294967295/idb/

Linux: ~/.mozilla/firefox/<PROFILE>/storage/default/moz-extension+++<UUID>^userContextId=4294967295/idb/

Внутри idb/ папке вы найдете двоичные файлы с числовыми именами. Это сжатый с помощью Snappy – их нельзя просто просматривать с помощью grep, как файлы LevelDB. Сначала их нужно распаковать с помощью такого инструмента, как snappy-fox до того, как данные хранилища станут доступны для извлечения. Это самая распространённая ошибка при восстановлении Firefox, с которой я сталкиваюсь: пользователи открывают двоичный файл, видят искажённые данные, перемешанные с фрагментами узнаваемого текста, и полагают, что хранилище повреждено. Но это не так. Оно просто сжато.

До версии Firefox 63 для хранения данных расширений использовался простой файл JSON с именем storage.js в каталоге профилей. Если вы восстанавливаете очень старую установку, найдите storage.js или storage.js.migrated.

LevelDB и файл 0001.ldb, о котором все спрашивают

LevelDB — это механизм хранения данных «ключ-значение» от Google, и понимание его файловой структуры имеет решающее значение для восстановления MetaMask в любом браузере на базе Chromium.

Каталог LevelDB в MetaMask содержит несколько типов файлов. .ldb файлы (Таблицы отсортированных строк, или SSTables) представляют собой постоянное хранилище отсортированных пар «ключ-значение». .log файлы — это журнал опережающей записи (Write-Ahead Log) — временный буфер недавних записей до их фиксации в .ldb файлы. Есть MANIFEST-###### метаданные базы данных отслеживания файлов, а CURRENT файл, указывающий на активный манифест, и LOCK файл, предотвращающий одновременный доступ.

Данные хранилища обычно попадают в с низкими номерами .ldb файл000003.ldb, 000005.ldbили что-то подобное. В документации MetaMask указано: «Это должно быть небольшое число. Если число большое, то это не хранилище». 0001.ldb файл (или 000001.ldb) — это одна из самых ранних таблиц SSTable, созданных при первоначальной инициализации MetaMask. Она часто содержит исходные данные хранилища, записанные при создании кошелька.

Извлечение данных хранилища из .ldb файлы в Chromium обычно не представляет сложности. Откройте файл в текстовом редакторе (Sublime Text, VS Code, даже Notepad++) и найдите строку vault. Вы найдете зашифрованный JSON-блок, встроенный в структуру записи LevelDB. Скопируйте всё из {"data":" до закрытия "} – это твой сейф.

На Mac или Linux поможет следующая однострочная команда:

LC_ALL="C" egrep -roa 'vault":"(.*?\\"})' ~/Library/Application\ Support/Google/Chrome/Default/Local\ Extension\ Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/ | sed -E 's/.*({.*}).*/\1/g' | head -1

На что стоит обратить внимание: .ldb файлы могут использовать Быстрое сжатие в блоках данных. Если поиск по строке не даёт результатов и вы видите блоки двоичного мусора, возможно, нужный вам блок данных сжат с помощью Snappy. .log файл, напротив, всегда находится в несжатом виде — это исходные данные в формате «ключ-значение», организованные в блоки по 32 КБ. Если .ldb подход не срабатывает, всегда проверяйте .log файл. В официальной документации MetaMask об этом говорится: «Если вам не удается восстановить хранилище с помощью файла .ldb, проверьте, есть ли файл .log».

Одно из свойств LevelDB, которое чрезвычайно полезно при восстановлении: это только для добавления. Операции обновления и удаления не изменяют существующие записи — они добавляют новые записи с более высокими порядковыми номерами. Старые записи сохраняются до тех пор, пока их не удалит процесс уплотнения. Это означает, что если кто-то импортировал новый SRP поверх старого, старые данные хранилища могут по-прежнему существовать в более старой версии .ldb файл, который ещё не был сжат. Я не раз восстанавливал таким образом «перезаписанные» кошельки.

Для программного извлечения btcrecover проект включает в себя extract-metamask-vaults.py, которая корректно считывает базу данных LevelDB и извлекает все записи хранилища — включая потенциально старые, скрытые в некомпактированных файлах. cyclone-github/metamask_extractor Этот инструмент выполняет те же функции и может выводить результаты непосредственно в формат, совместимый с hashcat.

Когда файлы хранилища повреждаются

Повреждение хранилища обычно вызвано одной из следующих причин: сбой браузера во время операции записи (отключение питания, паника ядра, принудительное завершение работы), прерванное обновление MetaMask, в ходе которого происходит перезапись хранилища, фактические ошибки диска (поврежденные секторы, износ SSD) или — что встречается все чаще — помещение антивирусным ПО файлов JavaScript MetaMask в карантин, что может привести к несогласованному состоянию базы данных LevelDB, даже если сами данные хранилища остаются неповрежденными.

Вы поймете, что хранилище повреждено, если файл JSON не проходит синтаксический анализ. Отсутствующие фигурные скобки, усеченные строки в кодировке base64, нулевые байты, вставленные в середину поля данных. Программа MetaMask Vault Decryptor выдаст сообщение «Проблема с декодированием хранилища» или просто завершит работу без каких-либо уведомлений.

Восстановление зависит от типа и степени повреждения. Если структура JSON повреждена, но зашифрованные данные в основном сохранились, то зачастую можно восстановить свод вручную. Формат строго регламентирован — необходимо точно data, iv, и salt поля (плюс keyMetadata (для более новых хранилищ). Удалите нулевые байты и управляющие символы. Убедитесь, что data, iv, и salt значения являются действительными кодами Base64. Если data поле обрезано, и тогда у вас возникнут проблемы — AES-GCM требует полного текста шифрования а также его тег аутентификации (последние 16 байт data (поле) для расшифровки. Отсутствие всего одного байта приводит к сбою всего процесса.

Для частично поврежденных баз данных LevelDB, в которых .ldb если сами файлы повреждены, попробуйте прочитать .log Вместо этого попробуйте использовать файл — он имеет более простой формат (последовательные блоки размером 32 КБ с 7-байтовыми заголовками) и может содержать более свежую копию хранилища, уцелевшую после сбоя. Если ни один из подходов не сработает, иногда можно использовать библиотеки Python для анализа LevelDB (CCL Solutions Group выпустила реализации на чистом Python для анализа LevelDB, декомпрессии Snappy и десериализации V8), чтобы аккуратно извлечь записи из поврежденных файлов базы данных, пропуская поврежденные блоки.

В одном каталоге LevelDB может сосуществовать несколько SRP. Если пользователь импортировал новую начальную фразу, старая запись хранилища может сохраниться в отдельном .ldb файле или даже в том же файле с другим смещением. Всегда ищите все экземпляры всех вариантов узора, а не только первого.

Проблема с перезаписанными файлами и как с ней бороться

Именно этот сценарий вызывает наибольшее огорчение. Кто-то удаляет MetaMask — возможно, в попытке устранить неполадку, возможно, «очищая» браузер, а может, просто не осознавая, что делает. В браузерах на базе Chromium удаление расширения удаляет всю папку с данными расширения, включая все .ldb, .log, а также файлы манифеста. В Firefox moz-extension+++<UUID> папка удаляется, и поскольку при каждой переустановке генерируется новый UUID, новая установка не затронет старое расположение (но старое расположение уже не существует).

В официальной документации MetaMask об этом сказано прямо: «Данные браузерного расширения удаляются при его удалении. Как правило, это означает, что данные вашего хранилища будут утеряны».

Слово «как правило» здесь играет важную роль. Данные удаляются в логическом смысле — файловая система помечает эти сектора как свободные — но сами байты не обнуляются сразу. На традиционном жестком диске данные сохраняются до тех пор, пока эти сектора не будут записаны новыми файлами. На SSD-накопителе команды TRIM могут сделать удаленные данные невозможными для восстановления в течение нескольких минут, а иногда и секунд.

Первое правило восстановления перезаписанного хранилища: немедленно прекратите пользоваться компьютером. Любой новый файл, записанный на диск, может перезаписать секторы, в которых ранее находилось ваше хранилище. Если возможно, извлеките диск и подключите его в режиме «только для чтения» на другом компьютере.

Средства восстановления для данной ситуации, в порядке приоритета:

  • Наше специализированное программное обеспечение (кроссплатформенное) для восстановления логически удаленных файлов
  • extundelete или ext4magic для файловых систем ext3/ext4 в Linux
  • Поиск по необработанным дискам в крайнем случае: grep -rboa "vault" /dev/sdX просканировать необработанный дисковый объект на наличие строк хранилища
  • Наши инструменты, изготовленные на заказ для восстановления файлов при потере метаданных файловой системы — настройте его на поиск {"data":" шаблоны

Мне удавалось восстанавливать хранилища с жестких дисков, с которых MetaMask был удален несколько недель назад. На SSD-накопителях вероятность успеха резко снижается уже через несколько часов непрерывной работы. Переустановка MetaMask — это худшее, что вы можете сделать, поскольку при этом в том же каталоге создается новая база данных LevelDB, которая может перезаписать старые секторы.

Здесь у Firefox есть одно преимущество. Поскольку каждой установке присваивается новый UUID, при переустановке файлы создаются в новом каталоге. Старый moz-extension+++<OLD-UUID> данные, даже если папка была удалена, не будут перезаписаны файлами новой установки. Кроме того, существует два скрытых параметра Firefox — extensions.webextensions.keepUuidOnUninstall и extensions.webextensions.keepStorageOnUninstall – что, если установить true в about:config Перед удалением следует запретить браузеру очищать хранилище расширений. Но никто не устанавливает эти настройки заранее.

MetaMask на мобильных устройствах — это совсем другое дело

Мобильное приложение MetaMask создано на базе React Native и хранит данные совершенно иначе, чем браузерное расширение. Зашифрованное хранилище проходит @react-native-async-storage/async-storage, в котором используются бэкэнды, специфичные для конкретной платформы.

На Android, AsyncStorage обычно записывает данные в База данных SQLite в /data/data/io.metamask/databases/RKStorage. Для чтения файлов по этому пути требуется права администратора. Шифрование хранилища использует тот же подход с ключом, сгенерированным с помощью алгоритма PBKDF2, однако имеет ряд существенных отличий от настольного расширения: мобильное приложение традиционно использует только 5 000 итераций алгоритма PBKDF2 и шифрует с помощью AES-CBC вместо AES-GCM. Это означает, что мобильные хранилища не являются взаимозаменяемыми с настольными хранилищами, даже если пароль одинаков.

В iOS, данные хранятся в песочнице приложения в папке <AppSandbox>/Documents/. Для восстановления резервной копии iCloud нужен следующий путь: Apps → MetaMask → Documents → persistStore → persist-root – для просмотра резервной копии iOS на Mac вам понадобится такая утилита, как iMazing. Работа этого метода зависит от того, была ли у пользователя включена резервная копия в iCloud во время работы MetaMask; кроме того, по имеющимся данным, изменения со стороны Apple периодически приводят к сбоям в работе этого метода.

В мобильном приложении MetaMask также реализована SecureKeychain модуль (построенный на основе react-native-keychain), который хранит пароль кошелька пользователя в Keychain (iOS) или Keystore (Android) для биометрической разблокировки. Аудит безопасности показал, что SecureKeychain добавляет дополнительный уровень шифрования с использованием соли «foxCode», которая, как выяснилось, представляет собой жестко запрограммированную строку "encrypt". Команда MetaMask признала, что речь идет о многоуровневой защите, а не о секретной информации, критически важной для безопасности.

Основная проблема при восстановлении данных с мобильных устройств заключается в том, что ручное извлечение из хранилища невозможно эквивалентно поиску .ldb файлы на рабочем столе. Вы не сможете подключиться к своему iPhone по SSH и найти в тексте строки из хранилища с помощью grep. Начиная с MetaMask для мобильных устройств v6.3.0Кроме того, приложение оснащено функцией автоматического восстановления хранилища, которая запускается при обнаружении повреждений данных. Однако в случае удаления приложения локальные данные хранилища будут утеряны, если у вас нет резервной копии устройства. Механизмы резервного копирования Android не всегда позволяют сохранить все внутренние данные приложения. Официальная позиция MetaMask рекомендуется перенести данные в новое хранилище SRP, а не полагаться на функцию восстановления из хранилища Android.

Изменение в алгоритме итераций PBKDF2, которое вывело из строя все инструменты для восстановления

На протяжении многих лет MetaMask использовал 10 000 итераций алгоритма PBKDF2 – жестко заданное значение по умолчанию в browser-passworder библиотека. Каждый инструмент для восстановления данных, каждый модуль Hashcat, каждый скрипт для перебора были настроены на 10 000 итераций. Затем, в конце 2023 — начале 2024 года, всё изменилось.

Этот @metamask/browser-passworder В версии библиотеки 4.2.0 (выпущенной 13 ноября 2023 года) была добавлена поддержка настраиваемых параметров вывода ключей. Новое значение по умолчанию в библиотеке теперь составляет 900 000 итераций, но расширение MetaMask настроило его на использование 600 000 итераций – в соответствии с рекомендацией OWASP на 2023 год по использованию алгоритма PBKDF2-HMAC-SHA256. В расширении MetaMask v11.16.11 (подтверждено в выпуске Hashcat за июнь 2024 года), создавались новые хранилища с 600 000 итераций, а новый keyMetadata поле.

Это означает 60-кратное увеличение вычислительных затрат на каждую попытку подбора пароля. Брутфорс, который раньше занимал один день при 10 000 итераций, теперь занимает два месяца при 600 000 итераций на том же оборудовании. Сообществу hashcat пришлось разработать специальные ядра — режим 26620, предоставленный пользователем cyclone — для работы с новым форматом. В стандартном режиме 26600 было жестко запрограммировано 10 000 итераций.

Важно отметить, что старые хранилища НЕ шифруются автоматически. Если вы создали свой кошелек в 2021 году, ваш хранилище по-прежнему использует 10 000 итераций, если только MetaMask явно не запустил повторное шифрование ( updateVault Для этой цели существует соответствующая функция, но пока неясно, насколько активно MetaMask ее вызывает при разблокировке). Определить, с какой версией вы имеете дело, можно по наличию или отсутствию keyMetadata поле. Нет keyMetadata? Это 10 000 итераций. Есть keyMetadata с "iterations": 600000? Это новый формат.

Ниже приведена полная хронология версий библиотеки шифрования, имеющих значение для восстановления:

  • browser-passworder версии 1.x–2.x (до 2022 года): 10 000 итераций, жестко заданное значение. Опубликовано без @metamask область применения.
  • v3.0.0 (август 2022 г.): Переименовано в @metamask/browser-passworder. Изменения в итерации нет.
  • v4.2.0 (ноябрь 2023 г.): Добавлено keyMetadata поддержка. По умолчанию количество итераций шифрования изменено на 900 000. keyFromPassword обратно совместим на уровне 10 000.
  • v4.3.0 (ноябрь 2023 г.): Добавлено isVaultUpdated проверить, соответствует ли хранилище заданным параметрам.
  • Версия 5.0.0 (апрель 2024 г.): Требуется Node.js версии 16 или выше. Изменений в криптографии нет.
  • Версия 6.0.0 (декабрь 2024 г.): Требуется Node.js версии 18.18 или выше. Изменений в криптографии нет.

Для специалистов по восстановлению данных: всегда сначала проверяйте формат хранилища. От этого зависит весь ваш подход.

Политика MetaMask в отношении паролей и её значение для атак методом перебора

MetaMask требует, чтобы длина пароля составляла не менее 8 символов. И всё. Никаких требований к заглавным буквам, цифрам или специальным символам. Расширение отображает визуальный индикатор надежности («Слабый» / «Хороший»), но не блокирует слабые пароли, которые соответствуют минимальной длине. Максимальной длины также нет — поддерживаются символы Unicode. Эта политика действует по крайней мере с начала 2018 года (упоминается в задаче GitHub № 3515).

На ряде сторонних сайтов ошибочно утверждается, что для создания пароля в MetaMask необходимо использовать заглавные и строчные буквы, цифры и специальные символы. Это неверно. Единственное обязательное требование — длина пароля должна составлять 8 символов.

Для взлома методом перебора это имеет огромное значение. Пароль из 8 символов, состоящий исключительно из строчных букв, имеет пространство ключей, насчитывающее примерно 208 миллиардов комбинаций (26⁸). При взломе старого хранилища с 10 000 итераций hashcat на современном графическом процессоре может проверять тысячи хэшей в секунду, что позволяет взломать его за несколько дней. При взломе хранилища с 600 000 итераций время увеличивается в 60 раз. А надежный пароль длиной 12 и более символов, содержащий заглавные и строчные буквы, а также символы? С помощью современного оборудования его практически невозможно взломать ни одним из этих методов.

Наиболее предпочтительным практическим инструментом для восстановления является btcrecover – Сама компания MetaMask рекомендует эту функцию пользователям, которые примерно помнят свой пароль. Она поддерживает подбор паролей на основе токенов и шаблонов, позволяя вам задать шаблон, например: "my" + [dog|cat|bird] + [2019|2020|2021] + ["!"|"@"|"#"] и эффективно проверять все возможные комбинации. В случае атак с ускорением на GPU режим hashcat 26600 предназначен для старых хранилищ, режим 26610 — для мобильных хранилищ, а режим 26620 (или перекомпилированный режим 26600 с обновленным количеством итераций) — для нового формата с 600 000 итераций.

Пути отмывания денег и эпидемия «пропавших средств»

Именно в пути прохождения средств зачастую кроются причины большинства проблем, связанных с исчезновением средств. MetaMask использует стандартный путь BIP-44 для Ethereum: m/44'/60'/0'/0. Счета вычисляются путем увеличения конечного индекса: m/44'/60'/0'/0/0 (первый отчет), m/44'/60'/0'/0/1 (во-вторых), m/44'/60'/0'/0/2 (третий) и так далее. Этот способ подходит для всех цепочек, совместимых с EVM — один и тот же адрес в Ethereum, Polygon, Arbitrum и BSC.

Проблема в том, что не все используют один и тот же путь. Ledger Live использует m/44'/60'/x'/0/0, увеличивая account поле вместо address_index. Наследие Леджера (старый путь MEW/MyCrypto) использует m/44'/60'/0'/x – всего четыре уровня вместо пяти. Первый адрес (m/44'/60'/0'/0/0) одинаков в MetaMask, Ledger Live и Trezor. Но второй и последующие счета полностью расходятся, поскольку каждый кошелек увеличивает значение другого компонента пути.

В результате возникает весьма характерная ситуация: пользователь восстанавливает сед-фразу Ledger в MetaMask, видит свой первый аккаунт и его баланс, затем добавляет второй аккаунт и видит… ноль. Средства никуда не пропали. Они находятся на адресе, полученном из m/44'/60'/1'/0/0 (в стиле Ledger Live), но MetaMask рассматривает m/44'/60'/0'/0/1. Совершенно разные ключи, совершенно разные адреса.

Путь вывода ключей Ethereum по умолчанию в Trezor соответствует настройкам MetaMask: m/44'/60'/0'/0/x. Таким образом, восстановление с Trezor в MetaMask, как правило, работает для всех учетных записей. Проблемы с переносом между кошельками возникают в основном при переносе между Ledger и MetaMask, а также между Ledger и Trezor.

Чтобы найти средства, находящиеся на «неправильном» пути отслеживания, у вас есть следующие варианты:

  • Напишите нам по адресу contact@cryptorecovery.io, и мы постараемся вам помочь.
  • MyEtherWallet (MEW): Поддерживает настраиваемые пути прослеживания через функцию «Добавить путь». Введите вручную m/44'/60'/1'/0/0, m/44'/60'/2'/0/0и т. д. для проверки адресов в формате Ledger Live.
  • MyCrypto: поддержка аналогичных настраиваемых путей вывода.
  • Инструмент BIP-39 от Иэна Коулмана (работает в автономном режиме): введите мнемоническую фразу, выберите ETH, переключайтесь между вкладками BIP-44 и вручную настройте компоненты пути.
  • btcrecover: позволяет автоматизировать тестирование для различных схем путей вывода.

Одно досадное ограничение: интеграция MetaMask с Trezor не поддерживает пользовательские пути вывода. Опция пользовательского пути деривации была добавлена для Ledger (PR #9367), но, согласно последней информации, аналогичная функция для Trezor (GitHub issue #11197) пока не реализована. Если вы пытаетесь получить доступ к аккаунтам, созданным с помощью Ledger, через MetaMask + Trezor, вам нужно будет использовать MEW или MyCrypto.

MetaMask и Trezor: брак, полный проблем

Интеграция MetaMask и Trezor осуществляется посредством Trezor Bridge – локально установленный фоновый процесс (trezord), который прослушивает http://127.0.0.1:21325/ и устраняет разрыв между изолированной средой браузера и доступом к USB-оборудованию. Проверить, запущен ли он, можно, нажав http://127.0.0.1:21325/status/.

Наиболее распространённая причина сбоя на первый взгляд кажется очень простой: приложение Trezor Suite остаётся запущенным. Trezor Suite блокирует USB-соединение с устройством, препятствуя обмену данными с MetaMask. Необходимо полностью закрыть приложение Suite — не просто свернуть его, а закрыть через панель задач. По моим оценкам, именно на эту причину приходится около 40 % обращений с проблемой «MetaMask не может найти мой Trezor», с которыми я сталкивался.

Другие распространенные проблемы и способы их устранения:

«Поиск вашего Trezor…» — крутится бесконечно – Убедитесь, что Bridge установлен и trezord работает. Попробуйте использовать другой USB-кабель и другой порт. Отключите VPN, брандмауэр и расширения браузера (блокировщики рекламы и расширения для защиты конфиденциальности часто создают помехи). Режим инкогнито позволяет исключить конфликты между расширениями.

«Идет подключение к устройству» — другое приложение или вкладка браузера уже взаимодействует с Trezor. Закройте все остальные вкладки и приложения, которые могут обращаться к устройству.

Ограничения WebUSB — Firefox вообще не поддерживает WebUSB, а это значит, что подключение Trezor в Firefox полностью зависит от Bridge. Chrome, Brave и Edge работают через реализацию WebUSB/WebHID на базе Chromium.

Предупреждение о пути деривации в Trezor Safe 5 — Пользователи сообщают, что во время проверки транзакции на экране Trezor появляется сообщение «Неверный путь деривации для выбранного счета. m/44’/60’/0’/0». Как правило, это предупреждение можно смело игнорировать — кошелек работает корректно, несмотря на появление этого сообщения. Это чисто косметическая проблема, связанная с тем, как прошивка Trezor проверяет пути, не соответствующие стандартному формату.

В 2025 году компания Trezor приступила к интеграции функционала Bridge непосредственно в Trezor Suite. Этот переход вызвал целую волну проблем с подключением, поскольку некоторым пользователям требовалось, чтобы Trezor Suite работала в фоновом режиме для подключения к MetaMask, в то время как другим нужно было полностью закрыть приложение. Проверьте настройки в Trezor Suite → «Настройки» → «Приложение» → «Trezor Connect».

Когда MetaMask подключается к Trezor, создаваемые учетные записи принципиально отличаются от учетных записей программного кошелька MetaMask. Учетные записи, созданные с помощью Trezor, хранят в хранилище только открытые ключи и пути вывода — закрытые ключи остаются на аппаратном устройстве. MetaMask может отображать балансы (только для чтения через открытые ключи) без подключения Trezor, но не может подписывать транзакции без физического устройства. Если при создании учетных записей Trezor использовался пароль, необходимо ввести точно такой же пароль, чтобы восстановить те же адреса.

Методы восстановления, которые действительно работают на практике

После сотен случаев восстановления данных вот с какими ситуациями я сталкиваюсь чаще всего и как я с ними справляюсь.

Вариант 1: Пароль есть, сед-фраза утеряна, расширение по-прежнему установлено

Это самое простое. Откройте страницу фонового режима MetaMask через chrome://extensions → Режим разработчика → нажмите «service worker» (MV3) или «background page» (MV2). В консоли:

chrome.storage.local.get('data', result => {
    console.log(result.data.KeyringController.vault);
});

Скопируйте JSON-файл хранилища и вставьте его в Дешифратор хранилища MetaMask (metamask.github.io/vault-decryptor), введите свой пароль, и программа выведет вашу мнемоническую фразу и все импортированные закрытые ключи. Программа Vault Decryptor была разработана Дэном Финлеем, соучредителем MetaMask — она также поддерживает .ldb файлы напрямую посредством загрузки.

Вариант 2: Пароль известен, расширение удалено, но данные, возможно, остались на диске

Перейдите в каталог данных расширения. Если папка по-прежнему существует (иногда при удалении не удаётся полностью очистить каталог, либо пользователь лишь отключил, а не удалил расширение), скопируйте файл .ldb и .log файлы. Извлеките хранилище с помощью grep, текстового редактора или btcrecover’s extract-metamask-vaults.py. Расшифруйте с помощью программы Vault Decryptor.

Если папка пропала, напишите нам по адресу contact@cryptorecovery.io, и мы поможем провести экспертизу диска.

Вы также можете подключить диск в режиме «только для чтения» и выполнять поиск по шаблонам строк хранилища на необработанных данных диска. В Linux: grep -rboa '{"data":"' /dev/sdX. Успех во многом зависит от того, насколько интенсивной была активность диска после удаления, а также от того, является ли диск SSD или HDD.

Вариант 3: Забыли пароль, но у вас есть файл хранилища

Это сценарий перебора всех возможных вариантов. Извлеките файл хранилища и преобразуйте его в формат hashcat с помощью metamask2hashcat.py или cyclone-github/metamask_extractor. Затем запустите hashcat (режим 26600 для старых хранилищ, 26620 для новых) или btcrecover с файлом-подсказкой, в котором описано то, что вы помните о пароле. Если вы знаете, что ваш пароль выглядел примерно так: «myDog» плюс год плюс символ, btcrecover сможет эффективно проверить эти комбинации.

Сценарий 4: Восстановление Firefox

Найдите UUID MetaMask по адресу about:debugging. Перейдите в каталог хранения. Распакуйте бинарные файлы IndexedDB с помощью snappy-fox:

./snappy-fox input_file.snappy output.txt

Найдите в распакованном файле JSON-файл хранилища. Затем запустите программу Vault Decryptor. JesseBusman/FirefoxMetamaskWalletSeedRecovery Скрипт на Python автоматизирует весь этот процесс: он сканирует профиль Firefox, находит данные хранилища и выводит их в формате JSON, готовые к расшифровке.

Сценарий 5: После импорта стартового капитала средства оказываются отсутствующими

Проверьте пути деривации. При импорте седа Ledger в MetaMask начиная со второго аккаунта будут отображаться другие адреса и нулевые остатки. Воспользуйтесь MEW или MyCrypto с настраиваемыми путями деривации, чтобы найти средства в Ledger Live (m/44'/60'/x'/0/0) или Ledger Legacy (m/44'/60'/0'/x) путей. Если использовался пароль Trezor, убедитесь, что вы вводите именно тот же пароль — другой пароль генерирует совершенно другой набор адресов на основе того же седа.

Инструменты для криминалистической экспертизы, которые стоит иметь в своем арсенале

  • Дешифратор хранилища MetaMask – официальная версия, может работать в автономном режиме, поддерживает прямую связь .ldb загрузка файла
  • btcrecover — восстановление пароля с помощью сопоставления шаблонов, рекомендовано MetaMask
  • hashcat — перебор паролей с ускорением на GPU (режимы 26600, 26610, 26620)
  • snappy-fox — быстрая распаковка файлов в Firefox
  • Инструменты CCL Solutions Group для Python — разбор LevelDB на чистом Python, распаковка Snappy, десериализация V8

Вывод: чем отличаются успешные восстановления от неудачных

Разница между тем, чтобы вернуть кошелек, и тем, чтобы потерять его навсегда, почти всегда зависит от того, что произошло в первые минуты после обнаружения проблемы. Самым пагубным действием является переустановка MetaMask в том же профиле браузера — это приводит к перезаписи каталога LevelDB новыми файлами. Вторым по степени вреда является продолжение обычной работы на компьютере с SSD-накопителем после удаления хранилища, что запускает функцию TRIM и делает невозможным восстановление данных на уровне секторов.

Если вы запомните из этого руководства три вещи: сделайте резервную копию своей семенной фразы на бумаге, помните, что ваш хранилище находится в конкретной папке, которую можно скопировать и сохранить, и если что-то пойдет не так, немедленно прекратите пользоваться этим компьютером, прежде чем пытаться восстановить данные. Шифрование надежное — AES-256-GCM с 600 000 итераций PBKDF2 не поддается брутфорсу, если только пароль не слабый, — но сами данные на удивление уязвимы. Это всего лишь несколько килобайт в базе данных LevelDB, и они могут исчезнуть одним щелчком мыши при очистке браузера.

У всех кошельков, которые мне не удалось восстановить, была одна и та же основная причина: пользователь продолжал пользоваться устройством после потери данных. Все кошельки, которые мне удалось восстановить, содержали данные, сохранившиеся на диске — иногда в самых неожиданных местах, иногда в нескольких копиях благодаря архитектуре LevelDB, допускающей только добавление данных, но всегда благодаря тому, что кто-то остановился и подумал, прежде чем действовать.

Если вам нужна помощь с восстановлением кошелька MetaMask, свяжитесь с нами по электронной почте: contact@cryptorecovery.io для получения профессиональной бесплатной консультации или посетите нашу страницу контактов