Евгений Борисов – Ошибка 404: Слепая зона (страница 5)
Он углублялся всё дальше, продираясь сквозь дебри системных журналов. Его пальцы летали по клавиатуре, открывая и закрывая окна терминала. Внутренний азарт аудитора начал вытеснять усталость. Он видел структуру. Он видел почерк.
– Они не просто взломали твой пароль, Лена. Это было бы слишком примитивно для суммы в полмиллиарда. Они создали «призрачную запись».
– Что это значит? – Лена подалась вперед, вглядываясь в непонятные ей строки кода.
– Посмотри на этот кусок скрипта в ядре финансового модуля. if (transaction_sum> 1000000) {exec root_bypass.sh}. На человеческом языке это звучит так: если сумма перевода превышает миллион, система активирует скрытый сценарий. В тот момент, когда ты – или тот, кто имитировал тебя – нажимаешь кнопку «Подтвердить», скрипт на доли секунды подменяет реквизиты получателя. На экране ты видишь счет проверенного поставщика, но в банковский шлюз уходит номер офшорного кошелька. После завершения операции скрипт возвращает всё назад и стирает себя из оперативной памяти.
Максим замер. Его дыхание стало тяжелым. Он только что нашел «Smoking Gun» – дымящийся пистолет, но этот пистолет был встроен в саму кобуру.
– Это не вирус, – медленно произнес он, и холодный пот коснулся его спины. – Эту функцию невозможно добавить извне через обычный взлом. Она прописана в архитектуре самого софта. Глубоко, на уровне ядра.
– Ты хочешь сказать… – Лена побледнела еще сильнее.
– Я хочу сказать, что фонд «Наследие» заказал разработку системы «Зенит» с уже встроенным механизмом для воровства. Архитекторы системы изначально предусмотрели возможность вывода средств так, чтобы виноватым всегда оказывался конечный пользователь с правами администратора. То есть ты. Это не подстава коллег, Лена. Это «инженерная» работа государственного масштаба. Тот, кто писал этот код, знал, что его никогда не будут проверять обычные спецы.
Максим откинулся на спинку дивана. Его руки мелко дрожали – не от страха, а от осознания чудовищности масштаба. Он привык ловить сисадминов на мелких откатах и бухгалтеров на подделке чеков. Но здесь он столкнулся с системой, которая была спроектирована как инструмент преступления. Весь фонд, вся эта «благотворительность», все школы и больницы были лишь декорацией для гигантского шредера, перемалывающего бюджетные деньги в частный капитал.
И Лена в этой схеме была не просто сотрудником. Она была расходным материалом, предусмотренным техническим заданием. «Предохранитель», как она сама выразилась в ТЦ.
– Макс, что мне делать? – её голос сорвался на шепот. – Если это встроено в систему, то я никогда не докажу свою невиновность. Моя подпись стоит под каждым этим чертовым кодом.
Максим снова посмотрел на экран. Холод в животе, который он почувствовал в ТЦ, теперь превратился в ледяную глыбу. Он понял, против кого они вышли. Волков не просто воровал деньги. Он строил систему, защищенную на уровне математики и логики. Чтобы победить её, нужно было не просто найти ошибку, нужно было переписать правила игры.
– Есть одна деталь, – Максим снова придвинул ноутбук. – Любой код оставляет «цифровую пыль». Смотри сюда. Скрипт подмены активировался через удаленный триггер. Кто-то должен был дать команду на исполнение в ту самую секунду. И этот кто-то использовал уникальный сертификат разработчика.
Он ввел длинную команду, запуская глубокий поиск по хеш-суммам сертификатов. Процессор ноутбука взвыл, вентиляторы заработали на максимуме. Секунды тянулись как часы. Лена не дышала, глядя на индикатор загрузки.
Наконец, экран выдал одну-единственную строку.
– Есть, – выдохнул Максим. – Сертификат DEV-GEN-099-X. Он принадлежит не фонду. Он принадлежит компании-разработчику «Скай-Тек». Но знаешь, что самое интересное? Эта компания закрылась через неделю после сдачи проекта «Зенит». Её больше нет. Все концы в воду.
– Значит, это тупик?
– Нет, – Максим закрыл ноутбук. – Это направление. Если компании нет, значит, кто-то из ведущих программистов должен был забрать исходный код с собой. Или оставить себе «бэкдор» на всякий случай. Нам нужен человек, который написал ядро «Зенита».
Максим поднял глаза на Лену. В его взгляде больше не было холодной отстраненности аудитора. Теперь там была ярость человека, чью логику попытались оскорбить столь наглым и совершенным преступлением.
– Мы не сможем оправдать тебя через суд, Лена. Судья не поймет разницу между NTP-сервером и системным временем. Для них твоя подпись – это истина в последней инстанции. Нам нужно заставить систему сожрать саму себя.
– Как?
– Я должен стать этим скриптом. Я должен влезть внутрь фонда и запустить их «шредер» в обратную сторону. Но для этого мне нужно попасть в их физическую серверную. Удаленно они нас заблокируют через пять минут после начала атаки.
Максим посмотрел на свои часы. 04:50. Скоро начнет светать. Город проснется, и охота на Лену перейдет в активную фазу. Черная «Октавия» – это только начало. Скоро подключатся административные ресурсы, биллинг телефонов, распознавание лиц по камерам.
– У нас есть примерно три часа, пока Бельский не поймет, что ты не просто прячешься, а начала кусаться, – Максим встал, убирая ноутбук в сумку. – Нам нужно временное жилье. Место, где нет Wi-Fi, нет камер и где хозяйка не смотрит новости.
Он чувствовал, как его стерильная, выверенная жизнь рассыпается в прах. Но впервые за многие годы он чувствовал, что его мозг работает на 100% мощности. Это был не просто аудит. Это была война цифр. И он не собирался проигрывать её только потому, что противник оказался «инженером» высшей лиги.
– Пойдем, – он взял её за локоть, на этот раз не отстраняясь. – Нам нужно обнулиться. В прямом смысле слова. Мы должны исчезнуть из всех баз данных, чтобы появиться там, где они нас меньше всего ждут. В самом сердце их системы.
Они вышли из антикафе. Холодный утренний воздух ударил в лицо. Максим окинул взглядом пустую улицу. Где-то там, в цифровом эфире, уже летели пакеты данных с его описанием и номером машины. Он знал это так же четко, как видел «временную петлю» в логах.
Битва за полмиллиарда и одну жизнь перешла в фазу прямого столкновения.
Когда они вышли из антикафе, город уже начал менять свой цвет. Густая иссиня-черная ночь растворилась в вязком, сером тумане, который поднимался от реки и оседал на лобовых стеклах припаркованных машин тяжелой росой. Уличные фонари всё еще горели, но их свет – болезненно-оранжевый, мутный – едва пробивал эту белесую взвесь. Улица была абсолютно пуста, и в этой тишине шаги Максима и Лены звучали пугающе отчетливо, словно кто-то отстукивал метрономом последние секунды их относительной свободы.
Максим быстро шел к своей машине, сканируя взглядом пространство между домами. Его мозг, перегруженный часами анализа кода, теперь работал в режиме тактического процессора. Он отмечал каждую деталь: перегоревшую лампу над подъездом, случайную кошку, метнувшуюся в подвал, положение мусорных баков.
– Слушай меня, – не оборачиваясь, бросил он Лене. – Сейчас мы едем в одно место. Это старая квартира моей тетки, она пустует уже год. Там нет домофона с распознаванием лиц, нет умных колонок и умных телевизоров. Ты зайдешь внутрь, задернешь шторы и не будешь подходить к окнам. Про телефон забудь. Если захочешь пить – пей воду из-под крана, не выходи в магазин за бутылкой. Любая транзакция по твоей карте – это маяк, на который они прилетят через десять минут.
Лена шла следом, едва волоча ноги. Она напоминала сломанную куклу, чьи шарниры заржавели от сырости и усталости. Её взгляд был расфокусирован, она смотрела сквозь Максима, сквозь туман, куда-то в пустоту своего разрушенного будущего.
– Ты слышишь меня? – Максим остановился у водительской двери и резко обернулся.
Лена наткнулась на него, не успев затормозить. Она подняла на него глаза, и в оранжевом свете фонаря он увидел, что её зрачки расширены настолько, что почти скрывают радужку. Это был предел. Человеческая психика, в отличие от сервера, не имела системы автоматического охлаждения.
– Да… – прошептала она, едва шевеля губами. – Никаких транзакций. Никаких окон. Максим, я так хочу спать. Мне кажется, если я сейчас закрою глаза, я просто перестану существовать.
– Не сейчас, – отрезал он, открывая дверь и буквально заталкивая её на пассажирское сиденье. – Сон – это роскошь, которую мы пока не заслужили. Нам нужно добраться до места, пока город не проснулся и трафик не скрыл тех, кто может за нами прийти.
Он сел за руль, привычным жестом проверил, ровно ли лежат ключи в подстаканнике, и завел двигатель. Тихий рокот мотора показался ему в этой тишине ревом реактивного самолета. Максим включил габариты, но не стал включать ближний свет, пока они не выехали из дворов на освещенную магистраль.
Они двигались по пустынным проспектам. Москва в этот час была похожа на гигантскую спящую схему, лишенную электрического тока. Максим вел машину плавно, без резких ускорений, стараясь не привлекать внимания редких патрулей ДПС. Он постоянно поглядывал в зеркало заднего вида – сначала механически, по привычке, но через пятнадцать минут пути его взгляд замер.
В зеркале, в паре сотен метров позади, туман едва заметно колыхнулся.
Максим прищурился. Там не было фар. Никаких огней. Но он отчетливо видел силуэт – приземистый, темный, движущийся в том же темпе, что и его машина. Черный седан.