Протокол Пангея. Пенсионный баг

    Февраль. Год пятый. Майами.
    Фантом нашел это в среду в половину третьего ночи.
    Не потому что искал — потому что не спал. Это было его обычное состояние в обычную среду: три монитора, заливающие комнату мертвенно-белым светом, массивные наушники, изолирующие от внешнего мира, и тихая, едва различимая меланхоличная музыка, которую никто, кроме него, не слышал. Он читал код. Читал так, как другие люди читают хорошую художественную литературу — лениво скользя взглядом по строкам, смакуя логику, ища изящество там, где большинство видело лишь сухие массивы данных. Просто для удовольствия, а не по рабочей необходимости.
    Его взгляд зацепился за модуль пенсионного фонда. Не за тот новый блок, над которым он работал на прошлой неделе, а за старый, монолитный каркас, написанный еще год назад, когда фонд Пангеи только запускали в продакшн. Фантом копался в нем без конкретной цели, у ведомый лишь профессиональной интуицией.
    Увидел строчку.
    Остановился. Музыка в наушниках вдруг показалась лишней, и он сдернул их на шею.
    Прочитал еще раз. Воздух в комнате словно сгустился, став липким и душным.
    Потом еще раз — медленно, очень медленно, как читают смертный приговор, в который до последнего не верят, перепроверяя каждую букву в тщетной надежде, что это всего лишь оптическая иллюзия, усталость глаз, глупая шутка воспаленного разума.
    Не показалось. Код на экране оставался прежним, холодным и безжалостным.
    Он открыл мессенджер и написал Антону — прямо так, в половину третьего ночи, без дежурных предисловий, сухих приветствий и точек:
    «Антон. Проснись. Это срочно».
   
    Антон увидел сообщение в три ночи.
    Не потому что страдал бессонницей — потому что телефон на прикроватной тумбочке коротко, но требовательно завибрировал. Он проснулся мгновенно, сработало подсознательное правило, выработавшееся за пять изнурительных лет существования Пангеи: срочные ночные сообщения бывают двух видов — те, которые спокойно дождутся утра, и те, после которых мир уже не будет прежним. Фантом никогда, ни при каких обстоятельствах не писал сообщения первого вида.
    Антон не стал тратить время на текст. Он сразу нажал кнопку вызова.
    — Покажи, — сказал Антон вместо приветствия, едва Фантом снял трубку. Голос был хриплым от сна, но сознание уже работало на пределе.
    Фантом не ответил устно — просто запустил экранный шаринг. Код развернулся на трех мониторах одновременно, разбитый на бесконечные столбцы зависимостей. Антон всматривался в мерцающие символы через экран телефона, чувствуя, как внутри зарождается холодная волна тревоги. Потом смотрел еще. Наконец, он резко сел на кровати, спустил ноги на холодный пол и включил настольную лампу, безжалостно разрезавшую темноту спальни.
    — Подожди, — произнес он, потирая виски свободным кулаком. — Подожди. Это что, б_ть, значит?
    — Это значит, что алгоритм расчета накоплений использует неверный коэффициент индексации для резидентов с непостоянным доходом, — голос Фантома в динамике звучал ровно, пугающе спокойно, словно он зачитывал сводку погоды. — Не для всех. Только для тех, кто менял уровень декларируемого дохода более трех раз за текущий год. Таких у нас сейчас примерно треть от общей базы.
    — И что происходит с их накоплениями? — Антон уже натягивал джинсы, зажав телефон между ухом и плечом.
    — Ничего пока, — ответил Фантом. — Ошибка сидит глубоко в логике расчета — не в самих транзакциях. Все деньги физически на месте, на эскроу-счетах. Но если запустится автоматическая квартальная переиндексация — а она, как ты помнишь, запускается первого марта — ядро системы пересчитает балансы по этому неверному коэффициенту. И у трети наших резидентов баланс в ту же секунду упадет.
    — На сколько упадет?
    — В среднем на двенадцать-пятнадцать процентов, — тихо сказал Фантом. В трубке послышался тихий щелчок зажигалки. — У некоторых, самых активных фрилансеров, — на все двадцать.
    Антон замер с кроссовком в руке, глядя в одну точку на стене.
    Восемнадцать миллиардов долларов под управлением фонда. Треть базы — это гораздо больше миллиона живых, реальных человек. Двенадцать-пятнадцать процентов от их жизненных сбережений, которые они доверили строчкам его кода.
    — До первого марта сколько дней? — спросил он, глядя на календарь в смартфоне.
    — Семь, — отрезал Фантом.
    — Звони Паше, — скомандовал Антон, хватая со стола ключи от машины. — Прямо сейчас, пускай сбрасывает сон. Я еду в офис.
   
    Паша прибыл в офис раньше Антона.
    Он жил всего в десяти минутах ходьбы — снял крошечную квартиру в Брикелле около года назад, когда наконец-то заставил себя съехать из безликого сетевого отеля, в котором безвылазно прожил два с половиной года. Квартира Паши была пустой, почти стерильной: вид на вечно шумящую многоуровневую автостраду, матрас на полу, рабочий стол и пара стульев. Паша всегда говорил, что это функционально. Большего ему для жизни внутри системы было не нужно.
    Когда Антон толкнул тяжелую стеклянную дверь серверной, Паша уже сидел перед главной консолью. На его очках отражались каскады логов. Лицо оставалось каменно-непроницаемым, как всегда, но Антон за пять лет совместной окопной войны научился читать его едва заметные микродвижения: чуть сильнее, чем обычно, сдвинутые к переносице брови, излишне жесткая линия плеч. Паша видел на экране то же самое, что и Фантом.
    — Смотрел? — спросил Антон, бросая куртку на пустой стул.
    — Смотрю, — Паша даже не повернул головы. — Фантом прав. Ошибка реальная. Математика не бьется.
    — Откуда она там взялась?
    Наступила тяжелая пауза, нарушаемая лишь мерным, монотонным гулом сотен серверов.
    — Не знаю, — наконец глухо произнес Паша. — Пока не знаю. Смотрю на историю коммитов в мастер-ветку.
    Фантом молча скользнул в кресло рядом. Три человека посреди изолированной серверной. Четыре часа утра. Снаружи за панорамными окнами замерла тихая, душная майамская февральская ночь, пахнущая океаном и остывающим асфальтом. Внутри — стерильный, леденящий воздух от мощных промышленных кондиционеров и бесконечные ряды мигающих зеленых огней на серверных стойках.
    — Марту будить? — спросил Фантом, не вынимая сигарету изо рта, хоть в серверной и висел строжайший запрет на курение. Сейчас всем было плевать.
    — Пусть спит до шести, — качнул головой Антон. — Это пока наша работа. Нам ее разгребать.
    — Майкла?
    — Утром, — Антон оперся ладонями о край стола Паши. — Сначала нам нужно выжать из этой ситуации точный масштаб бедствия.
   
    К шести утра они понимали масштаб. И от этого понимания во рту становилось горько.
    Фантом на коленке набросал аналитический скрипт, который в фоновом режиме прошелся по всей распределенной базе данных Пангеи, вычленяя профили и подсчитывая, сколько именно резидентов попадает под кривой коэффициент и как конкретно изменится их баланс в момент наступления первого марта.
    Финальный результат застыл на экране жирным белым шрифтом. Антон смотрел на него, забывая дышать.
    Один миллион сто сорок две тысячи триста восемьдесят один резидент.
    Средняя чистая потеря — тринадцать и семь десятых процента от суммы личных накоплений.
    Общая сумма, которая должна была бесследно «исчезнуть», раствориться в цифровом эфире при переиндексации — два миллиарда триста миллионов долларов.
    Это были не просто абстрактные цифры на дашборде. Это были пенсионные деньги реальных, живых людей. Тех самых программистов, независимых дизайнеров, переводчиков и фрилансеров, которые ушли из-под фискального гнета старого мира и поверили, что Пангея сохранит их будущее честно. Карл Вайс из Австрии — тот самый упрямый разработчик, чье прецедентное дело Аластер с таким трудом выиграл в европейском суде, — держал в фонде накопления за двадцать два месяца непрерывных взносов. Даниэль Леви из Тель-Авива — их самый первый официальный гражданин, резидент под гордым номером один — хранил здесь тридцать месяцев своей жизни.
    Один миллион сто сорок две тысячи таких судеб.
    — Антон, — негромко позвал Паша. В его голосе прорезалась странная, несвойственная ему жесткость.
    — Да.
    — Я нашел, откуда прилетела ошибка.
    Антон мгновенно развернулся к его монитору.
    Паша вывел на экран Git-логи репозитория ядра — конкретная строка кода, зафиксированная дата, уникальный хэш коммита и автор изменений.
    Автор был обозначен системным тегом: system_update_auto. Технический сервисный аккаунт, созданный для автоматических минорных обновлений безопасности и патчей операционной системы.
    — Автоматическое обновление? — нахмурился Антон, вчитываясь в таймстамп. — Но как...
    — Нет, — отрезал Паша. — Посмотри на время логирования. Изменение было внесено в прошлое воскресенье в три часа ночи по Гринвичу. Все наши автоматические обновления жестко завязаны на следующее расписание: вторник и четверг, ровно в шесть утра, когда нагрузка на сеть минимальна. Это не было скриптом автоматики.
    Антон почувствовал, как вдоль позвоночника пробежал холодок.
    — Кто имеет физический доступ к ключам этого аккаунта?
    — Трое, — Паша повернулся и открыто посмотрел Антону в глаза. — Я, Фантом и Марта. Есть еще системный администратор инфраструктуры в Монтевидео — Карлос. Но у него права только на уровне оркестрации репозиториев деплоя, к коду самого приложения его ключи не подходят.
    — Значит, кто-то из вас троих...
    — Нет, — Паша произнес это ровно, без обиды, просто как неоспоримый факт. — Ни я, ни Фантом, ни Марта в воскресенье в три часа ночи код не трогали. Нас вообще не было в сети. — Он сделал паузу, и звук его голоса упал до шепота. — Значит, кто-то сумел перехватить токен или скомпрометировать этот аккаунт извне.
    Они замолчали, глядя друг на друга. В полумраке серверной эта тишина казалась оглушительной.
    — Чен, — выдохнул Антон.
    — Чен, — эхом отозвался Паша.
   
    Чен зашел в серверную через двадцать минут после короткого звонка Антона.
    Ему позвонили в шесть двадцать утра. Антон не тратил время на вежливость — объяснил суть в трех предложениях: критический баг в расчете пенсий, поддельный коммит через системную учетку, подтвержденный факт несанкционированного проникновения глубоко внутрь периметра.
    Чен выслушал это молча, на том конце провода было слышно лишь его мерное дыхание. Он не задал ни единого вопроса.
    — Еду, — коротко обронил он и повесил трубку.
    Войдя в помещение, он даже не снял свой неизменный легкий плащ. Паша без лишних слов уступил ему место перед четвертым, резервным монитором. Чен сел, положил тонкие пальцы на клавиатуру и начал работать. Молча, с пугающей, почти механической методичностью. Паша и Фантом вернулись к своим терминалам, а Антон остался стоять позади них, переводя взгляд с одного экрана на другой, пытаясь уловить общую нить этого цифрового кошмара.
    Прошло около сорока минут. Стук клавиш Чена прекратился.
    — Нашел, — бросил он, не оборачиваясь.
    Все трое мгновенно сгрудились у него за спиной.
    — Это не внутренний слив, никто из наших учетных записей не скомпрометирован, — Чен вывел на экран карту сетевых маршрутов и каскад прокси-серверов. — Точка входа — наша резервная сингапурская нода. Кто-то получил легитимный доступ к служебному аккаунту автоматики, используя старую уязвимость в протоколе авторизации ядра. Ту самую уязвимость, которую мы с Пашей закрыли в октябрьском релизе. Но закрыли, как выясняется, не везде — на сингапурском зеркале по какой-то причине осталась старая, непропатченная версия библиотеки.
    — Ты хочешь сказать, что нас... взломали? — Антон сжал кулаки так, что побелели костяшки.
    — Я говорю, что кто-то целенаправленно зашел через незакрытую уязвимость, аккуратно подменил токен и внес хирургически точное изменение в код, — Чен медленно повернулся, его лицо в свете монитора выглядело бледным, уставшим, но взгляд оставался острым. — Это не случайная ошибка, Антон. И не глупый баг замученного джуна. Это прямое, намеренное действие.
    Тишина в серверной стала осязаемой. Было слышно лишь монотонное, ровное гудение кулеров в стойках, перерабатывающих терабайты чужих жизней.
    — Диверсия, — негромко, одними губами произнес Фантом, нервно крутя в пальцах сигарету.
    — Диверсия, — подтвердил Чен, и в его голосе проскользнули нотки профессионального уважения к противнику. — Причем превосходно спланированная. Тот, кто это провернул, досконально знал внутреннюю архитектуру Пангеи. Он прекрасно понимал, что ошибка в коэффициенте индексации никак не проявит себя в ежедневных логах, система ее просто не заметит. Она должна была выстрелить только при запуске квартального перерасчета. Он знал, что у нас переиндексация первого марта. И он специально выждал время, оставив нам ровно семь дней. Этого слишком мало, чтобы мы успели обнаружить подмену случайно в ходе рутинного аудита, но вполне достаточно, чтобы после катастрофы все выглядело как застарелая, глупая ошибка архитекторов, которую просто никто вовремя не заметил.
    — Кто это мог сделать, Чен? У кого есть ресурсы на такое?
    Чен посмотрел на Антона долгим, тяжелым взглядом, в котором читался шлейф его собственного темного прошлого.
    — Профессионалы, — тихо сказал он. — Государственного уровня. Ни у одной частной хакерской группировки или корпоративной структуры старого мира просто нет столь глубокого понимания логики нашего распределенного ядра.
    — Ты уверен в этом?
    — На сто процентов в нашем деле быть уверенным нельзя, — Чен откинулся на спинку кресла. — Но это единственная логичная и наиболее вероятная версия.
    Антон резко поднялся, не в силах больше сидеть на месте. Он начал мерить шагами узкое пространство серверной, остановился у серой бетонной стены, упершись в нее лбом.
    Два миллиарда триста миллионов долларов чистых пенсионных сбережений. Один миллион сто сорок две тысячи человек, доверивших им свою старость. И всего семь суток до первого марта.
    — Сколько времени нужно, чтобы все исправить и затереть след? — спросил он, поворачиваясь к команде.
    — Написать правильную строчку кода и вернуть исходный коэффициент — дело одного часа, — ответил Паша, потирая усталые глаза под очками. — Проверить на тестовом стенде, что исправление корректно и не потянет за собой соседние модули — уйдет день. Но вот развернуть этот патч на все наши распределенные ноды по всему миру с полным, детальным тестированием безопасности, чтобы не вызвать подозрений у сети — на это нужно еще минимум двое суток.
    — Итого три дня? — Антон заглянул Паше в глаза.
    — Минимум, — жестко ответил тот. — Это если работать без остановок и забыть про сон.
    — Значит, не спим, — отрезал Антон.
   
    Майклу он позвонил ровно в восемь утра.
    Майкл ответил на первой же секунде вызова — судя по идеальному, ровному голосу и легкому шуму на заднем плане, он уже давно был на ногах и находился в своем рабочем кабинете.
    — Слушай меня очень внимательно, — Антон говорил быстро, отрывисто, отбрасывая любые лишние эмоции. — У нас ЧП в пенсионном модуле. Обнаружена критическая ошибка в алгоритме индексации накоплений. Под угрозой один миллион сто сорок две тысячи резидентов. Потенциальный ущерб — два миллиарда триста миллионов. Первого марта запускается автоматический пересчет. У нас есть ровно семь дней.
    В трубке повисла тяжелая, густая пауза. Слышно было лишь, как Майкл тихо поставил чашку с кофе на стол.
    — Это внутренний баг? — спросил он наконец.
    — Это диверсия, — жестко сказал Антон. — Чен только что подтвердил. Нас вскрыли через сингапурский шлюз.
    Следующая пауза длилась еще дольше. Антон почти физически чувствовал, как на том конце провода Майкл перестраивает свои ментальные карты, просчитывая геополитические риски.
    — Сами деньги в безопасности? Физический ущерб есть?
    — Пока нет. Все на счетах. Если успеем выкатить исправление до первого марта — никто из резидентов ничего не потеряет и даже не заметит.
    — Мы успеем?
    — Паша закладывает три дня. Это чистая работа, если не возникнет форс-мажоров.
    — У вас есть целых семь дней, Антон. В чем задержка?
    — Семь дней — это если мы не наткнемся на новые сюрпризы, — мрачно пояснил Антон. — Чен утверждает, что работал мастер высочайшего класса. В системе могут сидеть другие скрытые закладки, которые мы пока просто не откопали в этой куче логов.
    — Понял, — голос Майкла мгновенно вернул свою привычную стальную уверенность. — Что конкретно требуется от меня прямо сейчас?
    — Во-первых, Аластер Кроули должен быть в курсе, — загнул палец Антон. — Если эта херня каким-то образом утечет в прессу или к регуляторам до того, как мы закроем дыру, нам понадобится железобетонная юридическая позиция. Во-вторых, Чену нужны дополнительные ресурсы. Срочно. Люди, специалисты, которые способны помочь с глубоким разбором этого взлома и аудитом соседних веток.
    — Аластер будет на связи через час, я сам ему наберу, — быстро проговорил Майкл. — Насчет людей для Чена — передай ему, пусть составит список требований к квалификации. Я все организую до полудня. Санджай как раз знает нужных специалистов в этой узкой сфере.
    Антон не удержался от горькой усмешки:
    — Санджай знает специалистов по кибервзломам государственного уровня? Серьезно?
    — Санджай знает вообще всех, Антон, — спокойно ответил Майкл. — Ты ведь и сам это прекрасно знаешь. Работайте. Я на связи двадцать четыре на семь.
   
    Марта влетела в серверную ровно в девять утра.
    Антон перехватил ее прямо у самого входа и тут же увел в узкий коридор. Он объяснил ситуацию за пару минут, опуская технические детали, которые она и так поймет с первого взгляда. Марта слушала его, не перебивая, ее лицо оставалось абсолютно спокойным, но глаза... Антон за три года совместной работы научился безошибочно читать это выражение: ее внутренний аналитический процессор уже на огромной скорости просчитывал алгоритмы кризисного менеджмента, пока она еще только дослушивала последние слова.
    — Покажи мне этот коммит, — коротко бросила она, едва он закончил.
    Она подошла к терминалу Паши, отодвинув его плечом, и впилась взглядом в строчки кода. Быстро прокрутила логи. Прочитала хэш. Посмотрела еще раз, прищурившись.
    — Карлос, — тихо произнесла она.
    — Что — Карлос? — Антон нахмурился. — При чем тут Уругвай?
    — Я обязана проверить Карлоса, — Марта выпрямилась и достала из кармана телефон. — Не потому, что я лично его подозреваю или не доверяю после стольких лет. А потому, что он единственный из региональных админов имеет расширенный доступ к инфраструктуре деплоя. Я хочу полностью исключить этот вектор, чтобы не тратить время на ложные следы.
    — Согласовано, — кивнул Антон. — Проверяй.
    Марта уже быстро набирала международный номер. Ждать ответа пришлось недолго.
    — Карлос, — жестко произнесла она на испанском, едва в динамике раздался сонный голос. — Это Марта. Без лишних слов: вспомни и скажи мне четко, что конкретно ты делал в прошлое воскресенье ровно в три часа ночи по Гринвичу?
    В трубке повисла тишина, пока Карлос на том конце планеты судорожно соображал и сверялся со своим календарем.
    — Хорошо, верю, — Марта оставалась непреклонной. — Прямо сейчас скинь мне на защищенный адрес полные логи доступа со своего персонального админского аккаунта за все воскресенье. Все до единого. Да, Карлос, шевелись. Нет, у нас все в порядке, обычная плановая процедура безопасности периметра. Жду.
    Она нажала отбой и убрала телефон в карман брюк, повернувшись к Антону:
    — Карлос крепко спал в это время в Монтевидео. Его локальный аккаунт в этот таймфрейм не проявлял абсолютно никакой сетевой активности. Он чист. Мы зря тратим на него время.
    — Откуда тогда, черт возьми, прилетел этот вход?
    — Чен разберется, это его епархия, — отрезала Марта, собирая волосы в жесткий хвост. — Моя прямая задача — сделать так, чтобы эта херня не повторилась, пока мы латаем дыры. — Она обвела серверную строгим, хозяйским взглядом. — Антон, мне необходимо временно, прямо сейчас ограничить внешний API-доступ к нескольким второстепенным внутренним сервисам Пангеи. Пока Чен и его люди не проверят абсолютно все региональные ноды на наличие скрытых закладок.
    — Наши резиденты это заметят? Будут сбои?
    — Некоторые сервисы статистики и личных кабинетов начнут ощутимо подтупливать и замедляться, — честно призналась Марта. — Но система не упадет, я удержу балансировщики. Замедлится отклик. Официально вывесим на главной плашку, что проводим плановое техническое обслуживание инфраструктуры.
    — Сколько времени тебе нужно на это?
    — Сутки. Может, двое. Как пойдет аудит.
    — Делай, — кивнул Антон. — Время пошло.
   
    Следующие три дня они почти не выходили из здания офиса.
    Мир для Антона сузился до размеров этого этажа. Он спал на кожаном диване в переговорной — урывками, по два-три часа, просыпаясь в холодном поту, после чего снова садился за рабочий стол. Паша, казалось, вообще перестал существовать как биологический объект — насколько мог судить Антон, тот не смыкал глаз вообще. Он просто неподвижно сидел перед своей консолью, превратившись в бледную тень самого себя, изредка вставал на неслушающихся ногах, чтобы налить себе очередную кружку черного, как деготь, кофе, и молча садился обратно. Фантом отключался прямо за рабочим столом — ронял тяжелую голову на сложенные руки, спал ровно десять-пятнадцать минут под мерный стук чужих клавиш, после чего резко вскидывался и снова впивался взглядом в монитор.
    Марта притащила коробки с едой прямо в серверную — то, за что в обычные дни она безжалостно штрафовала и выгоняла любого сотрудника, — и сейчас никто в здравом уме не посмел сделать ей даже малейшего замечания.
    Чен безвылазно работал в дальнем углу комнаты вместе с двумя молодыми, молчаливыми специалистами, которых оперативно прислал Санджай. Эти парни были тихими, вежливыми, с абсолютно пустыми, непроницаемыми глазами и явно имели крайне интересное, специфическое прошлое в госструктурах. Чен смотрел на них с гораздо меньшим подозрением, чем обычно смотрел на любых новых людей в своем окружении. Для Антона это само по себе служило наивысшей, пугающей рекомендацией.
    Первый день полностью ушел на жесткую диагностику. Чен и его молчаливая команда под микроскопом проверяли каждую региональную ноду, каждый коммит в репозиториях, каждую служебную учетку. К вечеру они откопали еще две скрытые аномалии в соседних модулях — не такие катастрофические, как пенсионный баг, но вполне реальные цифровые лазейки. Закрыли их жестко, с корнем.
    Паша в это время методично, строка за строкой, переписывал исправленный алгоритм индексации. Фантом брал каждую его новую итерацию и прогонял через симуляторы — дотошно, без суеты, потому что любая спешка здесь, на финишной прямой, была стократно опаснее медлительности.
    Второй день превратился в бесконечный цикл тестирования. Антон лично отслеживал результаты каждого прогона. Стоило симулятору выдать хотя бы малейшее несоответствие в сотых долях процента, как Паша молча забирал код обратно и переписывал блок заново. Марта параллельно гоняла жесткие нагрузочные тесты на боевых серверах-зеркалах — она проверяла, не вызовет ли этот новый патч каскадный сбой при реальной, пиковой нагрузке от миллионов пользователей.
    В самом конце второго дня Паша откинулся на спинку кресла и глухо произнес:
    — Все. Алгоритм работает правильно. Все синтетические тесты проходят без ошибок.
    Антон подошел со спины, глядя на зеленые галочки в логах деплоя.
    — Ты уверен на сто процентов? — спросил он тихо.
    — Нет, — Паша повернул к нему изможденное лицо с темными кругами под глазами. — На сто процентов я никогда не уверен. Но это максимальный уровень уверенности, который я физически способен выдать в этих обстоятельствах.
    — Этого достаточно?
    — Этого вполне достаточно, чтобы двигаться дальше, — отрезал Паша. — Стопроцентной уверенности в архитектуре вообще не бывает. Бывает лишь достаточная для принятия решений.
    Третий день превратился в сплошное развертывание.
    Антон впоследствии помнил этот день как размытую, кинематографичную серию коротких, острых моментов паники, зажатых между бесконечными, изнуряющими часами ожидания. Региональная команда в Монтевидео под личным, жестким контролем Карлоса накатывала обновление на южноамериканские сервера — шаг за шагом, сверяя каждый байт. Сингапурская нода — та самая проклятая точка, через которую враг проник внутрь, — получала этот спасительный патч самой последней, проходя через тройной, выверенный цикл проверок безопасности, который Чен выстроил и контролировал лично.
    В десять часов вечера третьего дня в общем рабочем чате Пангеи всплыло короткое сообщение от Паши:
    «Обновление успешно развернуто на всех региональных нодах сети. Все пост-деплой тесты пройдены успешно. Квартальная переиндексация первого марта гарантированно пройдет по правильному, исходному алгоритму».
    Антон несколько секунд тупо смотрел на строчки на экране. Затем медленно закрыл крышку ноутбука.
    Встал. И на непослушных ногах вышел из душной, гудящей серверной.
    В огромном open-space зале на двадцать четвертом этаже царила гробовая тишина. Все сотрудники, не задействованные в экстренной группе, ушли по домам еще несколько часов назад. Горел лишь тусклый, приглушенный дежурный свет, выхватывающий из темноты контуры пустых стоек и кресел. За огромными панорамными окнами от пола до потолка раскинулся ночной Майами — обычный, безразличный теплый февральский вечер. Бискайский залив казался чернильно-черным, по воде медленно скользили редкие огни далеких яхт.
    Антон подошел вплотную к стеклу, прижавшись к нему лбом.
    Три дня. Три бесконечных, вычеркнутых из жизни дня ушло на то, чтобы просто исправить то, что кто-то чужой сломал одним незаметным движением. Два миллиарда триста миллионов долларов не растворятся в воздухе первого марта. Один миллион сто сорок две тысячи человек спокойно проснутся утром в пятницу, даже не подозревая, что их жизнь едва не покатилась под откос.
    Они никогда не узнают, что здесь произошло.
    Это было их общее, взвешенное решение — Майкл и Аластер полностью согласились с доводами Антона: не делать никаких публичных заявлений, не сеять панику среди инвесторов и граждан, устранить угрозу тихо, без шума. И не потому, что Пангея хотела что-то скрыть или сгладить углы, — а просто потому, что они успели все починить до того, как пострадал хотя бы один реальный цент.
   
    Но сам Антон знал.
    И это знание сейчас давило на плечи невероятной, свинцовой тяжестью. Это была не вина, не липкий страх перед будущим — это была чистая, концентрированная тяжесть ответственности за этот миллион с лишним душ, которые искренне поверили в его проект. Которых он сегодня не подвел, вырвав победу зубами. Но мог подвести. На каких-то жалких семь дней мог подвести все под крах.
    Позади послышались тихие шаги. Паша подошел и встал рядом у соседнего окна, засунув руки в карманы джинсов.
    Они долго стояли молча, просто глядя на мерцающие огни ночного города.
    — Паша, — нарушил тишину Антон.
    — Да.
    — Спасибо тебе. За все.
    — Не благодари, — сухо отозвался Паша, даже не повернувшись. — Это была наша общая работа. Мы ее сделали.
    — Ты не спал трое суток, Паш. Вообще.
    — Я в принципе плохо сплю здесь, в Майами, — Паша пожал плечами. — Слишком жарко.
    Антон удивленно повернулся и посмотрел на него:
    — Паша, на дворе конец февраля. За окном двадцать два градуса. Это идеальная погода.
    — Для меня все равно слишком жарко, — абсолютно невозмутимо парировал Паша.
    Антон вдруг коротко, хрипло засмеялся — искренне, смывая этим смехом накопившуюся за трое суток дикую усталость. Паша не улыбнулся в ответ, но жесткие складки у его губ чуть заметно разгладились, а взгляд стал теплее.
    — Иди домой, выспись наконец, — Антон похлопал его по плечу.
    — Иду, — кивнул Паша. — Антон.
    — Да?
    — Чен все-таки докопался, откуда именно прилетел взлом. Сингапурская нода была лишь промежуточным прокси-сервером. Он сумел полностью отследить всю цепочку пакетов. Там было выставлено семь слоев жесткой, профессиональной анонимизации. Чен успешно вскрыл шесть из них.
    — А седьмой?
    — Седьмой сейчас в работе, — Паша развернулся к выходу. — Чен говорит, что завтра к утру у него на столе будут железные логи. Он будет знать конечного заказчика.
    Антон молча кивнул, снова поворачиваясь к заливу.
    — Спокойной ночи, Паша.
    — Спокойной ночи.
    Паша ушел, тихо прикрыв за собой дверь. Спустя пару минут серверную покинул Фантом — молча, лишь коротко и понимающе кивнув Антону у порога. Затем мимо прошла Марта — она единственная остановилась и негромко произнесла: «До завтра», что для ее сухой, исполнительской натуры приравнивалось к длинному, эмоциональному прощанию.
    Молодые специалисты Санджая растворились в темноте коридора вообще без звука — просто исчезли в один миг, словно их никогда и не было в этом офисе, как умеют исчезать только люди с очень специфическим прошлым.
    Последним из серверной вышел Чен.
    Он медленно подошел к Антону, остановившись на своей привычной, строго выверенной психологической дистанции в полтора метра. Сложил руки на груди, тоже вглядываясь в панораму ночного Майами.
    — Чен, — тихо позвал Антон, не оборачиваясь.
    — Да.
    — Завтра ты назовешь мне имя? Ты скажешь, кто именно за этим стоял?
    — Завтра я выложу все, что сумею доказать документально, — Чен говорил тихо, взвешивая каждое слово. — Но учти, это может оказаться гораздо меньшим объемом информации, чем тебе бы хотелось услышать.
    — Это... это была государственная структура?
    Чен взял долгую, зловещую паузу. Было слышно, как внизу, на набережной, тихо шелестят от ветра листья пальм.
    — Это структура, которая действует в прямых геополитических интересах конкретного государства, — сформулировал он с предельной осторожностью. — Не напрямую, конечно. Через несколько промежуточных коммерческих слоев и подставных фондов. Но вектор атаки... да, направление именно то, о чем ты думаешь.
    — Какое именно государство, Чен?
    — Завтра, Антон, — Чен слегка повернул голову. — Все подробности завтра.
    Антон вздохнул и уставился на черную воду залива.
    — Чен, — снова позвал он.
    — Да.
    — Ты ведь еще в самый первый день, когда только сел за логи коммитов, сказал, что это почерк профессионалов государственного уровня. Ты уже тогда, в шесть утра, точно знал, с кем мы имеем дело?
    Чен помолчал секунду, его лицо оставалось непроницаемой маской.
    — Я обоснованно предполагал, — тихо ответил он. — По характерному почерку деплоя. Есть определенные паттерны написания вредоносного кода, специфические маркеры оптимизации запросов, которые не спутаешь ни с чем. — Он сделал паузу, и в его глазах на миг отразился огонек далекого маяка. — Я сам точно так же работал много лет назад. На ту сторону. Я просто узнаю этот имперский стиль.
    Антон медленно повернулся и внимательно посмотрел на него.
    — Ты хоть понимаешь, что все это значит для Пангеи? — спросил Чен, поймав его взгляд.
    — Что?
    — Это значит, что мы наконец-то стали достаточно большими и весомыми, чтобы нас начали по-настоящему бояться, — Чен едва заметно сузил глаза. — Мы больше не раздражаем их как глупый юридический казус. Мы больше не беспокоим их как мелкий стартап. Они нас боятся. А это совершенно другой уровень игры.
    — И это... по-твоему, хорошо?
    — Это смертельно опасно, — Чен развернулся и направился к выходу из зала. — Что, согласись, далеко не одно и то же с понятием «плохо». Спокойной ночи, Антон.
    — Спокойной ночи, Чен.
    Тяжелая дверь open-space закрылась. Антон остался в абсолютном одиночестве перед панорамой спящего мегаполиса.
   
    Первое марта должно было наступить через четыре дня. Автоматическая переиндексация фонда пройдет штатно, по правильным формулам. Миллион сто сорок две тысячи человек никогда не узнают, по какому краю пропасти они только что прошли.
    Но кто-то там, в высших эшелонах старого мира, уже изучил архитектуру Пангеи настолько глубоко, что сумел вычислить их единственную, самую уязвимую точку для нанесения одного, но абсолютно смертельного скрытого удара. Этот неизвестный противник анализировал их систему месяцами, чтобы понять: пенсионный модуль — их слабое место. И уязвимость эта была не технического характера, а репутационного. Целью были не серверные мощности, не массивы данных и даже не сами миллиарды долларов. Целью было доверие. Чистое доверие людей.
    Это был пугающе умный, гроссмейстерский ход.
    Антон достал телефон и быстро набрал сообщение Майклу:
    «Все полностью починили. Завтра утром Чен выдаст финальный отчет и назовет имя».
    Майкл ответил буквально через минуту. Время близилось к полуночи, но исполнительный директор Пангеи явно не собирался ложиться спать.
    «Великолепная работа. Передай мою личную благодарность всей команде».
    А следом, спустя пару секунд, прилетело второе сообщение:
    «Антон. Давай смотреть правде в глаза. Это война».
    Антон долго смотрел на светящиеся буквы на экране, чувствуя, как внутри закипает глухое, упрямое упрямство.
    «Я знаю», — быстро набил он в ответ.
    «Ты сам-то в порядке?» — спросил Майкл.
    Антон на секунду задумался, глядя на свое отражение в темном стекле окна.
    «Спрошу у тебя завтра утром ровно то же самое», — отправил он.
    Майкл прислал в ответ короткий смеющийся эмодзи — тот самый единственный смайл, который он вообще когда-либо использовал в деловой переписке.
    Антон заблокировал экран и убрал телефон в карман. Он в последний раз обвел взглядом ночной Майами — холодные огни Бискайского залива, темные силуэты пришвартованных яхт у причала и далекий, едва различимый маяк на самом краю горизонта, который медленно, методично и абсолютно сбалансированно посылал свои вспышки в темноту. Точно так же, как и пять лет назад.
    Фквраль. Год пятый.
    Кто-то на этой планете испугался Пангеи настолько, что решил нанести удар в самое сердце — в веру людей, которые пошли за ними.
    Не вышло.
    В этот раз у них ничего не вышло.


Рецензии