История самой скучной кражи на 400 BTC. Расследование

Хронология
блок 900057
Кошелёк впервые платит новому контрагенту. 0.0001 BTC на bc1qkyehy7neysvtxgyeuswwt7nhjj4vfxlg8ghaax. Пробный платёж. До этой минуты адрес не получал ничего и ни от кого: это первая транзакция в его истории.
блок 900 058
Через один блок, около десяти минут спустя, в цепочке впервые появляется адрес bc1qkyexw86sa3h8dgpd68c6r6yyge9s5lxwsghaax. Его создают переводом на 711 сатоши. От настоящего он отличается только серединой.
блок 900 076
400 BTC уходят на этот адрес. Тремя часами позже пробного платежа.
блок 900 090
Кошелёк отправляет настоящему контрагенту ещё 0.01 BTC. Обычный рабочий платёж. Никто ничего не заметил.
блок 900 095
Двойник отправляет жертве 600 сатоши обратно.
блок 900 111 - 900 114
400 BTC уходят с двойника дальше, на один адрес, двумя переводами.
блок 900940 - 902953
Деньги разбиты на три части и заведены в четыре разные транзакции Wasabi 2.0.
блок 954252 (последний блок на момент написания статьи)
Настоящий адрес продолжает работать. К этому моменту он принял 88 платежей. Отношения с контрагентом шли своим чередом ещё пятьдесят тысяч блоков.
Я нашёл эту транзакцию через год и месяц после того, как она попала в блок, и
только потому, что запустил поиск адресов-двойников по всей истории биткойна.
До этого она лежала в цепочке на виду у всех.
Адрес
Настоящий получатель: bc1qkyehy7neysvtxgyeuswwt7nhjj4vfxlg8ghaax
Тот, на который ушли деньги: bc1qkyexw86sa3h8dgpd68c6r6yyge9s5lxwsghaax
Совпадают первые шесть символов и последние пять. Ровно та часть строки, которую человек проверяет глазами: начало и хвост. Всё несовпадающее лежит в середине, где сверять неудобно и где взгляд не задерживается. Такой адрес не находится случайно, его подбирают перебором на видеокартах, пока не совпадут нужные символы. Это стоит электричества и времени, но на фоне четырёхсот биткойнов это не расход, а накладные.
Один блок
Из всей хронологии меня больше всего занимает промежуток между 900 057 и 900058. Настоящий адрес контрагента был новым. Не «редко используемым», а буквально пустым: платёж жертвы в блоке 900 057 это первая транзакция в его истории. И уже в следующем блоке, примерно через десять минут, в цепочке появляется его двойник, которого создают переводом на 711 сатоши с адреса bc1q8y7nw06uh5vyyxqu0avjlhpe8haxhmq9sf2lk9. Десять минут это не время на подбор адреса. Подбор идёт заранее и долго. Значит, к моменту первого платежа готовая заготовка уже лежала, и десять минут ушли только на то, чтобы её достать и профинансировать. А чтобы заготовка подошла, знать надо было не сумму и не жертву, а сам адрес контрагента, причём до того, как по нему прошла первая транзакция в сети. Что из этого следует, я утверждать не берусь: в цепочке видно событие, а не его причина. Но круг мест, где адрес существует до своей первой транзакции, узок. Это переписка, счёт, договорённость о реквизитах и оба конца этой переписки.
Адрес, с которого профинансировали двойника, тоже не выглядит одноразовым: у него сотни входящих и исходящих операций в блоках 899584–900310, то есть инфраструктура работала до и продолжила работать после.
Проверка, которая ничего не спасла
Владелец кошелька всё сделал по учебнику. Сначала пробный платёж на копейку, через три часа основная сумма.
Сдача от этого проверочного платежа, 399.99998789 BTC, и стала одним из двух входов транзакции с кражей. Проверка и ошибка соединены одной монетой. Помогла проверка ни в чём, потому что проверялось направление, а не строка. В первый раз адрес попал в поле ввода одним способом, во второй раз другим. Где именно произошла подмена, в цепочке не видно, и это важно: классической наживки, когда двойник заранее присылает жертве пыль, чтобы попасть ей в историю кошелька, здесь нет. До кражи двойник жертве не отправлял ничего. Значит подмена случилась вне блокчейна, там, где я её не увижу. Через четырнадцать блоков после ухода четырёхсот биткойнов кошелёк отправил настоящему контрагенту ещё 0.01 BTC. Никто ничего не заметил.
Что было дальше Дальше единственная часть этой истории, которая выглядит как работа, и та сделана по шаблону.
900 076 | 400 BTC → двойник bc1qkyexw86…ghaax
900 111 | 100 BTC → 1FAmRPq5VoKDcHugJnZgKufo8Np3×6yEEj
900 114 | 299.9998 BTC → туда же
900 940 | 99.9999 BTC → bc1qwgtxd3r2… → tx fc620cb6, Wasabi 2.0, 388 входов / 480 выходов 901 622 | 149.99975 BTC → bc1qtc6pnt9… → tx 11f3d4f7, Wasabi 2.0, 275 входов / 361 выход 902 485 | 149.99995 BTC → bc1q833066… → tx 0f8efe39, Wasabi 2.0, 224 входа / 255 выходов 902 953 | остаток → bc1p3nc6xzf… → tx 8897914f, Wasabi 2.0, 302 входа / 362 выхода `
Собрали на один адрес, разбили на три части, за две недели завели в четыре разные транзакции. Ни одной биржи, ни одного обменника, ни одной попытки быстро продать. След в биткойне на этом заканчивается.
Все четыре оказались Wasabi 2.0, и это не догадка по форме, а результат классификации всей цепи: у Wasabi 2.0 номиналы выходов берутся из фиксированного набора (степени двойки, степени тройки и производные), и по этому набору транзакция опознаётся однозначно.
Дата тоже сходится: Wasabi 2.0 запущен в июне 2022 года, а форма его раундов в цепочке появляется ровно с блока 741213. Двойник за всё своё существование получил три платежа и сделал три перевода. Настоящий адрес к моменту кражи был пуст, а к блоку 954 252 принял 88 платежей.
Разница между свежей ловушкой и живым рабочим адресом видна невооружённым глазом, если знать, куда смотреть, и совершенно незаметна в момент, когда ты копируешь строку.
Куда делись четыреста биткойнов, с точностью до сатоши
Я прогнал трассировку потока денег с помощью сервиса, который сам же и написал с помощью ИИ
https://publicaml.org/trace/?address=bc1qkyexw86sa3h8dgpd68c6r6yyge9s5lxwsghaax&chain=btc

тут можно увидеть все денежные пути и где они обрываются, к пример миксер или биржа

Что это за кошелёк
Типичный кошелек платит одним адресом и на него же получает сдачу, но вопрос, который стоит задать отдельно: как устроен кошелёк, который платит
двумя разными адресами, а сдачу отправляет на третий, ни с одним из них внешне
не связанный.
входы 34VnjREg3FbNwysFNqtEK1cMi7NEH9feXt 399.99998789 BTC
3JHNzjjvm7LrMcmKPdvtJibQ2VQeqFk1ET 100.00000000 BTC
выходы bc1qkyexw86sa3h8dgpd68c6r6yyge9s5lxwsghaax 400.00000000 BTC
3Jfjj5KQYQTJNbfJ78y7Jid2sjMBeCyuty 99.99997579 BTC
Четыре адреса, все разные, и ни один из входов не получает сдачу обратно. Со
стороны это выглядит как перевод четырём посторонним. На деле три из четырёх
принадлежат одному владельцу, и цепочка это доказывает.
Первый вход это сдача от проверочного платежа. Адрес 34VnjREg… родился в
блоке 900057, той самой транзакцией, где жертва отправила контрагенту 0.0001 BTC
на пробу, и был потрачен в блоке 900076, в транзакции кражи. Одно поступление,
одна трата, девятнадцать блоков жизни. Классический одноразовый адрес сдачи.
Второй вход, наоборот, живёт долго и переиспользуется. 3JHNzjjv… активен с
блока 893411 по 958055, через него прошли тысячи биткойнов десятками операций.
Это не свежий адрес из дерева ключей, а рабочая лошадь кошелька.
Сдача ушла на свежий адрес, и через 724 блока он сам себя выдал. В блоке
900800 адрес сдачи 3Jfjj5KQ… тратится в одной транзакции вместе с 3JHNzjjv…,
вторым входом кражи, и ещё с одной монетой на 600 BTC:
блок 900800
входы 3JHNzjjvm7LrMcmKPdvtJibQ2VQeqFk1ET 0.00009467
3Jfjj5KQYQTJNbfJ78y7Jid2sjMBeCyuty 99.99997579
39W4gK1HWiYhDt3XmN7mRyUUiG2VtaBFJv 600.00008290
выходы bc1qjt0p0lf54jqh2jklqfct46567kw2gvv4s8w94s 200.0
3EDYzMVQouJ8k8AeKh8cmRmpjNuLDDR9aU 500.00013614
Подписать одну транзакцию несколькими входами может только тот, у кого есть
ключи ко всем этим входам. Это старейшая эвристика в анализе биткойна, и здесь
она срабатывает в чистом виде: сдача не уходила «налево», она ушла на свежий
адрес того же кошелька, а кошелёк сам это подтвердил, потратив её вместе со
своим же вторым входом.
Почему входов вообще было два, тоже видно из чисел. Заплатить надо было ровно
400.00000000, а самая крупная монета кошелька стоила 399.99998789, то есть не
хватало 1211 сатоши. Пришлось добрать вторую монету на 100 BTC, и почти вся она
вернулась сдачей. Круглая сумма платежа стоила кошельку лишнего входа: заплати
он 399.99, второй вход не понадобился бы, и транзакция выглядела бы иначе.
Складывая всё вместе, получается портрет: P2SH-обёрнутый одноключевой SegWit,
сотни биткойнов в одной транзакции, один долгоживущий переиспользуемый адрес
рядом с одноразовыми адресами сдачи, обороты в тысячи BTC за два месяца. Так
выглядит не личный кошелёк, а операционный: биржевой, брокерский или казначейский.
Есть ли способы отследить денежный поток через миксер
Вероятностный анализ CoinJoin - это когда невозможно точно установить, какой input соответствует какому output, поэтому строят несколько возможных связей и оценивают их вероятность на основе дополнительных признаков: времени, сумм, поведения адресов до/после CoinJoin, повторных CoinJoin и внешних данных (биржи, KYC и т. д.). Например, вместо «A → X точно» получают «A → X с вероятностью 80%».
Это отдельная задача для AML сервисов и вторая часть моей статьи этого расследования, которую я также пытаюсь решить на publicaml.org
Главная ценность таких расследований
Ценность состоит в том, что, используя четкие доказательства денежных потоков, можно добиться заморозки украденных средств, а также восстановить цепочку движения активов, связать их с конкретными субъектами и предоставить правоохранительным органам или биржам обоснованные доказательства происхождения средств.
Ниже реальные кейсы возврата украденых средств
Sony — $154M / 3,879 BTC | FBI проследило украденные у Sony $154 млн, конвертированные в Bitcoin, до конкретного cold wallet. Средства были изъяты, после чего DOJ начал процедуру их возврата Sony. | Очень наглядный пример: украли → blockchain tracing → нашли конкретный wallet → seizure → возврат. |
Crypto investment fraud — $225.3M | FBI и Secret Service использовали blockchain analysis + другие методы расследования, чтобы связать более $225 млн криптовалюты с мошенничеством и отмыванием средств. | Один из крупнейших кейсов: огромный multi-hop laundering network, сотни тысяч транзакций. |
$1.97M — возврат жертве | Следователи проследили деньги жертвы investment scam через серию криптотранзакций, изъяли средства из трёх кошельков, после чего суд постановил их конфисковать для возврата жертве. | Хороший пример именно «tracing → seizure → деньги возвращаются конкретной жертве». |