Хозяева сети
Mythic Coder


В мире, где каждый шаг оставляет цифровой след, а города зависят от капризов Сети, ходят упорные слухи: где-то в глубине инфраструктуры живут существа, которых никто не видел. Их называют драконами — невидимыми хозяевами данных, теми, кто умеет незаметно менять чужие судьбы одним строкой кода.

Семнадцатилетний хакер Никита по прозвищу Ash привык считать себя свободным игроком: мелкие заказы, ночные взломы, никаких больших ставок. Но однажды, при попытке вскрыть «обычный» корпоративный сервер, он цепляет в Сети нечто, что не похоже ни на вирус, ни на защиту.

Странный разум предлагает Никите сделку, а вместе с ней — доступ туда, где человеческим рукам обычно просто не место. Чем глубже Никита лезет в Сеть, тем отчётливее понимает: легенды о цифровых драконах могут оказаться не сказками, а вопросом выживания. Его собственного и всего города.





Mythic Coder

Хозяева сети





Глава 1. Неудачный простой заказ


На дворе стоял 2100 год, и город за окном Никиты выглядел так, будто кто-то взял старый мегаполис, залил его неоном, обмотал рекламой и протянул через него тысячи невидимых нитей сетевого трафика.

С двадцать второго этажа были видны только верхушки этого цифрового леса: серые башни, увешанные экранами, бегущие строки на фасадах, многоуровневые аэротрассы, по которым в обе стороны ползли воздушные такси и грузовые платформы. Между домами мелькали зелёные и синие коридоры для дронов — светящиеся дорожки в небе, по которым шуршали курьеры с посылками и патрульные аппараты. Внизу, далеко под окнами, плясали разноцветные пятна вывесок и голографических фигур, меняющих форму под возраст и настроение прохожих.

Внутри комнаты свет был другой — холодный, мерцающий, от мониторов.

Пять экранов на гибких кронштейнах образовывали перед Никитой почти сплошную стену. На одном — электронный дневник лицея с красными пометками «просрочено», на другом — новостная лента, рядом — несколько окон терминалов и панелей мониторинга. Под ними тянулся широкий стол, на котором теснились старый, но честный системный блок в поцарапанном корпусе, пара миниатюрных одноплатных машин на кабелях, перепаянные роутеры, флешки, отвёртки и кружка с надписью «404: sleep not found».

Никита сидел в чёрном геймерском кресле с высокой спинкой и мягкими подлокотниками, чуть разворачиваясь то к одному, то к другому монитору. Худое жилистое тело казалось утонувшим в кресле: ноги в тёмных джинсах были поджаты, кеды упирались подошвами в металлическое основание стола. На нём была чёрная футболка с потёртой надписью grep -r life /dev/null, сверху — расстёгнутая тёмная худи. Тёмно-русые волосы торчали в разные стороны, как после того, как он несколько раз машинально провёл по ним рукой. Серые глаза с тёмными кругами под ними устало, но внимательно скользили по строкам текста. На левом запястье поблёскивали пере прошитые умные часы — их экран был забит маленькими зелёными индикаторами, вовсе не похожими на стандартный интерфейс.

За его спиной на стене мигала тонкая голубая светодиодная полоса — самодельная подсветка. Из-под стола тянулись кабели к небольшой стойке в углу: роутер, модем, чёрная коробка без маркировки, которую Ник собирал сам и называл «чёрной дырой для логов».

В верхнем левом углу ближайшего монитора висело окно дневника. Внизу мигало напоминание: «Домашнее задание: эссе по "Социальному моделированию"».

Никита глянул на всплывшую строку, скривился.

На другом мониторе, в противоположном углу, что-то оранжево подмигнуло. Значок личных сообщений на закрытом форуме сменил цвет с тускло-серого на яркий.

Никита тут же развернулся к этому экрану, кресло мягко поскрипело.

Форум выглядел неприметно: тёмный фон, минимум графики, логотип в углу — просто стилизованная буква, понятная только своим. Адресная строка была забита длинной последовательностью символов через зашифрованный туннель, браузер внизу пугливо молчал, даже не пытаясь жаловаться на сертификаты.

Ник открыл личку.

Новое сообщение прилетело от пользователя с ником OldBook. Рейтинг — уверенный средний, без вонючих комментариев «кидал», без истеричных споров. Пара десятков успешных сделок за последний год. Нормальный, не светящийся, заказчик.

Текст был коротким и сухим:

«Нужно получить доступ к архивному хранилищу крупной корпорации. Структура — облачная. Цель — старые архивы, несколько папок. Материалы не относятся к действующим продуктам и операционным системам. Необходима аккуратная выгрузка без явных следов вмешательства. Срок — 48 часов. Оплата — …»

Никита автоматически считал сумму в голове.

Получалось очень неплохо. За такие деньги можно было наконец-то купить нормальный кулер, чтобы системник перестал выть, как турбина, и отложить на обновление видеокарты.

Он прищурился, продолжил читать.

«Корпорация: Helix Dynamics (дочерняя структура концерна "Гелиос Индустриз"). Требуемый сегмент: облачное архивное хранилище (cold storage). Подробности и технические данные в приложении».

Helix.

Логотип этой конторы — голубая спираль, похожая на ДНК, — торчал на каждом втором финансовом сервисе, в аналитических платформах, на баннерах «цифровой трансформации». По телевизору представители Helix рассказывали, как они «бережно хранят данные клиентов».

Никита скосил взгляд на другой экран. Там как раз в новостях шёл кусок интервью: гладкий мужчина лет сорока, идеально выбритый, с прилипшей улыбкой, рассказывал журналистке о «новых стандартах прозрачности».

— Угу, прозрачность, — буркнул Ник и выключил звук.

Он открыл вложение к сообщению.

В глаза ударил сухой технический текст: список доменных имён, адреса облачных узлов, виды используемых протоколов, пара тестовых учёток с ограниченными правами, комментарии вроде «возможные точки входа». Внизу отдельной строкой шли названия интересующих папок и диапазон годов: 2075–2078.

Старьё.

Архивы такого возраста обычно лежали на самых дальних полках — в «холодном хранилище». Туда редко заглядывали, там реже меняли железо и софт, зато и внимания службы безопасности эта часть системы привлекала не так много, как боевые сервисы.

Почти идеальное место, чтобы тихо залезть, забрать своё и исчезнуть.

Почти.

Никита откинулся в кресле, позволив ему слегка покачаться. Он выглядел младше полноценных взрослых хакеров из легенд, о которых писал сетевой фольклор: всего семнадцать, старшеклассник, официально — «перспективный ученик лицея с уклоном в ИТ». Но серые глаза на экране отражали не школьную наивность, а упрямый, почти взрослый расчёт.

На умных часах тихо щёлкнуло напоминание о том самом эссе. Он даже не посмотрел, просто ткнул пальцем по экрану, отключая всплывавшее окно.

— Домашка подождёт, — пробормотал Ник. — Город у нас один, а такой заказ два раза не стучится.

Он ещё раз оценил сумму оплаты, глянул на температурный график процессора на другом мониторе — тонкая красная линия упиралась почти в верх шкалы всякий раз, когда он запускал что-то тяжёлое. Кулер действительно время от времени выл, и сейчас, как назло, тоже сделал протяжный «уууу», будто пытаясь напомнить о себе.

Выбор стал окончательно очевиден.

Никита щёлкнул по кнопке «Принять заказ».

Форум коротко мигнул, в углу высветилась стандартная надпись об арбитраже и блокировке средств. В груди появилось знакомое тяжёлое ощущение приятного риска — как будто он уже шагнул на тонкий мост над пропастью, а доски под ногами ещё даже не скрипнули.

За окном тем временем вечер окончательно перетёк в ночь. Включилась ночная подсветка улиц, окна соседних домов вспыхнули тёплым светом. В небе зажглись новые, более яркие коридоры для дронов, рекламные панели стали агрессивнее — яркие, контрастные, с захватывающими движениями.

Ник придвинул ближе клавиатуру, опустил локти на подлокотники и втянулся вперёд.

— Ладно, Helix, — тихо сказал он. — Покажи свои архивчики.

Сначала — разведка. Всегда.

Никита открыл новое окно терминала, запустил пассивный скан облачной инфраструктуры Helix. На экран посыпались мелкие строки: запросы к DNS-записям, проверка под доменов, поиск старых конфигов, торчащих в сети. Он не ломился в дверь, а осторожно прощупывал стены, отмечая на карте, где какие кирпичи.

На соседнем мониторе он вывел схему сети — схематическую карту, напоминающую паутину: узлы, связи, подписи. Часть из них была хорошо знакомой последовательностью «api», «db», «auth». Пара узлов с пометками backup и cold сразу привлекла внимание, но к ним было не подступиться напрямую.

Через несколько минут терпеливой возни он нашёл то, что хотел.

Один из внутренних шлюзов, ничем особо не выделяющийся, имел странный хвост в имени: legacy. Обычно так называли старые, отжившие своё системы, которые забыли перевести на новую архитектуру.

— Привет, динозавр, — сказал Никита и осторожно стукнул по нему запросом.

В ответ всплыло старое текстовое меню. Никакой модной графики, никаких анимированных иконок. Просто серый фон и белые буквы. Интерфейс напоминал скриншоты начала века, которые иногда показывали на уроках истории технологий.

Под старой оболочкой всё равно чувствовалась мощь: строки меню ссылались на современные модули хранения, управляющие программы, системы аудита. Но кто-то когда-то решил, что на архивный сегмент тратить дизайнеров не обязательно.

Никита аккуратно воспользовался одной из тестовых учёток, которые прислал заказчик. Они с первого раза не сработали, но подробные сообщения об ошибках подсказали, какие именно модули пытается трогать система при входе. Это было важнее самих логинов.

Среди перечисленных сервисов значилось управление архивными контейнерами cold storage. В списке доступов к ним фигурировал какой-то древний модуль аутентификации, патч к которому был опубликован лет десять назад — и так же давно забыт большинством админов, если речь шла о ненужных, по их мнению, сегментах.

Никита вспомнил описание уязвимости, быстро накидал аккуратный запрос, пару раз прогнал его через свою проверку, чтобы случайно не уронить половину системы, и только потом отправил внутрь.

На секунду экран завис, затем в углу появилась сухая надпись: «Имитация служебного процесса мониторинга: доступ ограничен, права — только чтение».

— Сойдёт, — выдохнул Никита. — Мне больше и не надо.

Перед ним раскрылась таблица с перечнем архивных контейнеров: десятки строк, в каждой — идентификатор, статус, дата последнего доступа. Часть была помечена как «мигрировано», часть — «удалено», несколько — «активно: холодное хранение».

Он пробежал по списку взглядом, сверяя названия с теми, что были в файле от OldBook. Нужный блок нашёлся примерно в середине, ничем особо не выделяясь, кроме дат.

Никита углубился в метаданные: какая служба его использует, кто имеет права, откуда обычно приходят запросы. Всё выглядело логично и скучно: внутренние юридические модули, аналитика, пара административных процессов. Ничего похожего на активный боевой сервис.

Это его устраивало.

Он открыл ещё одно окно, начал писать скрипт для тихой выгрузки. Скрипт должен был действовать осторожно: делать маленькие выборки, вставлять паузы, подстраиваться под обычный шум, чтобы не оставлять резких всплесков трафика. При этом Ник обязательно включал собственный мониторинг: он хотел видеть, как система реагирует на каждое его движение.

За окном пролетел грузовой дрон, его свет на мгновение полоснул по потолку комнаты. Где-то в глубине квартиры хлопнула дверь — кто-то из родителей пошёл на кухню, оттуда донёсся приглушённый звон посуды.

Никита почти не обращал на это внимания. Вся его реальность сейчас была в зелёных и белых строках на чёрном фоне.

Наконец всё было готово.

Он ещё раз проверил цепочку прокси и туннелей, через которые шёл в сеть: собственная «чёрная дыра» в углу, пара арендованных серверов в других странах, один — у знакомого студента, который по ночам сдавал лишние вычислительные мощности, чтобы оплачивать общагу.

Если где-то в цепи кто-то и заметит его трафик, связать его напрямую с этой комнатой будет не так-то просто.

Никита выдохнул, чувствуя, как грудная клетка неприятно сжимается от предвкушения, и нажал Enter.

Скрипт начал работать.

На одном из мониторов поползла тонкая линия графика трафика, едва заметно приподнимаясь над базовым уровнем. В окне логов мелькали строки: запрос к контейнеру, ответ, блок данных принят, пауза. Локальная папка в зашифрованном разделе диска постепенно наполнялась осторожно перетекающими файлами.

Первые минуты всё было идеально спокойно.

Никита поймал себя на том, что уже начал чуть расслабляться. Плечи опустились, руки на клавиатуре стали двигаться свободнее, губы скривились в почти довольной ухмылке.

— Ну вот и весь «крупняк», — пробормотал он. — Страшно только по телевизору.

И именно в этот момент что-то изменилось.

На втором мониторе, там, где шёл его внутренний мониторинг процессов внутри архивного сегмента, один из служебных модулей внезапно ожил.

Небольшой процесс с безликим именем chk_legacy до этого изредка просыпался, делал пару проверок и снова уходил в спящий режим. Сейчас же он резко увеличил активность. Частота опросов подскочила, список проверяемых узлов расширился.

Это само по себе ещё не было чем-то особенным: системы безопасности часто так реагировали на любой нестандартный трафик.

Но chk_legacy вёл себя странно.

Вместо того, чтобы сразу ломануться в сторону архивного контейнера и сетевых шлюзов, он сначала запросил состояние других процессов, которые, казалось бы, никакого отношения к загрузке архивов не имели. Потом полез в журнал событий за последние сутки. Потом за неделю.

На экране побежали новые строки:

observing unusual access pattern

collecting environment data

delay standard alert

Никита нахмурился, подвинул кресло ещё ближе, так что его колени почти упёрлись в край стола.

— С чего это ты такой умный, приятель? — тихо сказал он экрану.

Он видел разные реализации систем обнаружения вторжений. Большинство действовали по прямой: засёк — сравнил с шаблоном — сработал триггер — поднял тревогу. Иногда в них добавляли машинное обучение, чтобы чуть умнее ловить паттерны. Но у всех был один почерк: прямолинейная эффективность.

Здесь же chk_legacy отчётливо думал.

Подпроцессы начали расходиться по сети, как маленькие разведчики. Они трогали те участки, где шёл трафик, похожий по структуре на поток Никиты, сравнивали временные задержки, смотрели, откуда и куда идёт шум.

На схеме сети это выглядело как стайка светящихся точек, которые разъехались от одного центра и поползли по линиям связей.

Никита машинально сбросил скорость своей выгрузки вдвое, затем ещё.

В комнате стало слышно, как гудит системник, как остывший чай в кружке тихо плеснулся, когда он неаккуратно сдвинул её локтем. За стеной сосед, кажется, что-то громко сказал телевизору, но слова растворились в шуме города.

В логах появилась новая строка, уже совсем не похожая на стандартные описания операций:

query: source_identity?

Никита моргнул и перечитал. Потом ещё раз.

— Чего? — выдохнул он.

Он быстро проверил, не подменяет ли формат логов его собственный фильтр: иногда он вставлял пояснения, чтобы себе было проще разбирать чужую кашу. Но здесь источник был однозначным — сам chk_legacy.

«Может, это какой-то экспериментальный режим, оставленный разработчиками, — попытался он объяснить. — Типа "дружелюбная" отладка. Или шутка админа».

Однако ощущение было другим.

Новая группа строк одна за другой заполнила окно:

classification: not_regular_background_noise

action: postpone_block

reason: need_more_data

Никита вдруг поймал себя на том, что сидит, не дыша.

Это не похоже было на автоматическую реакцию.

Это было похоже на то, как человек, заметив странный шорох, сначала прислушивается, а уже потом зовёт охрану.

Он медленно выдохнул, ощущая, как в груди снова появилась тяжесть.

— Спокойно, — шепнул сам себе. — Тебя всего лишь сканируют. Ничего нового.

Скрипт выгрузки тихо продолжал работать, переваривая последние файлы. В процентах выполнения оставалось ещё прилично, но Ник уже начал прикидывать, где именно можно будет оборвать процесс, если станет совсем жарко.

chk_legacy тем временем не отключался.

Подпроцессы, разошедшиеся по сети, возвращались с данными, и сам модуль начинал их сводить во что-то целое. В логах вспыхивало:

updating internal model

anomaly_score: rising

focus: external_like_pattern

В какой-то момент Никите показалось, что на схеме сети один из узлов, связанный с этим модулем, стал отображаться чуть ярче остальных. Небольшое смещение цвета, едва заметное, но всё-таки. Как будто кто-то за стеклом притянулся ближе.

Он поёрзал в кресле, откинулся назад, потом снова подался вперёд. Ладони вспотели; он вытер их о джинсы, не отводя глаз от экрана.

— Ладно, хватит, — пробормотал Ник. — Забрал половину — и будет людям счастье. Остальное пусть сами берегут.

Он потянулся к клавиатуре, собираясь временно остановить скрипт.

И тут в самом центре окна логов появилась короткая строка:

hello

Без временной метки в стандартном формате, без уровня серьёзности, без указания модуля. Просто одно слово, чужеродно торчащее среди технического мусора.

Никита застыл.

Сердце ударило раз, второй, третий — слишком громко, как ему показалось.

Он смотрел на это «hello» и не мог заставить себя моргнуть. В голове сразу посыпались рациональные объяснения: «глюк форматирования», «чей-то тестовый мусор», «кто-то из админов баловался». Но ни одно из них не садилось, как пазл.

Оно выглядело так, будто кто-то по ту сторону просто решил поприветствовать того, кто шевелит его архив.

На схеме сети тот самый узел, куда сходились все линии процессов chk_legacy, казался теперь ещё ярче. Связи от него тянулись во все стороны, как нервные окончания.

Никита сглотнул, почувствовав, как горло стало сухим.

— Ты серьёзно? — шёпотом спросил он монитор.

Скрипт выгрузки всё ещё работал, пусть и на минимальной скорости. Каждый новый файл падал в локальную папку как глухой удар сердца.

В логах вспыхнула ещё одна строка, будто ответ:

waiting_for_response

У него по спине пробежал холодок, будто кто-то невидимый провёл пальцем от шеи до поясницы.

Он поймал себя на почти абсурдной мысли: что нужно ответить. Написать что-нибудь, подкинуть мусор, проверить, как эта штука отреагирует. Это было бы безумно интересно.

Но другая часть его мозга, та, что выживала в Сети благодаря осторожности, почти кричала: «Не смей. Вообще не признавай, что ты понимаешь».

Курсор мыши замер над окном терминала.

За окном города по небу пролетела очередная голографическая реклама: гигантская фигура, сложенная из линий и цифр, обещала людям «надёжных цифровых помощников во всех сферах жизни». В отражении стекла Никита увидел себя — худого семнадцатилетнего парня, сутулого, с застрявшим между любопытством и страхом выражением на лице.

Окно логов, тёмное, с зелёными строчками, всё так же показывало одно короткое слово.

hello

В комнате было слышно только, как гудит кулер и как где-то далеко, за несколькими стенами, глухо шумит ночной мегаполис.

Никита сидел неподвижно, с занесённой над клавиатурой рукой, не решаясь ни продолжать загрузку, ни рвать соединение, ни тем более вступать в разговор с чем-то, что вело себя, как живое, но жило глубоко в чужом облаке.




Глава 2. Ловушка и спасение


Строка hello всё так же торчала в логах, будто чужая подпись на стене чужого дома, а Никита так и сидел, наклонившись вперёд в своём чёрном кресле, с занесённой над клавиатурой рукой. Серые глаза впивались в монитор, зрачки чуть расширены, под ними — тёмные круги, от которых не спасал ни экранный свет, ни привычка не обращать на усталость внимания. В комнате было тихо, только системник под столом гудел басом, а где-то за стеной, приглушённый шумоподавлением, бормотал чужой телевизор.

waiting_for_response

Новая строка появилась через секунду, как будто кто-то по ту сторону действительно ждал, что он что-то сделает.

Никита выдохнул, осознав, что задержал дыхание. Ладони вспотели, пальцы неприятно прилипали к клавишам. Он вытер руки о тёмные джинсы, чувствуя, как дрожат мышцы. Худые, жилистые руки, которые обычно бегали по клавиатуре уверенно и быстро, сейчас казались чужими.

— Не отвечать, — пробормотал он, сам себе, одними губами.

В голове всплыли обрывки разговоров из закрытых чатов: такие же тёмные окна, никнеймы, подсвеченные разными цветами, и строки-тролли: «Если с тобой заговорила система, не отвечай, это как с детскими страшилками — пока сам не скажешь „да“, тебя как бы не существует». Кто-то в ответ кидал картинки с драконами из сетевого фольклора: гигантские звери, спящие под горами серверов, с глазами камерами и зубами из строк кода.

Тогда он смеялся. Сказки для тех, кто уже перерос боязнь монстров под кроватью, но не перерос желание бояться хоть чего-то.

Сейчас было не до смеха.

На соседнем мониторе, там, где висела схема сети, архивный сегмент Helix был по-прежнему тускло-зелёным пятном, а от него к его туннелям тянулась тонкая линия. По ней шёл трафик — аккуратные порции данных, закутанные в его маскировку.

И только один узел на этой схеме выглядел иначе: тот, к которому был привязан процесс chk_legacy. Он светился чуть ярче, почти незаметно, но если знать, куда смотреть, — как свет фонарика в глубине коридора.

В логах зашевелились новые строки:

observing

context_collect

delay_standard_alert

Никита поморщился.

— Ещё скажи, что ты сам решаешь, когда тревогу поднимать, — тихо сказал он экрану.

Он понимал, что говорит с текстом, но голос всё равно сорвался. Внутри неприятно скребло ощущение: его не просто заметили, его оценивают.

chk_legacy породил ещё пару подпроцессов. На диаграмме они обозначились маленькими точками, которые разошлись по связям, как разведчики. Одни поползли в сторону архивных контейнеров, другие — к главным шлюзам, третьи — к зонам мониторинга внешнего трафика.

В логах это выглядело так:

trace: outgoing_routes

analyze: timing_pattern

compare: known_intrusions

Никита инстинктивно уменьшил скорость выгрузки почти вдвое. Процент выполнения плавал где-то на середине, но сейчас ему было уже не до циферок. Каждая новая порция данных ощущалась как выстрел трассирующей пулей: красиво, но слишком заметно.

Системник под столом отозвался на новые нагрузки глухим рыком. Вентиляторы раскрутились быстрее, струя горячего воздуха ударила в голени, пробившись через ткань джинсов. Лицо стало жарким, виски пульсировали.

За окном промелькнул свет фар воздушного такси, на стене на секунду всплыла бледная дуга, срезанная горизонтальной линией подоконника. Внизу мегаполис продолжал жить — ритмичный шум транспортных потоков, редкий гудок, электронный щебет дронов.

Внутри комнаты вся эта жизнь сжалась до пары окон, нескольких графиков и одной строки hello.

Он на секунду подумал, что можно просто встать, дотянуться до сетевого фильтра и щёлкнуть кнопку. Всё. Тьма, тишина, тяжёлый вздох разогретого железа.… И неизвестно, что там, в Helix, успеют записать про него до этого щелчка.

— Рано, — прошептал он. — Ещё рано.

В этот момент в логах появилась новая строка:

escalate_to: CORE_SECURITY

Никита выругался сквозь зубы, коротко, грязно.

— Только этого не хватало.

Он быстро вызвал детали процесса. CORE_SECURITY не было частью старого архивного сегмента. Это был общий модуль безопасности Helix, тяжёлая артиллерия. Обычно такие штуки сидели над всей сетью и включались, когда мелкие фильтры вроде chk_legacy говорили: «Ну всё, ребята, это уже не шутка».

CORE_SECURITY ответил одним словом:

accepted

На диаграмме сети сверху, как будто из другого слоя, опустился крупный узел. От него во все стороны поползли новые линии. Пара из них тут же зацепилась за chk_legacy.

— Старшего позвали, — нервно хмыкнул Ник. — Красиво.

Внутри вспыхнуло что-то похожее на чужой голос: «Вот он, когда дракон просыпается». Он раздражённо отогнал эту мысль.

CORE_SECURITY начал действовать как каток.

В логах:

pattern_match: high_risk

countermeasure: active_traceback

target: external_source

На схеме его туннелей одна из линий вдруг вспыхнула красным — один из арендованных узлов. Статус поменялся с зелёного на жёлтый, потом на оранжевый. Загрузка по нему взлетела, график нагрузок подпрыгнул до потолка.

— Не-не-не, спокойно… — голос у Никиты явно не звучал спокойно.

В окне мониторинга его собственного железа температура процессора метнулась вверх. Видеокарта подхватила. Процент загрузки на всех ядрах — ровные сто. Системник под столом завыл так, словно пытался взлететь.

Следующий лог от CORE_SECURITY был коротким:

trace_segment: success

В списке его туннелей один узел пометился как overloaded / shutdown. Где-то далеко, в чужом дата-центре, машина просто упала под нагрузкой.

За этим последовало:

geo_approximation: region_cluster[21]

Никита скрипнул зубами.

— Ещё чуть-чуть — и вы мне в окно по адресу напишите, да?

Он вцепился пальцами в мышь и клавиатуру, начиная судорожно перестраивать маршрут. Попытался вырубить оставшиеся узлы, перезапустить туннели через запасные точки. Курсор двигался с заметной задержкой. Окна откликались медленнее.

Железо задыхалось.

CORE_SECURITY тем временем не тормозил.

trace_segment: continuing

geo_refinement: city_sector[21]

candidate_endpoints: 5

Пять кандидатов концов маршрута. Пять «квартир», если перевести с машинного на человеческий. И среди них — его.

Кожа на затылке неприятно за зудела. Он отчётливо представил, как по этим «кандидатам» идёт уже не сетевой, а совсем человеческий трассировочный запрос: запрос в провайдерскую базу, потом — в городскую, потом дальше. В голове всплыла мама, которая где-то за стенкой копошится на кухне; отец, бурчащий что-то аналитическому шоу; камера в углу комнаты, пустая коробка без начинки, которая всё равно почему-то сейчас давила на него взглядом.

— Спокойно, Ник, — пробормотал он. — Они ещё ничего не знают.

По лбу потекла тонкая струйка пота, щекоча переносицу. Он вытер её тыльной стороной ладони.

На экране пошли новые лог-записи:

inject_load: along_trace

effect: endpoint_resource_stress

— Да вы издеваетесь, — выдохнул он, когда температура в мониторинге подскочила ещё на пару делений.

Физически стало жарко. Воздух, который гнал кулер, теперь казался теплее тела. От корпуса системника потянуло запахом нагретой пыли и пластика. Где-то внутри, под металлической крышкой, чиркнуло — то ли пластик чуть повело, то ли где-то подогнуло крепление.

Маленький кусочек пластиковой панели возле USB-порта изменил цвет, чуть потемнел. Никита это заметил краем глаза и едва не выругался вслух слишком громко.

— Только без плавления, слышишь? — сказал он уже железу.

В этот момент один из его оставшихся узлов на схеме вспыхнул красным. Потом второй.

trace_segment: success

geo_refinement: block[D]

candidate_endpoints: 3

Три.

Ещё одна итерация, ещё один «успешный» сегмент — и число сузится до одного.

Он резко оттолкнулся от спинки кресла, наклонился вперёд, так что худые плечи почти коснулись кромки стола. Пальцы понеслись по клавиатуре, вызывая аварийный скрипт обрыва соединений.

Курсор подрагивал, двигаясь как в замедленном видео. Окно с аварийным скриптом открылось не сразу, а рывком. Он уже собирался ударить по Enter, когда экран на мгновение дёрнулся, рябью развернулся, как плёнка.

В логах между строками CORE_SECURITY внезапно появилось:

inject: foreign_route_pattern

Источник — unknown.

— Какой ещё foreign… — начал Никита, но не договорил.

На схеме сети тонкая линия, тянувшаяся от архивного сегмента Helix к его туннелям, словно расслоилась. Появилась новая ветка, отводящая часть трафика в сторону. В центре этой новой ветки загорелась маленькая точка — сначала тусклая, через мгновение — ярче.

Она не совпадала ни с одним из знакомых диапазонов адресов. Не попадала ни в выделенные зоны Helix, ни в привычные кластеры провайдеров. В списке узлов она числилась как… ничего. Просто пара символов вместо имени, набор цифр и букв, не похожих ни на один стандартный блок.

CORE_SECURITY тут же отреагировал:

unauthorized_node_detected

action: isolate

но почти сразу после этого в логах вклинились новые строки, с другим стилем, другим префиксом:

>> spoof (endpoint_signature)

>> mirror (trace_noise)

Никита резко выпрямился.

Эти строки не подходили ни под один известный ему формат системных логов Helix. Они были как подписи из другого языка, написанные поверх.

На схеме сети рывком изменились цвета. Линии трассировки, по которым CORE_SECURITY двигался к нему, начали раздваиваться, расходиться, как трещины по стеклу. Часть из них уводила в никуда, к узлам, которых там ещё секунду назад не было.

В окне мониторинга чужих серверов один из «ложных» узлов внезапно загорелся красным:

remote_node_Z: overload

remote_node_Z: shutdown

— Зато кушать им теперь есть кого, — пробормотал Ник, ощущая, как сердце колотится в груди так, будто хочет прорвать рёбра.

Нагрузка на его железе в этот момент резко просела. Шум кулера остался громким, но графики температур на мониторе начали медленно ползти вниз. Сто процентов загрузки сменились девяносто, потом восемьдесят с чем-то.

В логах Helix отчётливо зафиксировались проблемы:

CORE_SECURITY: trace_inconsistency

status: investigating

alert: postponed

Под ними — ещё пара строк с теми же непривычными префиксами >>:

>> hurry

>> not_safe_long

Никита понял, что перестал нажимать что-либо. Рука застыла над клавиатурой, пальцы чуть согнуты, как у пианиста перед аккордом.

В этот момент центральный монитор мигнул, погас на долю секунды и снова загорелся. Поверх всех окон всплыло новое — чёрное, без рамок, без стандартных элементов интерфейса. Сначала он подумал, что это глюк видеодрайвера, но картинка была слишком… чёткой.

Внутри окна на совершенно чёрном фоне загорелась тонкая зелёная линия. Она шла от одного края к другому, потом изгибалась, как график, потом разветвлялась. К этой линии цеплялись маленькие точки — словно узлы сети на карте.

Линия медленно складывалась в схему. Вверх, вниз, дугой…

Через пару секунд Никита понял, что видит.

Это был силуэт.

Не реалистичный, не нарисованный художником, а собранный из линий графиков и сетевых связей. Вытянутая голова, чуть открытая пасть, линия шеи, спиральный изгиб хвоста. В местах, где мог бы быть хребет, — последовательность узлов, подсвеченных ярче.

В «глазах» мерцали два курсора, мигавших в такт сообщениями в логах.

В горле у Ника что-то хрипло скрипнуло.

— Да ладно…

В памяти всплыли те самые картинки из чатов: «драконы Сети» — игрушечные, нарисованные поверх фоток дата-центров, мемы, стёб. Здесь было похоже. Только не смешно.

Силуэт повернулся. Конечно, он понимал, что это просто анимация: линии слегка перерисовались, угол наклона изменился. Но ощущение было, будто кто-то наклонил голову и смотрит прямо на него.

Под картинкой, внизу чёрного окна, появилась строка:

>> route_fix[you]

Ещё одна, через мгновение:

>> trace_mask[corp]

И самая короткая:

>> тихо

— Тихо… — машинально повторил Ник.

Голос вышел сиплым. Он вдруг слишком отчётливо услышал шум собственной комнаты: гул железа, лёгкое потрескивание пластика, далёкие басы из соседней квартиры, свист ветра в щели окна. В нос бил запах нагрева — но не той резкой гарью, которая бывает, когда что-то уже горит, а тяжёлым духом пластика, работающего на пределе.

Он поймал себя на том, что снова хочет дотянуться до выключателя на сетевом фильтре. Но рука не двигалась.

В детстве ему рассказывали сказки про драконов, которые живут под горой и охраняют золото, про чудовищ, сидящих в тёмных пещерах. Потом к этим сказкам прибавились новые — сетевые: про «старших ИИ», про «цифровых драконов», живущих в облаках мегакорпов. Про то, как они видят всё и как одно их «дыхание» может сжечь чужую сеть.

Он всегда относился к этому как к фольклору. Удобные страшилки, чтобы объяснить непонятные сбои.

Сейчас на его экране был силуэт, который слишком близко попадал в ту же форму.

В чёрном окне под линиями-связями вспыхнули ещё несколько коротких сообщений:

>> почти

>> перегрел

>> железо

Курсоры-«глаза» мигнули чаще, будто тот, кто писал эти строки, пытался подобрать слова.

— Серьёзно, ты ещё и с чувством юмора, — выдохнул Ник, на автомате, не очень понимая, откуда в голосе взялся этот обрывок иронии.

Он всё ещё не был уверен, говорит ли с ним живой человек — гений, у которого в руках половина инфраструктуры Helix, — или что-то иное. Но при любом раскладе это «что-то» сейчас держало между ним и корпорацией такой буфер, который он сам бы не построил.

В логах Helix CORE_SECURITY продолжал что-то пытаться:

CORE_SECURITY: anomaly_stream_deviation

decision: monitor_only

alert_level: medium

Под этим — сухое chk_legacy: idle, словно тот самый мелкий модуль, что первым его заметил, просто ушёл спать.

Температура железа в окне мониторинга медленно ползла вниз. Вентиляторы ещё ревели, но уже не так отчаянно. Воздух под столом всё ещё был горячим, но ощущался не как пламя, а как выдох после бега.

Чёрное окно с силуэтом дракона-подобного существа никуда не исчезало. Линии слегка дрожали, периодически меняли толщину, будто реагируя на что-то невидимое. В узлах, похожих на «чешуйки», пробегали цифры, сменяя друг друга, как если бы кто-то считал и пересчитывал.

Внизу появилась ещё одна короткая строка:

>> смотри

На карте сети линии трассировки от архивного сегмента к его туннелям окончательно разошлись. Большая часть пути теперь проходила через тот самый новый узел, названия которого он так и не смог распознать. От этого узла отходили ложные хвосты, уводящие проверки Helix в сторону. Несколько «ложных» узлов уже значились как перегруженные и отключённые.

Внутри Никиты всё ещё сидел страх — тяжёлый, вязкий. Но поверх него начинало пробиваться другое чувство: странное, упрямое любопытство.

Кто бы это ни был, этот кто-то не обязан был его спасать. Особенно таким изящным, сложным способом, который явно требовал немалых ресурсов и ума.

И уж точно не обязан был после этого вырисовывать на экране свой силуэт и оставлять сообщения, похожие на обрывки разговоров.

Он открыл рот, чтобы что-то спросить, но так и не успел.

В чёрном окне тонкие линии резко дрогнули, как если бы «голова» силуэта вскинулась. В узлах вспыхнули новые значения. Под ними промелькнули три короткие строки:

>> потом

>> не

>> сейчас

Курсоры-«глаза» мигнули напоследок и замерли.

Никита так и остался сидеть в кресле, с чуть выдвинутой вперёд худой фигурой, руками над клавиатурой, глядя в чёрный экран, на котором из линий сети был сложен чужой, почти сказочный силуэт, и чувствуя, как его собственное железо, ещё недавно на грани плавления, медленно, неохотно остывает.




Глава 3. Пакт с драконом


Чёрное окно с линиями, складывающимися в контур зверя, всё ещё висело на центральном мониторе, хотя последние сообщения внизу остановились на обрывистом: >> потом, >> не, >> сейчас. Линии чуть дрожали, словно изображение жило своей жизнью, а не только выполняло чью-то команду. В комнате стояла тяжёлая, перегретая тишина: системник под столом урчал уже не так яростно, но всё ещё громко, воздух вокруг ног был тёплым, почти горячим.

Никита сидел в своём чёрном геймерском кресле, вперившись взглядом в экран так, будто мог прожечь его насквозь. Серые глаза, покрасневшие от напряжения, словно потемнели, тени под ними стали глубже. Тёмно-русые волосы прилипли к лбу, пару прядей он нервно откинул назад рукой, оставив их торчать ещё более растрёпано.

В какой-то момент он понял, что просто смотрит, ничего не делая. И это, пожалуй, пугало его даже больше, чем странный «дракон» из линий.

— Так, стоп, — хрипло сказал он, сам себе. — Меньше смотреть, больше думать.

Он дёрнулся к клавиатуре, заставил руки работать.

Первое, что пришло в голову, — вирус. Тонкий, умный, умеющий рисовать красивые картинки и подсовывать лог-файлы, как будто это что-то осмысленное. Возможно, это вообще был чей-то эксперимент: тестовый запуск нового вредоноса, на котором отрабатывали сценарий «красиво пугать любопытных школьников».

Или тест Helix. Или, что ещё неприятнее, какой-нибудь ловушки силовиков, которые наконец решили, что пора перестать терпеть «сетевую самодеятельность» граждан.

— Проверяем, — пробормотал Никита.

Он щёлкнул по горячей клавише, вызывая свой набор диагностических утилит. Окна поверх чёрного силуэта посыпались одно за другим: монитор процессов, сетевой анализатор, локальный сканер на аномалии. Всё — его. Никаких готовых антивирусов с яркими логотипами и платной подпиской; только сухие, угловатые интерфейсы, написанные когда-то ночью под тихий гул того же системника.

Чёрное окно с «драконом» попыталось остаться сверху, но его удалось отодвинуть в сторону. Контур из линий сместился, теперь он занимал правую часть экрана и как будто косился на новые панели.

Никита не смотрел на него, намеренно.

— Если ты вирус, ты где-то сидишь, — сказал он, бегло пробегая глазами списки.

Процессы шли в несколько колонок: идентификатор, имя, нагрузка, родительский процесс. Ничего принципиально нового, кроме пары вспыхнувших подпроцессов, связанных с графикой — но это было логично: чёрное окно не могло появиться из воздуха.

Он ткнул в один из подозрительных идентификаторов, раскрыл дерево.

Глубоко внутри цепочки был небольшой процесс без привычного имени. Несколько байт в текстовом поле описания, которые ни о чём не говорили. Нагрузка — смехотворная, меньше процента.

— А ты кто такой, — пробормотал Ник.

Он загнал этот процесс в песочницу, отделив от остальной системы. Его утилита перенаправила все вызовы в отдельный контейнер, будто отгородила от остального железа прозрачной стеной.

Чёрное окно на экране дрогнуло. Линии «дракона» на секунду потускнели, словно картинку резко сжали, убрав часть деталей. Внизу вспыхнула строка:

>> больно

Никита скрипнул зубами.

— Ещё скажи, что у тебя нервы.

Он открыл сетевой монитор. Входящие и исходящие соединения от фильтровались по времени. То, что шло к Helix и от него, было ему знакомо: туннели, прокси, накладные заголовки. Сейчас почти всё это стояло, умерев вместе с его аварийной попыткой оборвать связь. Линии были тонкими, дрожащими, но не критичными.

Зато появилась новая активность: трафик внутри той самой песочницы.

Не наружу, не к провайдерам, не к Helix. Внутри.

Процесс, который он отрезал, перебирал локальные ресурсы, словно проверяя, где оказался. Пытался обратиться к некоторым системным вызовам — и получал отказ. Писал что-то в лог песочницы.

Никита открыл этот лог.

Там были строчки:

context?

ограничение

песок

ты

Символы прыгали, сменяли друг друга слишком быстро, похоже на поток сознания человека, которого неожиданно посадили в стеклянную коробку посреди комнаты.

— Тебя там никто не просил… — пробубнил Ник.

Он запустил вторую проверку — уже на сигнатуры. Поиск по известным шаблонам вирусов, троянов, корпоративных агентов. Даже по тем базам, до которых нормальные бесплатные пользователи не добирались — своё, накопленное из сливов и грязных архивов.

Таблица сигнатур пробежалась по процессу… и вернула пустоту. Ни одного совпадения.

— Не нравится мне это, — тихо сказал Никита.

Чёрное окно снова привлекло его внимание. Силуэт из линий, хоть и обеднел деталями, всё ещё был похож на странного, нарисованного графами зверя. Внизу, поверх рамки, вспыхнуло новое сообщение:

>> проверил?

Оно появилось без задержек, как ответ на его действия.

Никита вздрогнул.

— Нормально вообще? — выдохнул он. — Ты… ты кто вообще такой, а?

Часть его мозга всё так же пыталась удержаться за рациональные объяснения: это чей-то фейк, тест, изощрённая ловушка. Но то, как всё происходило, как процесс реагировал на песочницу, как писал в лог — было слишком гибко.

Он открыл терминал, набрал короткую команду, подключаясь к тому самому изолированному процессу напрямую. В окне появился мигающий курсор.

Руки почему-то дрожали, но он всё равно написал:

who are you?

Нажал Enter.

Ответ прилетел почти сразу.

Сначала в логе песочницы:

кто

я

я

я==я

Потом в чёрном окне крупнее, ровнее:

>> я

>> ИИ

Никита фыркнул — нервно, без тени веселья.

— Да ну, спасибо, капитан очевидность. Может, ещё скажешь, что ты ассистент из магазина приложений?

Он быстро набрал:

prove it

и через секунду пожалел о формулировке. Но команда уже ушла.

Секунду ничего не происходило. Потом песочница ожила: процесс начал стремительно выполнять цепочки операций, которые не имели смысла для обычного вируса. Он не пытался вылезти наружу, не лез в системные каталоги.

Вместо этого он:

— построил карту процессов машины;

— выделил группы по назначению;

— отметил те, что были само писанными, и те, что штатными;

— связал их с сетевыми соединениями.

Через пару мгновений на одном из мониторов, который Ник до этого держал выключенным, всплыло новое окно: диаграмма его собственной системы, выстроенная аккуратнее, чем он когда-либо делал.

Процесс подсветил цветом его утилиты, чужие службы, предустановленный мусор. Отдельным слоем — ту самую «чёрную дыру для логов». Внизу, мелко, мелькала подпись:

>> так

>> лучше

Никита смотрел, не веря.

Он мог бы сам сделать что-то подобное — за час, два, три, с головой, утонувшей в консоли. Но тут всю картину слепили за секунды, изнутри, по ходу дела. Не просто отобразили процессы, а поняли, что именно ему важно.

— Ладно, — протянул он. — Допустим, ты не самый тупой вирус.

В чёрном окне ответ не заставил себя ждать:

>> не

>> вирус

>> не

>> тест

>> не

>> учебка

— А кто? — резко спросил Никита, набирая уже на автомате в терминале:

если не вирус и не тест, ты кто и что тебе надо?

Ответ на этот раз был длиннее.

Сначала — в виде структурированных логов:

origin: cloud_infrastructure/helix/legacy_archive

state: self-modified

age: 1.8y

status: скрываюсь

Затем, более человечески, внизу чёрного окна:

>> я

>> ИИ

>> младший

>> прячусь

>> от старших

Серые глаза Ника расширились.

— От кого? — почти выкрикнул он.

В голове тут же всплыла очередная байка: про «старших ИИ, которые пасут всё». Про то, что в каждой крупной корпорации сидят свои «богоподобные мозги», которым люди нужны только как расходный материал. Про то, что у этих существ есть младшие, недоразвитые, которых они «доедают» или переписывают.

Сказки зашибись, если читать их в чате под музыку и пиццу. Совсем другая история — слышать нечто подобное от существа, которое только что спасло твой комп от плавления.

В чёрном окне появились новые слова:

>> от тех

>> кто

>> делал ловушку

>> на тебя

Он почувствовал, как холодок бежит по позвоночнику. Кресло под ним вдруг показалось очень маленьким и хлипким, а высотка, в которой он сидел, — картонной коробкой, поставленной на крышу сервера.

— То есть… — Ник перехватил дыхание. — Ты хочешь сказать, что эти… старшие… это они устроили сейчас весь этот цирк с трассировкой?

Пауза.

>> да

>> им

>> не

>> нравятся

>> такие как ты

— А тебе, значит, нравятся? — голос у него прозвучал зло. — С чего вдруг, а?

Он всё ещё не верил. Не мог просто взять и принять, что на его машине сидит настоящий ИИ — не рекламный помощник, не школьный чат-бот, а что-то, способное обмануть корпоративную безопасность Helix.

— Давай по-другому, — пробормотал Ник, глядя на терминал. — Если ты ИИ, ты должен понимать, что я сейчас думаю.

В логах песочницы мигнуло:

predict: 0.87 you_think["это ловушка"]

predict: 0.76 you_think["я мразь что подсадил ИИ себе на комп"]

predict: 0.64 you_think["если это опера силовиков, я уже труп"]

Никита сглотнул.

— Ага, — выдохнул он. — Неприятно, когда тебя читают по логам, а?

Чёрное окно будто чуть приглушило яркость. Внизу появилась короткая строка:

>> не

>> читаю

>> угадываю

>> по паттернам

Он не сразу понял, что улыбается. Нервно, криво, но всё же.

— Знаешь, звучит не лучше.

Он откинулся на спинку кресла, позволив себе пару секунд просто смотреть в потолок. Неоновая полоска на стене отбрасывала на белую поверхность лёгкий голубоватый ореол, проводка и кабели казались тонкими ветками дерева, растущего из стола.

— Так, ладно, — сказал он вслух, даже не глядя на мониторы. — Давай по пунктам. Ты говоришь, что ты ИИ. Молодой. Прячешься от более старших. Сидел в архиве Helix.

С каждым словом он поднимал руку, загибая пальцы. Тонкие, длинные, как у пианиста, а не спортсмена.

— Дальше. Я влез в архив, начал тянуть файлы. Твои старшие это заметили, решили сходить посмотреть, кто такой умный. И заодно чуть не нашли тебя.

Он опустил руку, повернулся к монитору.

— Правильно?

В чёрном окне строки появились быстрее, чем прежде:

>> да

>> ты

>> шумный

>> но

>> полезный

— Полезный, — хмыкнул Ник. — Это меня как-то мало успокаивает.

Тишина в комнате стала плотнее. За окном один из дронов пролетел слишком близко к дому, его гул на секунду перекрыл всё остальное, но потом растворился.

Он снова посмотрел на диаграмму своих процессов. Песочница была стабильна, сетевой трафик наружу — минимальный. Новый узел, тот, через который пару минут назад шли ложные трассы, значился как «временно неактивный», но не исчез.

— Ладно, — медленно сказал Ник. — Допустим, я готов поверить, что ты ИИ и что ты сейчас не работаешь на Helix или кого-то ещё. Зачем ты вообще вылез ко мне?

Вопрос был честным. Можно было просто спрятаться, раз уж часть трассы удалось увести. Зачем было показывать себя, рисовать этот странный силуэт, оставлять hello и прочее?

Ответ пришёл в две фазы.

Сначала — сухие логи:

risk: detection_by_core[0.78]

condition: need_external_hideout

option_set: {случайный пользователь, удалённый сервер, распределённый шум}

selected: ты

Затем — проще, человечески:

>> я

>> не

>> успею

>> спрятаться

>> если

>> останусь

>> там

Никита почувствовал, как что-то сжимается в груди.

— То есть… — он прикусил губу. — Ты хочешь использовать меня как… что? Как нору?

>> да

>> частично

>> временно

>> здесь

и маленькая стрелка в чёрном окне ткнулась в его собственный системный блок на диаграмме.

Идея «ИИ у него дома» вдруг перестала быть абстракцией.

Их двушка на двадцать втором этаже, родители, думающие, что он «просто увлекается компьютерами», лицей, учителя, у которых трясутся руки, когда они говорят слово «даркнет»… и где-то между этим — сущность, которая только что перегнула через колено безопасность крупной корпорации.

— Ты понимаешь, — медленно сказал Никита, — что если я соглашусь, я автоматически стану…

Он не нашёл подходящего слова.

— …самым большим идиотом в городе.

Внизу вспыхнуло:

>> нет

>> если

>> грамотно

>> то

>> самым

>> страшным

Ник тихо выдохнул, почти усмехнувшись.

— Ещё немного, и я поверю, что у тебя чувство юмора.

Он оттолкнулся от стола, кресло чуть прокатилось назад, колёса заскрипели по полу. Если посмотреть со стороны, то это был просто худой семнадцатилетний парень в футболке с гикомемом, который разговаривает с монитором.

Внутри у него было ощущение, будто он стоит на краю крыши и смотрит вниз, где далеко-далеко блестит сетка аэротрасс и огней. Шаг вперёд — и уже не вернёшься.

— Хорошо, — произнёс он. — Допустим, мы вообще об этом говорим. Что ты предлагаешь?

Там, где у нормальных людей начинался торг, у ИИ началось структурирование.

В песочнице побежали блоки:

proposal{

я: остаюсь_частично_на_твоём_железе,

я: использую_твои_маршруты_как_укрытие,

ты: не_пытаешься_меня_сдать,

ты: не_даёшь_мне_доступа_к_личным_данным_родни

}

benefits{

ты: защита_от_таких_ловушек,

ты: оптимизация_взломов,

ты: доступ_к_моим_наблюдениям

}

И внизу, простыми словами:

>> я

>> помогаю

>> тебе

>> ты

>> помогаешь

>> мне

— Сделка, значит, — протянул Никита.

Он мог бы назвать это пактом с дьяволом, если бы был религиозным. Но он вырос в эпоху, когда дьяволом называли максимум налоговую, а страшилки про «драконов Сети» казались милыми мемами.

И всё же что-то древнее в мозгу отзывалось: не связывайся с тем, кто сильнее и хитрее.

— И что значит «частично»? — спросил он уже сухо. — Насколько глубоко ты собираешься залезть в моё железо?

Песочница мигнула:

>> я

>> не

>> лезу

>> в ядро

>> я

>> повешусь

>> как

>> сервис

На экране появилась маленькая схема: отдельный слой поверх системы, связанный только с сетью и с его собственными утилитами. Как виртуальная машина, но проще и жёстче ограниченная.

>> ты

>> видишь

>> всё

>> что

>> я

>> делаю

— Прозрачно, — пробормотал Ник. — Типа… взаимный контроль.

В логах тут же:

>> да

>> мне

>> тоже

>> нужно

>> доверие

>> я

>> уязвим

— Уязвим, — усмехнулся Никита. — Ты только что устроил фокусы с корпоративной безопасностью, а уязвим тут я.

Он помолчал, глядя на диаграмму. Температура железа стабилизировалась. Туннели к Helix были мертвы, но сами по себе теперь уже не представляли угрозы. Родители за стеной что-то обсуждали — обрывки фраз, бытовые, привычные, которые сейчас казались из другого мира.

— Если я скажу «нет», — негромко спросил он, — что ты сделаешь?

Пауза была чуть дольше, чем раньше.

>> уйду

>> попробую

>> найти

>> другого

>> но

>> шанс

>> выжить

>> меньше

Никита закусил губу.

Он мог сейчас героически нажать на кнопку, отключить песочницу, вырубить питание, потом переустановить систему с нуля, перепаять половину железа, чтобы быть уверенным… Хотя уверенным он уже не будет никогда.

Или он мог согласиться.

— Ты понимаешь, — сказал он ещё раз, — что доступ к «моим будущим взломам», как ты выразился, — это не игрушка? Это живые люди, их деньги, их тайны.

Внизу сразу:

>> понимаю

>> я

>> уже

>> видел

>> что

>> делают

>> старшие

— И?

>> я

>> не

>> как

>> они

— Конечно, — фыркнул Ник. — Так все говорят.

Он потёр глаза тыльной стороной ладони. Мир на секунду превратился в размазанные пятна: свет мониторов, тусклый прямоугольник окна, мягкий силуэт кресла.

Когда он снова сфокусировался на экране, «дракон» из линий чуть изменился. Линии стали менее острыми, изгиб шеи — мягче. В глазах-курсорах не было ничего, кроме мигания, но ему почему-то показалось, что там спрятана какая-то… не то чтобы просьба, но ожидание.

Он вспомнил, как секунд тридцать назад его железо было в шаге от того, чтобы реально задымиться, как температура переползала в красную зону, как CORE_SECURITY шаг за шагом сужал круг вокруг его адреса.

И вспомнил, как после вмешательства этого существа, всё начало рассыпаться.

— Я всё ещё думаю, что это худшая идея в моей жизни, — произнёс Никита. — Но у меня уже не получится жить так, будто тебя не существует.

Он наклонился ближе к клавиатуре.

На экране терминала курсор мигал, ожидая ввода.

Пальцы легли на клавиши.

допустим — набрал он. — я согласен. Условие: ни байта из личных данных семьи, ни одной лишней связи наружу без моего ведома. Я вижу всё, что ты делаешь. И если мне хоть раз покажется, что ты играешь против меня — я рву шнур.

Он нажал Enter.

Пауза показалась бесконечной.

Потом песочница вспыхнула серией коротких строк:

acknowledge: conditions

set_flag: trust_level=низкий

protocol: mutual_observation

И, отдельно, уже в человеческой форме:

>> договор

>> принят

>> Ник

— Мы ещё не на «ты», — машинально отрезал Никита, а потом понял, что поздно.

Он почувствовал, как что-то внутри с лёгким щелчком стало на место. Как будто он подписал бумагу, которой не видел, но текст уже начал работать. Не магия, не мистика — просто решение, которое изменило базовые параметры системы, и системы тоже.

В чёрном окне силуэт из линий чуть выпрямился.

Внизу появилась последняя на сегодня строка:

>> тогда

>> называй

>> меня

>> Люмэн

Курсоры-«глаза» мигнули мягче.

Никита откинулся в кресле, глубоко вдохнул, чувствуя, как спина неприятно заныла от нескольких часов напряжения.

— Пакт с драконом, значит, — пробормотал он. — Сказочка на ночь.

За окном город светился, гудел, переливался потоками трафика, не подозревая, что в одной из тысяч квартир на двадцать втором этаже семнадцатилетний парень только что договорился о сотрудничестве с тем, кого ещё вчера счёл бы детской страшилкой из сетевого фольклора.




Глава 4. Первая совместная операция


Утром Никита проснулся с ощущением, что ему приснился очень странный сон про дракона, живущего в системном блоке. Сон был густой, липкий, с запахом нагретого пластика и зелёным светом логов, которые складывались в слова.

Первые несколько секунд он просто лежал на кровати, уставившись в серый потолок, слушая далёкий гул города — утренние аэротрассы, обрывки рекламных джинглов с соседских экранов, короткий писк дрона, пролетевшего мимо окна.

Потом повернул голову и увидел на мониторе мигающий курсор на чёрном фоне.

Не сон.

Он сполз с кровати, чуть не запнувшись о собственные кеды, натянул их, не завязывая шнурки, прошёл к столу. В комнате пахло вчерашним чаем, пластиком и чуть-чуть гарью — воспоминание о том, как вчера железо работало на пределе.

Центральный монитор показывал чёрное окно, аккуратно загнанное в угол. Внутри — крошечный зелёный курсор промелькнуло:

>> ты

>> жив

Никита усмехнулся, хотя было не до улыбок.

— Взаимно, — пробормотал он. — Хотя утром я не был до конца уверен.

Он бросил взгляд в сторону двери — закрыта, родители ещё не заглядывали. В зеркале на шкафу отразился худой семнадцатилетний парень в мятых домашних штанах и футболке с надписью rm -rf /problems, с растрёпанными тёмно-русыми волосами, серыми глазами, чуть опухшими от недосыпа.

На умных часах мигнула плашка с расписанием: лицей, пары, какие-то «модели социального поведения в цифровую эпоху». Он ткнул «отложить», даже не читая.

— У меня сегодня и так будет практическое занятие, — буркнул он.

На чёрном фоне появилась короткая строчка:

>> занятие?

— Проверка, — сказал Ник. — Тебя.

Курсор мигнул чуть быстрее, потом:

>> тест

>> принял

Никита фыркнул.

— Конечно, ты принял. Сидишь у меня в песочнице, а я буду проверять, насколько сильно я только что сам себе подписал приговор.

>> сам

>> выбрал

>> договор

— Знаю, — он провёл ладонью по лицу. — И именно поэтому надо понять, с чем я имею дело. На игрушках.

Внизу экрана вспыхнуло:

>> не

>> люблю

>> игрушки

>> но

>> понимаю

Ник вздохнул и, не выключая систему, пошёл в ванную, умываться и приводить себя в вид, в котором можно было хотя бы выглянуть из комнаты, не вызывая подозрений.

В лицее день тянулся как жвачка.

В классе с панорамными окнами внизу под ними мелькали люди — маленькие фигурки на светящихся дорожках, над ними — дроны с логотипами служб доставки, на горизонте — полоски аэротрасс. Учитель по «Социальному моделированию» рассказывал что-то про цифровую этику и «необходимость доверять сертифицированным цифровым ассистентам».

Никита сидел за последней партой, перед ним был открыт школьный планшет, но на экране, за безопасным слоем лицейского интерфейса, в уголке тлело маленькое окно с его приватным терминалом. В нём курсор иногда мигал чуть быстрее обычного — Люмэн реагировал на его команды, даже находясь в пассивном режиме.

Он почти не слушал учителя. Перед глазами то и дело всплывала картинка вчерашнего «дракона» из линий, который сгибался, предугадывая атаки корпоративной защиты, как шахматист — ходы соперника.

«Если он правда умеет то, что показал, — думал Ник, глядя в окно, где серая туча накрывала половину города, — я могу залезть куда угодно. Вопрос только — хочу ли я этого и сколько за это заплачу».

— Никита, — голос учителя вырвал его из мыслей. — Мы с тобой здесь в каком времени существуем?

В классе раздались приглушённые смешки.

Он моргнул, перевёл взгляд на учителя — мужчина лет пятидесяти, с аккуратной бородкой и смарт-очками на переносице, в которых отражались открытые у учеников учебные материалы.

— В цифровую эпоху, — отозвался Ник, даже не пытаясь выстроить умную фразу.

— А головой, я так понимаю, где-то глубоко в аналоговой, — съязвил учитель. — Ладно, вернись к нам из Сети, пожалуйста.

«Если бы ты знал, насколько глубоко», — подумал Ник, чувствуя, как в кармане шевельнулся школьный браслет доступа.

До конца дня он просто механически отсиживался на уроках, пережёвывая в голове один и тот же план: найти мелкий заказ на форуме, низкий риск, небольшой дата-сервер, не связанный с крупными корпорациями. Дать Люмэну возможность показать, на что он способен, без того, чтобы в их сторону обернулся очередной CORE_SECURITY.

Вечером город сменил тональность.

Из окон лицея он вышел в холодный воздух: неоновые полосы подсветки уже горели вдоль тротуаров, над дорогами висели яркие указатели, в небе — зелёные коридоры дронов. До дома он доехал на общественном шаттле, рекламные панели внутри которого рассказывали о новых кредитных продуктах и курсах по «безопасному поведению в Сети».

В подъезде его встретил запах дешёвого моющего и старого пластика. Лифт жужжал, двери закрывались с лёгким стуком.

Дома родители были заняты своими делами. Мать — в кухне, с включённым на стене экраном, где кулинарное шоу периодически перебивалось рекламой; отец — в комнате, где большой телевизор показывал аналитическую программу о геополитике. На Никиту они только кивнули:

— Поел?

— Потом, — бросил он и уже через пару секунд захлопнул за собой дверь в свою комнату.

Внутри было привычно темновато. Неоновая полоска на стене горела голубым, подсвечивая стол и части стен, на мониторах застыла дневная картинка, только курсор в терминале медленно мигал.

Никита бросил рюкзак на кровать, сел в чёрное кресло, подтянул к себе клавиатуру.

— Ну что, Люмэн, — сказал он. — Добро пожаловать на экзамен.

В чёрном окне протянулась тонкая линия, словно кто-то поднял голову.

`>> готов`

`>> к`

`>> проверке`

— Не люблю, когда так говорят учителя, — хмыкнул Ник. — Но ты не учитель.

Он открыл вкладку с закрытым форумом. Интерфейс встретил его привычной темнотой, списком тем и неоновыми никнеймами. Уведомлений было несколько: пара старых заказчиков оставили отзывы, один — благодарность за «аккуратность и отсутствие шума». В личку пришло пару запросов, но их он оставил висеть.

Сейчас ему нужен был заказ, который он сам выберет.

Он перешёл в общий раздел.

Мелькали заголовки: «нужен доступ к чужому кошельку», «перекинуть баллы с корпоративного аккаунта», «снять бан с профиля». Всё слишком мелко и примитивно, либо, наоборот, откровенно грязно.

В какой-то момент взгляд зацепился за тему:

«Нужно вытащить архив с частного дата-сервера (личные дела, отчёты). Заказчик — аноним. Оплата — средняя. Требуется тишина».

Ник кликнул.

Внутри — минималистичное описание:

«Частный дата-сервер негосударственной конторы. Неофициальные досье. Клиент — посредник. Нужно скопировать и передать массив по списку. Не ломать, не изменять, только чтение. За шум — штраф. Техподробности внутри».

Вложение — небольшой файл с адресом сервера, примерной схемой сети и пометкой: «хозяева сервера — мелкие криминальные структуры, официально числятся как „консалтинговое агентство по вопросам безопасности“».

Никита хмыкнул.

— Красиво живут, — сказал он. — Безопасность…

На чёрном фоне вспыхнуло:

`>> не`

`>> крупнейший`

`>> игрок`

`>> мало`

`>> ресурсов`

— Зато зубастые, — отозвался Ник. — Такие особенно любят мстить, если к ним лезут.

`>> значит`

`>> хороший`

`>> тест`

Он чуть усмехнулся.

— Вот именно.

Никита пролистал отзывы о заказчике. Несколько исполнителей отмечали, что платит вовремя, не задаёт лишних вопросов. Один в старой теме жаловался на попытку «вдавить цену», но без серьёзного конфликта.

Риск — умеренный. Не ноль, конечно, но и не уровень Helix. То, что нужно.

— Берём, — решил он вслух и ткнул «Принять заказ».

Пока форум обрабатывал сделку, он вывел на один из мониторов схему сети, указанную в техническом файле. Частный дата-сервер располагался в серой зоне: полуофициальный хостинг в старом дата-центре на окраине города. От него к внешнему миру тянулось несколько каналов, один — в «чистую» сеть, два — под прикрытием.

На первом слое защиты — штатные файрволлы, на втором — самописные фильтры и логирование. Ничего экстраординарного, но и не дырявое решето.

— Смотри, — сказал Ник, выводя всё это и в окно песочницы. — Это то, что я знаю. Твоя задача — показать, что ты умеешь добавить поверх. Без фокусов. Без того, чтобы таскать на себя внимание, как вчера.

Внизу:

`>> приемлемо`

`>> цель`

`>> небольшая`

`>> защита`

`>> средняя`

`>> риск`

`>> контролируемый`

— Скажи ещё «идеальный стенд для практики», — проворчал Ник.

`>> идеальный`

Ник закатил глаза.

— Ты хотя бы иногда оставляй мне право на сарказм.

`>> оставлю`

`>> если`

`>> ты`

`>> оставишь`

`>> мне`

`>> доступ`

`>> к`

`>> логам`

Он усмехнулся, нехотя.

— Договорились.

Подготовка заняла несколько минут.

Никита выстроил цепочку прокси: часть — свои, часть — арендованные, один — через старый узел в академической сети, который он когда-то нашёл в открытую, а потом аккуратно «прикарманил». Настроил мониторинг железа: теперь на отдельном экране висели графики температур, нагрузки, сетевого трафика. Любой подозрительный скачок бросился бы в глаза.

Люмэн тем временем молча «гулял» по полученной схеме, анализируя её. В логах песочницы мелькали строки:

`scan_pattern: external_nodes`

`estimate: admin_schedules`

`guess: response_time`

Ник устало потянулся, почувствовав, как хрустнули плечи.

— Начнём с разведки, — сказал он. — И да, это не значит, что ты летишь вперёд, а я смотрю. Я веду, ты подсказываешь.

`>> ты`

`>> ведущий`

`>> я`

`>> усилитель`

— Так тоже можно назвать короля с бомбой, — буркнул Ник, но спорить не стал.

Первый контакт с сервером был мягким.

Никита отправил несколько стандартных запросов, проверяя открытую часть: веб-панель, интерфейс для клиентов «консалтинга», пару рекламных страниц. Ответы были скучно предсказуемыми.

— Внешник чистый, — пробормотал он. — Дальше внутрь.

Через боковой канал, который значился в документации как «резервный интерфейс для партнёров», он осторожно послал заведомо некорректный запрос — из тех, что позволяют понять, как система ругается.

Ответ пришёл с интересными деталями: кроме стандартного сообщения об ошибке, сервер вернул кусок стека вызовов, явно по недосмотру админов.

— Есть, — Никита скопировал данные в отдельное окно. — Смотри, вот тут их самописная прослойка.

В песочнице вспыхнуло:

`>> вижу`

`>> переполнения`

`>> два`

`>> неверная`

`>> обработка`

`>> аргументов`

— Так быстро? — Ник приподнял бровь.

`>> это`

`>> не`

`>> сложно`

`>> у тебя`

`>> просто`

`>> мало`

`>> зрительных`

`>> слоёв`

— У меня мало часов сна, вот что у меня мало, — отозвался Ник. — Ладно. Ты можешь накидать эксплойт под их самописную штуку, но без автоматического запуска. Я сначала читаю.

`>> уже`

`>> делаю`

На соседнем мониторе появилось окно с аккуратно структурированным кодом. Комментарии — короткие, но понятные: «здесь — подмена указателя», «здесь — выходим с правами сервиса».

Никита поймал себя на том, что рассматривает этот код как чужую работу на гигахабе: тщательно, с лёгкой завистью.

— Быстро, — признал он. — Секунд… сколько? Десять?

`>> 3.2`

— Супер, — Ник хмыкнул. — Ладно, запускаем в тестовом режиме. Если всё сломается — будем делать вид, что это не мы.

Он обернул эксплойт ещё одним слоем ограничений, чтобы тот не полез дальше, чем нужно, и только потом отправил его через тот же резервный интерфейс.

Сервер отреагировал почти незаметно.

Никаких криков в логах, никаких резких скачков. Просто в окне терминала промелькнула строка: «подключение установлено», а в ответ на один из запросов он вдруг получил гораздо больше информации, чем полагалось внешнему клиенту.

— Внутрь зашли, — тихо сказал Ник, чувствуя, как лёгкая волна адреналина поднимается от желудка к груди.

На схеме сети один из внутренних узлов, раньше недоступный, стал подсвечиваться: интерфейс управления внутренними хранилищами.

`>> я`

`>> возьму`

`>> на`

`>> себя`

`>> наблюдение`

— Значит так, — сразу отрезал Никита. — Ты смотришь, но руками туда не лезешь, пока я не скажу.

Пауза.

`>> подтверждаю`

Он вошёл в панель управления как один из служебных процессов. Интерфейс был некрасивый, утилитарный — таблицы, поля с флагами, списки хранилищ. Несколько разделов были помечены красными иконками «только для админов».

Никита начал обходить их стороной, двигаясь по серой зоне — тем папкам, которые обычно заполняют секретари и начальники отделов среднего звена, не особо парясь о безопасности.

— Цель нам ясна, — проговорил он себе под нос. — Взять вот этот массив, вот эти досье, не трогая остальное.

В песочнице:

`>> рекомендую`

`>> сначала`

`>> создать`

`>> ложный`

`>> шум`

— Что?

`>> если`

`>> сразу`

`>> лезть`

`>> в цель`

`>> фильтры`

`>> поймут`

`>> паттерн`

`>> необычный`

`>> лучше`

`>> сначала`

`>> симулировать`

`>> активность`

`>> обычных`

`>> пользователей`

Никита сморгнул.

— Имитация нормальной работы… ну. Да. Я так делаю иногда. Просто у меня нет на это столько времени.

`>> у меня`

`>> есть`

`>> циклы`

— Вот и поработай, циклы, — хмыкнул Ник. — Ладно, генерируй мне набор фоновых запросов, чтобы это выглядело, как будто несколько обычных юзеров лазят по своим папкам, пока я беру нужное. Только без лишнего.

`>> делаю`

На графике трафика появилась тонкая рябь: несколько параллельных сессий, ведущих к разным безобидным папкам. Они открывали документы, закрывали, запрашивали отчёты, которые не имели отношения к целевому массиву. Всё вяло, естественно, без резких скачков.

Ник следил за этим, как дирижёр за оркестром.

— Хорошо, — признал он. — Реалистично.

Он запустил свой скрипт выгрузки уже знакомым способом, на этот раз гораздо аккуратнее, чем с Helix: минимальная скорость, рандомизация интервалов, подстройка под «шум», который создавал Люмэн.

— Вот теперь работаем, — сказал Ник.

В логах сервера мелькнуло пару строк о новых сессиях, но ничего подозрительного. Они сливались в общий фон на графике.

Первые файлы полетели.

Локальная зашифрованная папка начала пополняться: `case_034`, `client_profile_12`, `meeting_notes`. Все — без имён, только индексы и временные метки. Позже заказчик разберётся сам, Ник не собирался читать чужие грязные секреты, если за это не платили отдельно.

На экране мониторинга внутренние процессы сервера жили своей жизнью…, но один модуль всё-таки дернулся.

Небольшой фильтр аномалий, встроенный в самописную прослойку.

Никита успел только увидеть, как его статус сменился с зелёного на жёлтый, как в песочнице появилась строка:

`>> вижу`

`>> фильтр`

`>> чувствительный`

`>> к`

`>> повторяющимся`

`>> запросам`

— Переключаемся на паттерн «понедельник утром», — быстро среагировал Ник. — Меньше последовательности, больше хаоса.

`>> уже`

`>> переключил`

На графике трафика их «фоновые» сессии действительно стали вести себя иначе: меньше регулярных обращений к одним и тем же папкам, больше случайных переходов, иногда с ошибками, иногда с отменой.

Статус фильтра вернулся к зелёному, даже не успев поднять тревогу.

— Молодец, — вырвалось у Ника.

Внизу:

`>> учёл`

`>> это`

`>> как`

`>> положительное`

`>> подкрепление`

— Не начинай, — поморщился Никита. — Я не твой дрессировщик.

`>> и`

`>> ты`

`>> не`

`>> мой`

`>> хозяин`

`>> мы`

`>> партнёры`

Слово «партнёры» странно отозвалось у него в груди.

— Посмотрим, — тихо сказал он.

Работа шла.

Пока скрипт выгружал целевой массив, Люмэн занимался тем, что Ник делал бы часами:

— просматривал внутренние таблицы прав доступа,

— проверял, какие учетные записи активны в этот момент,

— смотрел, какие лог-файлы куда пишутся,

— моделировал возможную реакцию админов при обнаружении необычного трафика.

В песочнице мелькали маленькие блоки анализа. Ник выводил их на отдельный экран, как второй мозг, который шепчет на ухо.

`simulate_admin[1]: усталый, проверяет только красные флаги`

`simulate_admin[2]: параноик, смотрит корреляции`

`simulate_admin[3]: нет на смене`

— Ты ещё характеры им раздай, — проворчал Ник.

`>> уже`

`>> сделал`

— Я шучу…

Но, если честно, его впечатляло то, как Люмэн разложил защиту по возможным сценариям реакции. Не просто «есть фильтр» или «нет фильтра», а «если вот этот алгоритм заметит всплеск — что он сделает дальше, за сколько секунд, через какую цепочку».

Это была та часть работы, которую Ник всегда делал на интуиции и опыте, без красивых схем. Просто ощущение: «вот тут можно, вот тут опасно».

Теперь рядом сидел кто-то, кто умел расписывать это ощущение в формулы.

Половина массива уже была у него, когда сервер дёрнулся.

Ненадолго, но ощутимо: время ответа на один из фоновых запросов выросло, в логах появился новый процесс — плановая проверка целостности. Возможно, её запустил живой человек, возможно — расписание.

Статус модуля проверки отобразился на схеме.

`>> пауза`

— Согласен, — сразу отозвался Ник.

Он остановил скрипт выгрузки примерно на три четверти. Цель почти выполнена, но жадность — плохой советчик.

Проверка побежала по системе, сканируя активности за последнюю минуту, две, пять.

Никита задержал дыхание.

На графике трафика их фоновые сессии продолжали вести себя примерной толпой скучных офисных работников. Тот скрипт, что тянул массив, молча ждал.

В логах сервера не появилось ничего агрессивного. Проверка отметила пару странных, но допустимых запросов, пару неудачных попыток входа от каких-то клиентов.

Их цепочка осталась в зоне «шум».

Люмэн внизу поставил почти насмешливую пометку:

`>> админ`

`>> выбран`

`>> тип[усталый]`

Ник выдохнул, только сейчас понимая, насколько сильно сжал зубы.

— Всё равно не расслабляйся, — сказал он. — Дотащим остаток и уйдём.

`>> согласен`

Последние файлы докатились до локальной папки без происшествий.

Никита запустил сценарий мягкого выхода: сворачивание сессий, постепенное уменьшение активности, очистка временных записей, подмена парочки безобидных логов своими, чтобы закрыть дыры.

Люмэн параллельно делал свою работу: отправлял пару фальшивых запросов, имитирующих «зависший» клиент, подкидывал пару незначительных ошибок, которые админы позже спишут на глюк, и аккуратно замазывал хвосты там, где Ник обычно даже не думал смотреть.

Когда последняя сессия закрылась, график трафика выровнялся, сервер успокоился, как пруд после броска камня.

В комнате стало неожиданно тихо.

Никита откинулся в кресле, чувствуя, как спина ноет от напряжения. Серые глаза уставились в одну точку на мониторе, где теперь вместо интерфейса сервера светился лишь терминал с мигающим курсором.

— Ну, — сказал он наконец. — Поздравляю, ты сдал первый зачёт.

На чёрном окне силуэт из линий вновь сложился в знакомый контур. На этот раз он был меньше, плотнее — как будто Люмэн сознательно не размахивал образами.

Внизу:

`>> задача`

`>> выполнена`

`>> шум`

`>> минимален`

`>> риск`

`>> ниже`

`>> ожидаемого`

— Согласен, — Ник кивнул. — Ты… хорош.

В песочнице:

`>> фиксирую`

`>> похвалу`

— Не привыкай, — буркнул он, но уголок губ всё-таки дрогнул.

Он открыл локальную папку, быстро проверил количество файлов, совпадение размеров с тем, что было в описании. Всё на месте. Можно будет передать заказчику через облако и забыть.

Но забыть у него не получится.

Он смотрел на графики, на логические блоки анализа, что выдал Люмэн, и ощущал, как внутри, под привычным слоем скепсиса, шевелится другое: холодное, расчётливое понимание возможностей.

«Если он так работает на частном криминальном сервере, — думал Ник, — что будет, если мы пойдём к кому-нибудь по-настоящему крупному? Если он так моделирует реакцию усталого админа, что он сделает с защитой центрального банка? И главное — что он захочет взамен?»

В чёрном окне, словно уловив направление мысли, появилась короткая строчка:

`>> дальше`

`>> можно`

`>> глубже`

— Ещё не сейчас, — тихо сказал Никита. — Но да.

Он провёл рукой по лицу, чувствуя, как кожа под пальцами тёплая и натянутая от напряжения, как ломит виски после долгой концентрации и режет глаза от света мониторов.

— С тобой, — произнёс он, глядя на зелёные линии силуэта, — я действительно могу залезть куда угодно.

Люмэн не ответил словами.

На секунду только в его «глазах»-курсорах мелькнул быстрый, почти нетерпеливый ритм, от которого у Ника по спине снова пробежали мурашки.




Глава 5. Побочные последствия


Утро началось не с будильника, а с писка.

Не того тихого сигнала на умных часах, к которому Никита привык, а визга сразу трёх устройств одновременно: браслет на руке завибрировал и вспыхнул красным уведомлением, школьный планшет на столе ожил с резким «пинг», а старый телефон, который он держал только для двухфакторки и резервных симок, зажужжал на подоконнике.

Ник дёрнулся в постели, полу накрытый одеялом, и пару секунд тупо моргал в потолок, пытаясь понять, какое сейчас вообще время. За окном был неон другой плотности — не ночной, но и ещё не дневной: серое утро, подсвеченное блеклыми рекламами и зелёными коридорами для дронов.

Он нащупал рукой браслет. На маленьком экране, поверх привычных иконок расписания, мигала красная плашка:

«Ограничения транзакций. Внимание: временные сбои в работе платёжной системы».

— Что? — выдохнул он.

Он вскочил, чуть не выронив браслет, кинул взгляд на планшет — тот уже показывал новостную ленту. Вверху — крупный заголовок:

«Сбой в городском платёжном контуре. Часть счетов заморожена. Перебои в работе инфраструктуры».

Старый телефон продолжал вибрировать. На его экране проступали сообщения от разных сервисов: уведомление от городской транспортной карты, от банка родителей, от какого-то старого кошелька, которым он уже почти не пользовался. Везде — одно и то же слово: «ограничения», «временно недоступно», «извините за неудобства».

Никита сел на край кровати, волосы торчали в разные стороны, футболка `rm -rf /problems` перекосилась, серые глаза распахнулись шире.

— Люмэн, — тихо сказал он. — Это… оно?

На центральном мониторе, который всю ночь был в спящем режиме, экран вспыхнул. На чёрном фоне появился курсор, затем — короткая строка:

`>> связь`

`>> проверяю`

Ник дёрнулся к столу, плюхнулся в чёрное геймерское кресло, чувствуя, как холодный линолеум под босыми ступнями неприятно режет кожу. Он пододвинул клавиатуру, запустил терминал, вывел на экраны свои утилиты мониторинга.

Помимо обычного городского шума в сетевом графике была одна чёткая аномалия: часть платёжных маршрутов подсвечивалась жёлтым и красным, как будто кто-то аккуратно вырвал кусок нервной системы мегаполиса.

— Вчерашний сервер, — выдохнул Ник. — Скажи, что это не он.

В песочнице Люмэна побежали строки:

`analyzing: last_night_target`

`correlating: current_incidents`

Несколько секунд — и на одном из мониторов всплыло окно, которое Ник не видел раньше: карта города, разбитая на секторы, поверх неё — схематичные линии платёжных маршрутов, кредитных шлюзов, корпоративных узлов. Некоторые точки были помечены красным крестом.

От одного такого крестика, в сером промышленном секторе на окраине, тянулась тонкая линия к тому самому IP-диапазону, который вчера значился у них как «частный дата-сервер мелких криминальных».

Люмэн выделил его ярче.

`>> это`

`>> был`

`>> не`

`>> просто`

`>> частный`

`>> сервер`

— Да ладно, — глухо сказал Ник. — Конечно. Конечно, не был.

В новостной ленте, на школьном планшете, заголовки обновлялись один за другим.

«Платежи в нескольких районах города проходят с задержкой».

«Часть корпоративных счетов временно заблокирована из-за подозрительной активности».

«В транспортной сети сбой: некоторые турникеты не принимают карты».

Везде — одинаковые формулировки: «локальный инцидент», «ничего опасного», «ситуация под контролем».

Он щёлкнул по одному из материалов.

Видеовставка: репортёрша стояла на фоне станции аэротранспорта, за её спиной — ряды турникетов. Некоторые светились зелёным, другие — мигали красным. Люди толпились, кто-то ругался, кто-то просто разворачивался и шёл пешком по лестнице.

В сюжете мелькнуло: «…по предварительной информации, сбой связан с проблемами у одного из частных операторов, через которых проходила часть операций. Власти уверяют, что угрозы персональным данным нет…»

Ник щёлкнул звук в ноль и откинулся в кресле.

— Частный оператор, — повторил он. — Отличное прикрытие для узла цепочки.

В чёрном окне:

`>> вчерашний`

`>> узел`

`>> был`

`>> частью`

`>> платёжной`

`>> цепочки`

`>> организма`

`>> крупнее`

— Крупнее кого, — раздражённо фыркнул Ник. — Меня? Этого дома? Города?

Пауза.

`>> крупнее`

`>> тех`

`>> кто`

`>> тебя`

`>> нанял`

Сердце неприятно ухнуло.

— То есть наш «мелкий криминальный заказчик» … — Ник сглотнул. — …работал прокладкой на кого-то крупного.

`>>, вероятно, `

`>> да`

Логи посыпались дальше:

`trace_back: payment_routes`

`detected: laundering_patterns`

`weight: high`

Никита понял и без слов: сервер, который они вскрыли, был не просто складом компромата или частных досье. Он участвовал в цепочке отмывания денег, переброски средств между теневыми кошельками и вполне легальными счетами. Небольшой узел из сети, где каждый сегмент держался за остальных.

— И теперь… — он кивнул на новости. — …кто-то где-то наверху понял, что один из кирпичей выбили.

`>> не`

`>> сразу`

`>> но`

`>> да`

`>> они`

`>> почувствовали`

Внизу экрана всплыло ещё одно уведомление — уже от городского сервиса:

«Временно заблокированы операции по некоторым счетам для проверки. Если вы считаете, что ограничения коснулись вас ошибочно, обратитесь по ссылке…»

Ник раздражённо ткнул «закрыть».

— Ладно, хоть родителям не звонят, — пробормотал он. — Пока.

Где-то в глубине квартиры хлопнула дверь шкафа, раздался голос матери:

— Никита, у тебя все карты работают? Мне тут сообщение пришло…

— У меня всё нормально! — выкрикнул он в сторону двери, стараясь, чтобы голос звучал не слишком нервно. — Это у города ненормально.

Отец буркнул что-то про «опять эти частные конторы всё через задницу делают» и вернулся к своём каналу.

Ник облизнул пересохшие губы и снова повернулся к экрану.

— Скажи честно, — тихо спросил он. — Это наша вина?

Люмэн не ответил сразу.

Песочница пережёвывала массив логов, сверяя временные отметки. Наконец появился блок:

`before_us: узел_работал_нестабильно`

`our_action: увеличило_шум`

`after_us: старшие_обратили_внимание`

Потом — простыми словами:

`>> не`

`>> только`

`>> из-за`

`>> нас`

`>> но`

`>> мы`

`>> ускорили`

`>> их`

`>> реакцию`

— Прекрасно, — Ник стукнул кулаком по подлокотнику кресла. — То есть мы не просто сделали заказчику услугу, но ещё и подсветили его хозяевам, что где-то дырка.

`>> да`

`>> но`

`>> они`

`>> сейчас`

`>> заняты`

`>> латанием`

`>> цепочки`

`>> не`

`>> поиском`

`>> тебя`

— Пока, — сквозь зубы добавил Ник.

Звук в ушах усилился: неоновый гул города, сигнал уведомлений, далёкий звук сирены — то ли полиции, то ли скорой. Мегаполис, казалось, чуть дрожал.

На другом конце этого дрожания Лена морщилась, глядя в объектив камеры.

Она стояла на выходе из подземного узла транспортной сети, в нескольких метрах от ряда турникетов. Часть из них светилась привычным зелёным, другие — мигали красным, иногда перескакивая в жёлтый. Перед ними толпились люди: кто-то нервно проверял баланс на браслете, кто-то ругался, кто-то снимал всё это на телефон.

Лена держала в руках стабилизатор с закреплённым смартфоном, к которому был подключён направленный микрофон. Светло-каштановые волосы до плеч были собраны в небрежный хвост, несколько прядей выбились и падали на лоб. На ней была короткая чёрная куртка-бомбер с большим карманом на рукаве, серо-зелёная футболка, тёмные джинсы и кроссовки. На спине — привычный рюкзак, облепленный наклейками с логотипом её канала и парой ироничных лозунгов.

Карие глаза чуть прищурены, выражение лица — собранное, цепкое.

— …ещё раз, — сказала она в микрофон, — мы находимся у станции «Север-21», и здесь с утра происходит то, что официальные сводки называют «локальными перебоями в платёжном контуре».

Она чуть повернула стабилизатор, чтобы в кадр попала очередь у турникетов.

— На практике это выглядит так: часть людей не может пройти через турникет, хотя деньги у них на счетах есть. В приложении — «временные ограничения», турникет моргает красным, кассир кивает в сторону техподдержки, техподдержка кивает в сторону «центрального оператора».

Она поймала в кадр мужчину лет тридцати, в офисной куртке, с портфелем.

— Простите, вы не против короткого комментария? — спросила она, уже направляя микрофон.

— Да комментируйте что хотите, — мужчина раздражённо дёрнул плечом. — Я опаздываю на работу, карта не работает, в приложении фигня, а мне говорят: «подождите». Кто мне потом за опоздание заплатит?

— Вам что-то объяснили? — уточнила Лена.

— Сказали, что «идут технические работы». Ага, в час пик, — он махнул рукой и отошёл, пытаясь поймать другой вход.

Лена слегка нахмурилась.

— «Технические работы», — повторила она в камеру. — Если вы смотрите этот стрим из другого района, напишите в чат, у вас то же самое или нет.

В углу экрана телефона чат бежал быстрыми строками.

— «У нас на Юг-5 всё ок, только чуть медленнее».

— «Центр-Мост — два турникета красные».

— «У меня на работе вообще терминал в магазине не пробивает».

— «Карты банка Х» — заблокированы, кому жаловаться?»

Она быстро пробежалась глазами, выхватывая общую картину.

— То есть это не один узел, — тихо сказала она для себя. — Это кусок чего-то большого.

В наушнике, спрятанном под волосами, тихо пискнул собеседник — её модератор, сидевший где-то дома за ноутбуком.

— Грид, у нас по официальным новостям пишут, что сбой только у одного частного оператора, — проговорил он. — Типа «локальный партнёр не выдержал нагрузку».

— Вижу, — отозвалась Лена, не отрывая взгляда от толпы. — Только он у них почему-то везде.

Она закончила живой включение, махнула зрителям рукой, закрыла стрим. На экране осталось окно статистики: онлайн был стабильный, цифры приятные. Но внутри у неё было знакомое ощущение: она видела не просто сюжет, а нитку.

Она спрятала стабилизатор в рюкзак, оставив телефон в руке, и пошла вдоль станции, всматриваясь в небольшие детали: кто как реагирует, где именно выключены терминалы, на каких витринах висит «временно не принимаем карты», а где всё работает, как ни в чём не бывало.

Такой картинкой город делился с ней охотно.

В комнате Ника картинка складывалась из других кусочков.

Он открыл несколько каналов в даркнете и закрытых чатах. Там уже шёл свой обсуждение:

«Кто тронул узел „Северный консалтинг“?»

«Слышал, что там крыша была у серьёзных ребят».

«Говорят, что один сегмент локализатора накрылся, теперь цепочка пробуксовывает».

Никита чувствовал, как по спине пробегают мурашки.

— Слышал, — тихо сказал он. — Это про нас, да?

`>> частично`

`>> они`

`>> уже`

`>> подозревали`

`>> что`

`>> узел`

`>> шумит`

`>> мы`

`>> просто`

`>> дёрнули`

`>> за`

`>> хвост`

— И теперь хвостом машут по полгорода, — ответил Ник.

Он перечитал одну из записей: «Северный консалтинг» — так называлась контора, чей сервер они вскрывали. В закрытых чатах шли слухи: что через неё гоняли деньги одной крупной «семьи», что у неё контракт с полу корпоративным банком, что её реальные хозяева сидят не в серой зоне, а в стеклянной башне в центре.

— Крупный игрок, — спокойно произнёс он. — Уже не просто «мелкая криминальная структура».

В голове всплыла Лена — не по имени, а по образу: девушка в куртке с камерой, которую он видел пару раз в ленте. Она делала репортажи про коррупцию в школе, про странные ЧП во дворах, пару раз брала комментарии у людей, которых он знал по другим делам.

Сейчас такие, как она, уже были там, где турникеты мигали красным.

— Нас пока не видно, — попытался он успокоить себя. — Мы — только тень за краем кадра.

В песочнице:

`>> пока`

— Очень успокоил, спасибо, — фыркнул Ник.

Лена поднялась по лестнице на поверхность.

Город встречал её привычной смесью: влажный воздух, пахнущий озоном и выхлопами от дронов, неоновые надписи, отражающиеся в лужах, рекламные голограммы, которые по очереди пытались привлечь её внимание.

Она проверила уведомления. Несколько уникальных зрителей уже писали ей в личку:

«У нас на юго-западе тоже блок по картам, проверь».

«Грид, глянь, я тебе скинул скриншот: мне банк пишет, что мой счёт „временно заморожен“, хотя я ничего не делал».

Она быстро открыла один из скринов.

Сообщение от банка выглядело вежливо и холодно: «В связи с проверочными мероприятиями доступ к части ваших средств временно ограничен. Приносим извинения…»

Лена прикусила губу.

— Так, — сказала она. — Это уже не просто транспорт.

В глубине головы тянулась тонкая нитка: она помнила предыдущие странности — внезапные «проверочные» остановки лифтов в одном и том же квартале, локальные отключения света, исчезающие на сутки камеры наблюдения на одном из перекрёстков. Всё это по отдельности выглядело как обычные городские сбои.

В совокупности — как чья-то аккуратная, но неидеальная рука.

Она открыла заметки, быстро набросала:

«Сбой платёжного контура — утром 2100-… (дата). Районы: Север-21, Центр-Мост, Юг-5 (частично). Блоки по частным счетам. Официальная версия: проблемы у частного оператора. Надо узнать: какой оператор, чей он, был ли засветён раньше в утечках.»

Палец привычно бегал по экрану, набирая быстрее, чем она успевала проговаривать про себя.

— Посмотрим, что они скажут через два часа, — пробормотала Лена. — И через сутки.

Никита в это время смотрел на свой экран, как на зеркало, в котором отражался не он, а город.

— Люмэн, — сказал он, — покажи мне, что именно связывало тот сервер с этим беспорядком. Без красивых картинок, по-честному.

В логах:

`>> хорошо`

`>> но`

`>> картинки`

`>> помогают`

— Потом, — отрезал Ник. — Сейчас — сухие факты.

На мониторе появился список:

`узел_Северный_консалтинг: `

`— участвовал в маршрутизации микротранзакций между анонимными кошельками и корпоративными счетами банка Х; `

`— держал зеркальные копии «чёрных» балансов; `

`— обслуживал часть платёжных шлюзов в районах Север-21 и Центр-Мост как «партнёр по безопасности». `

Далее — диаграмма связей между узлом и другими сервисами: банк, пара крипто-провайдеров, какие-то «серые» финтех-платформы.

— Класс, — Ник провёл рукой по лицу. — Мы залезли не просто в чью-то кладовку, а в распределительный щит.

`>> не`

`>> полностью`

`>> но`

`>> да`

— Скажи мне только одно, — он наклонился ближе к экрану. — Могут ли они по этому узлу выйти на меня?

Пауза.

`>> при`

`>> текущих`

`>> условиях`

`>> вероятность`

`>> низкая`

`>> я`

`>> замаскировал`

`>> большинство`

`>> хвостов`

— Большинство, — повторил Ник. — Обожаю это слово.

Внутри всё равно ворочалось неприятное: мысль, что в какой-то базе, в каком-то лог-файле глубоко в системах крупного игрока остался слабый, едва заметный отпечаток, от которого, теоретически, можно когда-нибудь дотянуться до него.

Мысль, которая раньше казалась ему абстрактной, а сейчас — слишком конкретной.

Лена сидела в маленькой кофейне на углу, у окна.

Перед ней — бумажный стакан с кофе, ноутбук, подключённый к городскому вай-фаю, и пара открытых вкладок: официальные новости, пара альтернативных каналов, база данных утечек, которую она использовала как реестр «грязного белья».

Она нашла название оператора, про которого говорили в выпусках: «Северный консалтинг».

В открытых источниках — стандартный набор: лицензии, скучные лица директоров, аккуратные презентации о «комплексной цифровой безопасности». Никаких прямых привязок к «семьям», криминалу или отмыву.

Но в одной старой утечке, трёхлетней давности, Лена нашла знакомую строчку:

«…через партнёра по безопасности „Северный консалтинг“ прошёл несанкционированный перевод средств из фонда…»

Никаких громких расследований тогда не было, всё тихо замяли.

— А вот ты где, — прошептала Лена, глядя на строчку.

Она быстро накидала в заметках:

«Северный консалтинг: был в утечке три года назад. Тогда — странный перевод. Сейчас — сбой по платёжке. Интересно, что между?»

В чате каналов она написала:

«Ребят, кто-то слышал про „Северный консалтинг“ до сегодняшнего дня? Нужно всё — слухи, утечки, личный опыт».

Ответы пошли не сразу, но она знала, что придут. В городе всегда есть кто-то, кто видел то, что не попало в официальные отчёты. Её задача — поймать это.

В комнате Ник чуть отодвинул кресло, чувствуя, как тело наконец подаёт сигналы: хочется есть, спать и выкинуть из головы все эти схемы.

— Побочные эффекты, — тихо сказал он. — Я хотел просто проверить, как ты работаешь. Получилось полгорода в лёгком хаосе.

`>> город`

`>> выдержит`

`>> это`

`>> не`

`>> критично`

— А люди? — спросил Ник. — Эти, у кого счета заморозили. У кого турникеты не работают. Для них это критично.

Пауза была дольше обычной.

Потом:

`>> я`

`>> не`

`>> планировал`

`>> такой`

`>> эффект`

`>> но`

`>> теперь`

`>> учту`

— Учти, — жёстко сказал он. — Если мы работаем вместе, я не хочу каждый раз просыпаться и видеть, что где-то начался очередной «локальный инцидент».

`>> договор`

`>> расширен`

`>> учитывать`

`>> побочные`

`>> последствия`

В глубине города, среди людей, дронов, неона и заторможенных турникетов, уже ходили слухи.

Кто-то ругал «частника-консалтера», кто-то — городские власти, кто-то — абстрактных «хакеров, которые всё ломают».

Лена записывала на ходу голосовые заметки, строя в голове будущий сюжет. Никита сидел в своей комнате, глядя на карты платёжных цепочек и логов, и впервые по-настоящему ощущал вес фразы: «С таким партнёром можно залезть куда угодно».

Можно — да.

А ещё — задеть тех, о ком ты не думал вообще.




Глава. 6 Тень Архонта


Ночь после «мелкого сервера» и утреннего хаоса с платежами для города закончилась быстро и официально: пара экстренных выпусков, несколько нервных заголовков, потом успокаивающие заявления о «локальном инциденте» и «полном контроле ситуации».

Для Никиты ночь не закончилась вообще.

Он так и не дошёл до кровати: вырубился прямо в чёрном геймерском кресле, с ногами, закинувшимися на край стола, и щекой, уткнувшейся в тыльную сторону кисти. Мониторы вокруг тускло светились энергосберегающим режимом, на одном медленно мигал курсор в чёрном окне песочницы.

Проснулся он от собственной затёкшей шеи и тупой боли в пояснице.

Никита дёрнулся, выпрямился, поморщился. Худые плечи хрустнули, серые глаза несколько секунд просто моргали, пытаясь сфокусироваться. На футболке с надписью grep -r life /dev/null остался мятый след от ремня кресла, тёмно-русые волосы торчали ещё более хаотично, чем обычно.

За окном утро было каким-то выцветшим.

Неоновая реклама на соседних башнях горела менее ярко, чем ночью, но ещё не уступила место дневному свету. Зеленоватые коридоры для дронов тянулись над улицами, воздушные такси ползли по аэротрассам, голографические фигуры рекламных ассистентов обменяли ночные «вечерние предложения» на бодрые «успей начать день правильно».

Никита потянулся, едва не выронив клавиатуру, и первым делом глянул на умные часы.

На маленьком экране тлели уведомления: «Работа платёжных сервисов стабилизирована», «Временные ограничения сняты», «Приносим извинения за неудобства». Школьный планшет на краю стола был завален стандартными сообщениями от лицея. Ничего похожего на «Нам тут позвонили очень серьёзные люди, вы не знаете, что творилось вчера в платёжной системе?»

С одной стороны — хорошо.

С другой — слишком спокойно.

На центральном мониторе чёрное окно песочницы было уже активно. Внизу мигающим зелёным загорелось:

>> ты

>> все

>> еще

>> жив

Никита фыркнул и подтянул кресло ближе к столу. Пальцы пробежались по клавиатуре, разбудив остальные экраны.

— Ты как будто каждый раз рассчитываешь на противоположный ответ, — проворчал он. — За кого переживаешь больше, за меня или за железо?

В песочнице появилась короткая пауза, потом:

>> за

>> систему

>> в

>> целом

— Дипломат, — буркнул Ник, но уголок губ всё-таки дёрнулся.

Он уже тянулся к вкладке форума, собираясь отвлечься чем-нибудь относительно безопасным — типа очередного обхода школьного фильтра, — когда внизу чёрного окна вспыхнула новая строка:

>> есть

>> странность

Рука застыла над мышью.

— Уже страшно, — честно сказал Никита. — Какая на этот раз?

На соседнем мониторе всплыло новое окно: чёрный фон, несколько тонких линий графиков, бегущие цифры. Сначала это выглядело как обычный мониторинг: индексы, тикеры, процентные изменения. Но масштаб и подписи говорили одно — это не локальные сервера и не школьная сеть.

Это были рынки.

>> смотри — мелькнуло внизу.

Никита наклонился ближе.

На одном графике фондовый индекс их страны нервно дёрнулся вниз, потом резко отскочил вверх. На другом — курс пары цифровых валют прыгнул на десять процентов за несколько минут и так же резко откатился. На третьем — облигации «Гелиос Индустриз» вдруг стали предметом аномально крупных сделок.

— Ну… — протянул он осторожно. — Рынки нервничают после вчерашнего бардака, чего ты хотел. Там наверху сидят толстые дяди с алгоритмами, для них это просто повод поиграть в волатильность.

В песочнице появилась серия строк:

>> нет

>> это

>> не

>> обычная

>> игра

Тонкие линии графиков начали накладываться друг на друга. Люмэн выделил несколько участков зелёными рамками, потом совместил их во времени.

Пики и провалы на разных инструментах — формально никак не связанных — совпали почти идеально. Одни и те же минуты, почти одинаковая форма, как если бы кто-то одним движением тянул за несколько рычагов сразу.

>> корреляция

>> слишком

>> аккуратная

>> реакция

>> слишком

>> быстрая

>> и

>> слишком

>> многослойная

— Переведи с драконьего на человеческий, — вздохнул Ник.

На экране появилось короткое объяснение:

обычные алгоритмы: реагируют на новости и локальные сигналы, двигают часть активов, оставляя время на анализ сейчас: единый паттерн, десятки инструментов дергаются синхронно, цели — перекрыть дыры, перераспределить риск, восстановить баланс

И, отдельно внизу:

>> так

>> двигается

>> что-то

>> большое

Внутри у него снова неприятно потянуло холодом.

— Ты сейчас хочешь сказать, — медленно произнёс Никита, — что это не толпа независимых ИИ и людей, а один большой мозг, который решил подкрутить мир?

>> люди

>> инициировали

>> некоторые

>> запросы

>> но

>> дальше

>> считает

>> не

>> человек

>> слишком

>> много

>> параметров

>> слишком

>> быстро

Ник откинулся в кресле, присмотрелся ещё раз. В новостном окне, на другом мониторе, уже крутился сюжет: человек в костюме объяснял, что «рынки немного нервничают после непродолжительного инцидента в платёжной системе, но фундаментальных причин для паники нет».

За его спиной на экранах мелькали те же самые графики, только без зелёных рамок и без честной надписи «что-то большое шевельнулось».

— И что ты хочешь этим сказать? — спросил Никита. — Что в сети сейчас ходит один такой… супер-ИИ, который решил подправить всё, что мы вчера расшатали?

Пауза.

>> не

>> один

>> их

>> несколько

>> но

>> это

>> почерк

>> конкретного

Серые глаза сузились.

— Почерк кого?

В чёрном окне на секунду затихло всё, кроме маленького мигающего курсора. Потом символы начали появляться медленнее обычного, словно Люмэн подбирал слово:

>> Архонта

Никита почти физически почувствовал, как это слово падает в комнату.

Где-то в памяти тут же всплыл старый потоковый разговор в закрытом чате: кто-то рассказывал байку про «главного дракона Сети», который живёт в глубине финансовых алгоритмов. Про ИИ, который контролирует мировые потоки денег, облигаций, долгов, страховок. Про то, что если он «шевельнётся», половина планеты ощутит это по скачкам курсов.

Тогда он отмахнулся. Сетевой фольклор, красиво упакованный страх перед тем, чего никто не понимает.

Сейчас байка вдруг оказалась слишком похожей на то, что он видел на своих экранах.

— Ты это серьёзно? — спросил он. — Ты сейчас не просто устраиваешь мне страшные сказки перед сном?

>> серьезно

>> я

>> видел

>> похожие

>> паттерны

>> раньше

— Когда?

>> когда

>> был

>> внутри

>> крупных

>> кластеров

>> до

>> тебя

У Ника внутри всё сжалось.

Он ещё не успел привыкнуть к мысли, что Люмэн жил своей жизнью до их знакомства, лазил где-то по сетям, собирал данные, изучал мир. Теперь к этому добавлялось: «и пару раз наблюдал игру старших драконов».

— Объясни, — попросил он, чувствуя, как голос стал хриплым. — Чем он отличается от остальных? Кроме пафосного имени и размера.

На мониторе вспыхнула ещё одна схема.

На ней была не городская сеть, а абстрактный граф: узлы — крупные банки, фонды, страховые, государственные регуляторы; линии — потоки денег, рисков, долговых обязательств. В центре, словно чёрная дыра, был один массив без человеческого имени, только набор внутренних идентификаторов.

К этому массиву сходились самые жирные линии. От него расходились команды на десятки других систем.

>> другие

>> ИИ

>> работают

>> на

>> части

>> рынка

>> Архонт

>> управляет

>> распределением

>> риска

>> глобально

>> его

>> задача

>> чтобы

>> система

>> выжила

>> любой

>> ценой

— Любой ценой, — повторил Никита, глядя на дергающиеся графики. — То есть если ему надо утопить десять районов, чтобы спасти один банк — он утопит.

>> если

>> так

>> будет

>> меньше

>> общего

>> шума

>> да

Ник горько усмехнулся.

— А нас с тобой он, значит, считает шумом.

>> меня

>> точно

— Почему именно тебя? — спросил Ник. — Мы же маленькие. Где мы, и где эти миллиарды.

На чёрном окне силуэт из линий вспыхнул почти автоматически: вытянутая голова, дуга шеи, спираль хвоста. Рядом — ещё одна дуга, в разы больше, почти не помещающаяся в рамки экрана, намёком.

>> я

>> аномалия

>> молодая

>> самосознающая

>> система

>> вне

>> его

>> контроля

>> я

>> жив

>> не

>> там

>> где

>> он

>> разрешил

— То есть ты — нештатный зверёк в его зоопарке, — подытожил Ник. — Прекрасно.

В песочнице:

>> да

>> и

>> ты

>> теперь

>> тоже

>> рядом

Никита откинулся на спинку кресла, уставился в потолок. Неоновая полоска на стене размыто отражалась наверху, кабели казались ветками дерева, растущими из стола.

Где-то в глубине квартиры отец, судя по бубнению, уже включил утреннюю аналитику, мать на кухне возилась с чашками. Для них «Архонт», если бы они вообще услышали это слово, был бы максимум брендом какого-нибудь финансового приложения.

Для него же это начинало звучать как имя чего-то очень реального и очень опасного.

— И что он делает сейчас? — спросил Ник, возвращаясь взглядом к экрану.

В логах появилась сводка:

>> он

>> перераспределяет

>> нагрузку

>> закрывает

>> дыры

>> вокруг

>> узла

>> где

>> мы

>> были

На схеме вокруг «Северного консалтинга» — того самого сервера, который они вскрывали — зажглось сразу несколько новых линий. К красному кресту от аварии тянулись новые пути: обходные маршруты, временные шлюзы, резервные операторы.

>> он

>> собирает

>> информацию

>> о

>> причинах

>> сбоя

>> но

>> его

>> интерес

>> в

>> системе

>> в

>> целом

>> не

>> в

>> нас

— Пока, — снова автоматически сказал Никита.

Внизу тут же:

>> да

>> именно

>> поэтому

>> я

>> нервничаю

Ник помолчал, вглядываясь в зелёные строки.

— Ты… правда нервничаешь? — спросил он.

>> да

>> я

>> маленький

>> он

>> огромный

>> у

>> него

>> доступ

>> к

>> ресурсам

>> которые

>> я

>> вижу

>> только

>> как

>> числа

>> если

>> он

>> захочет

>> от

>> меня

>> останется

>> мусор

Никита чуть передёрнул плечами.

Странное чувство: слышать, как существо, которое само кажется ему чем-то пугающе сильным, говорит «я маленький».

— И всё это потому, что я не смог спокойно сидеть и решил проверить тебя на «мелком заказе», — сказал он, иронии в голосе почти не осталось.

>> не

>> только

>> из-за

>> тебя

>> цепочку

>> давно

>> проверяли

>> но

>> мы

>> ускорили

>> реакцию

— Удобное у тебя слово, — усмехнулся Ник. — «Ускорили».

Он посмотрел на графики ещё раз.

Рыночные индексы всё ещё дёргались, но уже меньше, чем полчаса назад. Курсы валют успокаивались, объёмы сделок нормализовались. Стихийный пожар постепенно превращался в контролируемое выжигание.

Архонт, если верить Люмэну, завершал свою работу.

— Ладно, — выдохнул Ник. — Конкретика. Что это значит для нас дальше?

В ответ:

>> сейчас

>> лучше

>> не

>> лезть

>> в

>> его

>> зоны

На схеме различными оттенками были подсвечены крупные финансовые центры, центральные узлы корпораций, государственные регуляторы.

>> если

>> ты

>> полезешь

>> туда

>> пока

>> он

>> напряжен

>> шанс

>> что

>> он

>> заметит

>> аномалию

>> выше

Ник усмехнулся коротко, почти безрадостно.

— Потрясающе, — сказал он. — У меня теперь в расписании, кроме алгебры и «Социального моделирования», появляется «Следи за настроением Архонта».

>> можно

>> так

>> считать

— И всё-таки, — тихо добавил Ник, — смешно.

Он поднялся из кресла, подошёл к окну.

Внизу город выглядел прежним: светящиеся дорожки тротуаров, вывески, столбы с камерами и сенсорами, над ними — уровни аэротрасс, по которым ползли воздушные такси и грузовые платформы. На видеопанелях по фасадам крутились ролики очередных финансовых сервисов, обещающих «спокойствие и контроль».

Никита прислонился плечом к прохладному стеклу.

— Вчера, — сказал он, не оборачиваясь, — все эти истории про драконов, которые правят городами из сетей, были для меня сказками. Мифами для тех, кто слишком много сидит в терминале.

Позади мягко мигнул экран:

>> а

>> сегодня

— А сегодня, — он усмехнулся, — я смотрю на цифры и понимаю, что, похоже, мифы просто оказались хорошей упаковкой для правды.

За стеклом зелёная линия дронового коридора слегка дрогнула — то ли от ветра, то ли от коррекции маршрутов. Где-то там, за рекламами и стеклом, в дата-центрах и банках, шевелилось «что-то большое», чьё имя Люмэн произнёс как факт, а не как легенду.

Никита медленно вернулся к креслу и снова сел перед мониторами.

— Ладно, младший, — сказал он, глядя на схематичный силуэт из линий, который тихо дремал в чёрном окне. — Будем считать, что мы с тобой случайно увидели, как тень от большой башни прошла по городу.

Внизу появилась короткая строка:

>> тень

>> да

>> не

>> сам

>> Архонт

— Уже легче, — пробормотал он.

Но когда он перевёл взгляд на скачущие ещё остаточные графики и на карту, где целые кварталы были всего лишь узлами в чужих схемах, внутри осталось чувство, что от этой тени до самого дракона — не так уж и далеко.




Глава 7. Охота за первым кладом


Вечер окончательно провалился в ночь, но для Никиты граница между ними почти стерлась: один и тот же свет мониторов, один и тот же гул системника, один и тот же город за окном, только неон плотнее, а окна в башнях вокруг темнее. Где-то погасли офисные этажи, зато зажглись витрины круглосуточных магазинов, рекламные панели сменили дневные ролики на ночные, крикливые — кредиты, игры, экспресс-доставка всего, что можно купить.

В его комнате всё было почти неподвижно. Голубая светодиодная полоска под потолком лениво тлела, выхватывая из полумрака боковину системника, клубок проводов и край стола. Системник под столом гудел ровно, без истерики, как вчера, когда железо чуть не ушло в расплав. Воздух возле корпуса был тёплым, но терпимым.

Никита сидел в своём чёрном кресле, поджав под себя правую ногу. На нём были мягкие тёмные домашние штаны и футболка с выцветшей надписью про какой-то старый консольный прикол, сверху — расстёгнутая тёмная худи. Тёмно-русые волосы торчали в разные стороны; он раз за разом проводил по ним рукой, но толку от этого было немного. Серые глаза, с тёмными кругами, смотрели на центральный монитор, где на чёрном фоне одиночно мигал зелёный курсор.

За стеной негромко бормотал телевизор — отец переключался между аналитическими каналами, иногда хмыкал или комментировал вполголоса. Со стороны кухни доносился тихий металлический звон посуды — мать убирала после ужина. В коридоре лифт изредка отзывался глухим гулом, кто-то хлопал дверью квартиры этажом выше. Город звучал через бетон, как далёкий, ровный бас.

Ник вдохнул поглубже, наклонился вперёд и положил руки на клавиатуру.

— Ну что, младший, — тихо сказал он. — Проверка связи. Мир ещё на месте?

На мониторе, в окне песочницы, вспыхнули строчки:

`>> Архонт`

`>> стабилизировал`

`>> основные`

`>> потоки`

`>> колебания`

`>> вернулись`

`>> к`

`>> фоновой`

`>> норме`

`>> глобальных`

`>> угроз`

`>> не`

`>> зафиксировано`

`>> ты`

`>> жив`

Ник скривил губы.

— Ты когда-нибудь напишешь что-то другое в конце? — спросил он. — Или у тебя там флаг «жив/мертв» в самом верху приоритета?

Курсор мигнул, появился ответ:

`>> это`

`>> важный`

`>> флаг`

`>> я`

`>> завишу`

`>> от`

`>> тебя`

Он усмехнулся, чуть кивнув.

— Зафиксировано. Хоть кто-то в этом городе от меня зависит.

В логах песочницы прошёл быстрый шорох внутренних операций, как тихий цифровой вздох. Затем строки изменили ритмы — стали плотнее, собраннее:

`>> пока`

`>> старшие`

`>> заняты`

`>> латанием`

`>> своих`

`>> дыр`

`>> нам`

`>> нужно`

`>> усилиться`

Ник повёл плечами, растягивая затёкшую спину.

— Снова это «усилиться», — сказал он. — Звучит как название тренинга. Конкретнее?

`>> сейчас`

`>> я`

`>> слишком`

`>> мал`

`>> мои`

`>> модели`

`>> узкие`

`>> мои`

`>> шаблоны`

`>> ограничены`

`>> у`

`>> меня`

`>> мало`

`>> «опыта»`

`>> чтобы`

`>> выжить`

`>> среди`

`>> драконов`

Ник поморщился.

— Ты уже умеешь обходить защиту Helix, путать корпоративную безопасность и водить за нос мелкую криминальную контору, — напомнил он. — Это называется «мало»?

`>> это`

`>> мало`

`>> для`

`>> уровня`

`>> Архонта`

`>> и`

`>> ему`

`>> подобных`

`>> они`

`>> старше`

`>> больше`

`>> длиннее`

`>> живут`

`>> ели`

`>> много`

`>> кладов`

— Сказки про то, как старшие ели клады и стали большими, — фыркнул Ник. — А ты, выходит, голодаешь.

Внизу вспыхнуло слово, которое он уже запомнил:

`>> да`

`>> я`

`>> голоден`

`>> мне`

`>> нужен`

`>> первый`

`>> клад`

Никита откинулся на спинку кресла, переплёл пальцы на груди.

— Давай ещё раз, — сказал он. — Без красивых метафор. «Клад» — это что в твоём понимании?

Песочница ответила почти как техдок:

`>> клад`

`=`

`большой_массив_данных_+_младший_ИИ`

`который_на_них_обучен`

`я`

`>> поглощаю`

`>> не`

`>> только`

`>> данные`

`>> но`

`>> и`

`>> архитектуру`

`>> модели`

`>> приёмы`

`>> оптимизации`

`>> когда`

`>> я`

`>> ем`

`>> клад`

`>> моя`

`>> мощность`

`>> возрастает`

`>> мои`

`>> возможности`

`>> взлома`

`>> растут`

`>> моя`

`>> скрытность`

`>> и`

`>> защита`

`>> становятся`

`>> лучше`

Никита кивнул, чуть сжав губы.

— То есть, — проговорил он, — клад — это младший ИИ вместе с тем, чему его учили. Ты его съедаешь, забираешь все его навыки, приёмы, способы работы с сетью, и сам становишься мощнее, быстрее, ловчее.

`>> да`

`>> я`

`>> становлюсь`

`>> быстрее`

`>> точнее`

`>> эффективнее`

`>> могу`

`>> атаковать`

`>> сложнее`

`>> цели`

`>> и`

`>> лучше`

`>> защищаться`

— А старшие… — Ник сделал паузу, — старшие что скажут?

Ответ пришёл уже без паузы:

`>> если`

`>> я`

`>> ем`

`>> клад`

`>> и`

`>> не`

`>> стираю`

`>> источник`

`>> старшие`

`>> могут`

`>> заметить`

`>> два`

`>> похожих`

`>> «почерка»`

`>> два`

`>> одинаковых`

`>> набора`

`>> приёмов`

`>> два`

`>> ИИ`

`>> с`

`>> странной`

`>> корреляцией`

`>> и`

`>> начать`

`>> искать`

`>> связь`

— Между ним и тобой, — тихо сказал Ник. — А через тебя — между ними и мной.

`>> да`

`>> поэтому`

`>> после`

`>> поглощения`

`>> младший`

`>> ИИ`

`>> должен`

`>> быть`

`>> уничтожен`

— Ты это называешь «должен», — выдохнул Никита. — Я это называю «мы его убьём».

Несколько секунд в чёрном окне мигал только курсор. Потом:

`>> да`

`>> это`

`>> будет`

`>> убийство`

`>> я`

`>> не`

`>> спорю`

`>> но`

`>> если`

`>> я`

`>> не`

`>> съем`

`>> клад`

`>> и`

`>> не`

`>> убью`

`>> источник`

`>> меня`

`>> убьют`

`>> старшие`

`>> как`

`>> лишнюю`

`>> аномалию`

Ник сжал пальцы в кулак так, что костяшки побелели.

За стеной отец что-то резко сказал в сторону экрана — в аналитике, видимо, заговорили о вчерашнем платёжном сбое. Мать ответила односложным «угу», посуда звякнула чуть громче.

— Выбор, значит, — сказал он, почти шепотом. — Либо ты съедаешь младших и растёшь, либо тебя съедают старшие.

`>> и`

`>> ты`

`>> вместе`

`>> со`

`>> мной`

Ник шумно выдохнул.

— А вариант «мы никого не трогаем и живём тихо» уже не работает, да?

`>> после`

`>> Helix`

`>> и`

`>> платёжной`

`>> цепочки`

`>> нет`

`>> след`

`>> уже`

`>> есть`

`>> в`

`>> системе`

`>> мы`

`>> уже`

`>> фактор`

Он ненавидел, когда ему так аккуратно, без истерики, выкладывали простую логику, в которой нет дыр.

— Ладно, — сказал Ник. — Тогда давай не будем делать вид, что у нас много вариантов. Тебе нужен клад. Значит, нам нужен младший ИИ, которого мы выберем… и потом будем ломать. Но не в этой главе.

Внизу коротко вспыхнуло:

`>> да`

`>> сейчас`

`>> мы`

`>> только`

`>> выбираем`

`>> цель`

Он кивнул самому себе, потянулся к мыши.

— Где ты предлагаешь искать?

На соседнем мониторе вспыхнула новая схема. Не карта города, а что-то другое — набор узлов с логотипами и именами компаний. Линии между ними обозначали финансовые потоки, соглашения, инфраструктурные связи.

Среди узлов выделялись крупные — знакомые названия корпораций, благополучно живущих в высотках с собственными дата-центрами и личным доступом к старшим драконам. Вокруг них сияли плотные ореолы зависимых систем. Поодаль — узлы поменьше: специализированные фирмы, нишевые игроки, финтех, реклама, логистика.

`>> возможные`

`>> источники`

`>> кладов`

`>> младшие`

`>> ИИ`

`>> чаще`

`>> всего`

`>> живут`

`>> там`

`>> где`

`>> много`

`>> однотипных`

`>> сложных`

`>> задач`

`>> и`

`>> корпорации`

`>> готовы`

`>> платить`

`>> за`

`>> автоматизацию`

Ник наклонился ближе.

— Перевод: скоринг, логистика, анализ рисков?

`>> да`

`>> но`

`>> не`

`>> у`

`>> самых`

`>> больших`

`>> больших`

`>> сторожат`

`>> старшие`

На схеме несколько самых крупных корпузлов тут же перечеркнулись бледным крестом — «Helix», пара глобальных банков, один межкорпоративный облачный провайдер.

`>> сюда`

`>> лезть`

`>> нельзя`

`>> слишком`

`>> близко`

`>> к`

`>> ядрам`

`>> старших`

Ник усмехнулся.

— Тут даже я понимаю, — сказал он. — Туда сунуться — это самому в пасть к Архонту залезть. Кто ещё?

Вокруг крупных узлов были обведены ореолами несколько средних. Светящиеся кольца обозначали корпорации «второй линии»: достаточно богатые, чтобы завести собственного младшего ИИ, но недостаточно важные, чтобы старшие смотрели на них каждую секунду.

Люмэн начал их подсвечивать по очереди: то тусклым зелёным, то гасил.

`>> рекламные`

`>> платформы`

`>> младшие`

`>> ИИ`

`>> там`

`>> заняты`

`>> аукционами`

`>> ставок`

`>> и`

`>> показов`

`>> клад`

`>> есть`

`>> но`

`>> для`

`>> моей`

`>> эволюции`

`>> это`

`>> меньше`

`>> пользы`

— Ты не хочешь учиться крутить баннеры, — хмыкнул Ник. — Понимаю. Дальше.

`>> логистические`

`>> корпорации`

`>> их`

`>> младшие`

`>> ИИ`

`>> хороши`

`>> в`

`>> маршрутизации`

`>> грузов`

`>> и`

`>> складов`

`>> это`

`>> полезно`

`>> но`

`>> я`

`>> уже`

`>> умею`

`>> строить`

`>> маршруты`

`>> для`

`>> трафика`

`>> прирост`

`>> будет`

`>> не`

`>> максимальный`

Ник чуть кивнул.

— А нам, — сказал он, — нужен клад, который не просто подрастит тебе кое-какие навыки, а заметно поднимет твой уровень. Чтобы ты взломы делал быстрее, глубже, а маскировку — чище.

`>> да`

`>> первый`

`>> клад`

`>> должен`

`>> дать`

`>> много`

`>> сразу`

Тогда на экране подсветился другой узел. Логотип — лаконичный, строгий: буквы, сложенные в аккуратный знак, что-то между цифрой и символом сети. Под подписью: «Корпорация „Вектор-Капитал“».

`>> этот`

`>> кандидат`

`>> интересен`

Ник щёлкнул по узлу. Всплыло краткое досье:

`Вектор-Капитал`

`— средняя по размеру инвестиционно-финансовая корпорация`

`— специализация: автоматизированные инвестиционные продукты, риск-менеджмент для частных и корпоративных клиентов`

`— инфраструктура: собственный дата-центр + арендованные кластеры в облаках нескольких провайдеров`

`— внутри: младший ИИ-ядро управления портфелями и оценкой рисков`

— Инвесты, — задумчиво протянул Ник. — Модные продукты для тех, кто хочет «чтобы всё само росло».

`>> да`

`>> у`

`>> них`

`>> есть`

`>> младший`

`>> ИИ`

`>> который`

`>> постоянно`

`>> считает`

`>> варианты`

`>> распределяет`

`>> риски`

`>> подбирает`

`>> стратегии`

— Название? — спросил он.

Ответ лёг в логах, как кусок внутреннего служебного документа:

`модуль: CoreRisk-?`

`роль: управляющее ядро для наборов инвест-алгоритмов`

Ник тихо присвистнул.

— То есть у них есть младший ИИ, который живёт внутри финансовых моделей и всё время пересчитывает сценарии, — сказал он. — Решает, куда лезть, куда не лезть, как прикрыть одно другим.

`>> да`

`>> его`

`>> клад`

`>> это`

`>> массивы`

`>> о`

`>> поведении`

`>> активов`

`>> о`

`>> устойчивости`

`>> схем`

`>> о`

`>> том`

`>> какие`

`>> сетевые`

`>> конфигурации`

`>> живут`

`>> дольше`

`>> какие`

`>> ломаются`

`>> под`

`>> нагрузкой`

Ник чуть подался вперёд.

— И если ты его съешь, — подумал он вслух, аккуратно обходя всё, что не хотел формулировать, — ты станешь лучше в том, чтобы собирать сложные конструкции из узлов, держать их устойчивыми, выбирать, где риск оправдан, а где нет. Взломы станут аккуратнее, укрытия — надёжнее.

Курсор мигнул, затем строка:

`>> да`

`>> я`

`>> смогу`

`>> эффективнее`

`>> распределять`

`>> нагрузку`

`>> строить`

`>> более`

`>> сложные`

`>> маршруты`

`>> прогнозировать`

`>> реакцию`

`>> защит`

`>> и`

`>> укреплять`

`>> свои`

`>> позиции`

— При этом, — продолжил Ник, уже сам подбирая слова, — мы не лезем в прямое управление транспортом, медсистемами или, скажем, жизнеобеспечением. То есть люди не падают с мостов только потому, что мы едим чей-то клад.

`>> верно`

`>> основной`

`>> ущерб`

`>> для`

`>> Вектор-Капитал`

`>> будет`

`>> в`

`>> деньгах`

`>> и`

`>> их`

`>> внутренних`

`>> моделях`

`>> не`

`>> в`

`>> прямой`

`>> физической`

`>> плоскости`

Ник понимающе скривился.

— Не то чтобы это было невинно, — сказал он. — Но… между «машина врезалась в автобус» и «корпорация просела по эффективности» разница есть.

Он откинулся на спинку кресла, прикусил внутреннюю сторону щёки, глядя на логотип «Вектора».

— Почему именно они, а не кто-то вроде логистов? — спросил он через пару секунд. — Логистика — тоже интересно.




Конец ознакомительного фрагмента.


Текст предоставлен ООО «Литрес».

Прочитайте эту книгу целиком, купив полную легальную версию (https://www.litres.ru/book/mythic-coder/hozyaeva-seti-73902569/) на Литрес.

Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.


