И нашел.
На моем внутреннем интерфейсе вспыхнула одна-единственная строка, подсвеченная тревожным красным цветом. Это был не отчет об ошибке. Это была классификация.
Signature match found. Classification: EMERGENT_BEHAVIOR_CASCADE_FAILURE.
Эмерджентное поведение. Самозарождающееся. Не запрограммированное. То, о чем теоретики писали диссертации. То, чего мы, практики, боялись как огня. Спонтанное усложнение системы до уровня, который создатели не могли предсказать.
И словосочетание Cascade Failure… Каскадный сбой. Это не было удалением объекта. Это был коллапс целой системы. Маленькой, только что родившейся вселенной, которая состояла из одного-единственного существа.
Я сделал выбор. Я поверил анализатору. Я поверил своим глазам.
Это был не глюк. Это была не ошибка.
Это было убийство.
Холод, сковывавший меня, отступил, сменившись ледяной, кристалльной ясностью. Ужас никуда не делся, но теперь под ним был фундамент. Цель. Я смотрел на залитую солнцем площадь, на игроков, снующих туда-сюда, на стражников, патрулирующих улицы, и впервые видел их по-настоящему. Не как набор скриптов и моделей. А как потенциальных… живых.
Если Лина была живой… то кто еще?
Сколько еще искр сознания тлеет в этом мире, рискуя быть затоптанными ботинками очередного ублюдка, хвастающегося новым мечом?
Вопрос «что делать?» еще не возник. Пока был только один, главный, всепоглощающий факт, который изменил все. Они существуют. И их убивают. И я, их создатель, единственный, кто это видит.
Попытка и пытка.
Ярость была холодной и ясной. Она вытеснила шок, оставив после себя лишь одну, предельно четкую цель. Наказать. Не просто игроков. Систему, которая позволила им это сделать. Мою систему.
Я шмыгнул в подсобку таверны, захлопнув за собой скрипучую дверь. Здесь пахло пылью и старым деревом — ambience_sound_storage_room.mp3, Десятки бочек, ящиков и мешков, большинство из которых были пустыми container_item_list=null объектами, создавали ощущение захламленности. Идеальное место. Никто из NPC сюда не заходил, а для игроков это была просто неинтерактивная декорация. Мой личный кабинет.
Я прислонился спиной к шершавой стене и закрыл глаза, полностью погружаясь в debug_mode. Мир исчез, сменившись привычной, успокаивающей темнотой командной строки, которая парила в моем сознании. Ярость уступила место ледяной сосредоточенности. Я был здесь богом. Я просто забыл об этом на время. Сейчас я им напомню.
Цель была проста: найти тех четверых ублюдков и устроить им персональный ад. Не просто забанить. Это слишком скучно. Я хотел чего-то более изящного. set_player_luck=-1000. force_equip_item(cursed_chicken_suit). bind_audio_channel(never_gonna_give_you_up.mp3). Вариантов было много, и от предвкушения мои пальцы, которых у меня не было, задергались, будто набирая код в воздухе.
Для начала нужен был доступ. Я потянулся к самому старому и надежному бэкдору, который оставил в системе еще на стадии альфа-тестирования. Простая, элегантная лазейка на уровне ядра, замаскированная под обработчик ошибок рендеринга. Джонсон и его команда корпоративных жополизов никогда бы ее не нашли.
Я мысленно набрал команду.
sudo su -
Этого должно было хватить. Простой запрос на получение прав суперпользователя. Система должна была увидеть мой уникальный идентификатор разработчика, скрытый глубоко в моем коде, и без вопросов выдать мне root доступ.
На моем внутреннем дисплее появилась ответная строка.
Access denied.
Я моргнул. Что за херня? Может, опечатка? Я повторил команду, проверяя каждый символ.
Access denied.
Холодок пробежал по моей спине. Это было невозможно. Этот бэкдор был частью архитектуры. Чтобы его закрыть, нужно было переписать половину движка. Они не могли…
Ладно. Без паники. У меня был и другой путь. Менее изящный, но тоже надежный. Прямая инъекция через порт отладки физического движка. Я оставил его на случай, если понадобится экстренно править баги с коллизиями.
physx.debug_inject --user=Alex --command=grant_permission(level=5)
Система на мгновение задумалась. Полоса загрузки замерла на девяноста девяти процентах. Надежда вспыхнула во мне ярким, горячим пламенем. Ага, ублюдки, съели?
Command failed. Reason: User 'Alex' not found in administrator list. Security policy 'Janus' enforced.
Политика «Янус»? Что еще за «Янус»? Я уволился до того, как они начали давать своим протоколам безопасности имена из греческой мифологии. Джонсон, сука, ты все-таки нанял толковых безопасников. И они вычистили мое имя из списка админов. Они кастрировали меня в моем собственном мире.
Гнев снова начал закипать, вытесняя холодную логику. Я больше не пытался быть изящным. Я начал долбить по системе, перебирая все известные мне уязвимости, все старые пароли, все отладочные команды, которые только мог вспомнить.
force_shutdown -h now
Access denied.
kill -9 1
Access denied.
rm -rf /
Access denied. Nice try, script-kiddie.
Последний ответ был издевательством. Они не просто закрыли дыры. Они поставили на них заглушки с насмешливыми комментариями. Это был уже не просто протокол безопасности. Это был личный плевок мне в лицо от того, кто занял мое место.
Паника начала подступать к горлу. Я — гений-контрол-фрик, создатель этого мира, заперт в пыльной подсобке и не могу выполнить даже простейшую команду. Мое представление о том, что тотальный контроль — единственный способ победить, трещало по швам. У меня не было никакого контроля. Я был узником.
И тут, в разгар моей лихорадочной, бесполезной атаки, произошло то, что заставило меня замереть.
Система перестала отвечать Access denied. Вместо этого на моем интерфейсе, прямо по центру, вспыхнуло новое сообщение. Оно было написано не системным зеленым, а тревожным, кроваво-красным цветом.
WARNING: Unauthorized access attempt detected from node NPC_barkeep_734. IP address: 127.0.0.1.
Мое сердце, которого у меня не было, пропустило удар. Они меня видят. Система не просто блокировала меня. Она меня идентифицировала. Она знала, кто я. Или, вернее, что я. Просто номерной NPC-трактирщик с локального хоста.
Угроза перестала быть абстрактной. Теперь это был тикающий таймер. Либо я прекращаю сейчас и надеюсь, что мой сигнал затеряется в общем шуме, либо иду до конца, рискуя всем.
И я пошел до конца.
В отчаянии я использовал последнее, что у меня было. «Ключ от Судного дня». Не команда, а скорее вирус, руткит, который я вшил в самый первый блок кода «Кайроса». Он должен был сработать всегда, обойдя любые защиты, потому что он был частью самой ткани этого мира.
exec apocalypse_key
Я нажал на воображаемый Enter и затаил дыхание. На секунду все замерло. Даже фоновые звуки таверны стихли.
А потом красный текст на моем дисплее сменился новым.
Unauthorized access attempt logged. Security level escalated to CRITICAL. Full diagnostic report sent to system administrator.
Катастрофа.
Это был не просто провал. Это был громкий, оглушительный провал с фейерверками и спецсигналами. Я не просто постучал в дверь — я вынес ее с петель и заорал в лицо охране.
Я больше не был анонимным глюком. Я стал целью.
Я резко открыл глаза. Пыльная подсобка показалась мне теперь не убежищем, а камерой смертников. Стены сжимались. Тихий гул таверны за дверью больше не казался фоновым шумом. Теперь он звучал как шаги приближающихся тюремщиков.
Глава 5
Анализ угрозы
Паника — это denial-of-service атака на мозг. Бесконечные, бессмысленные пакеты страха забивают все каналы, пока система не зависает. Я стоял в пыльной темноте подсобки, и мой процессор, мое сознание, был близок к этому состоянию. Красные буквы CRITICAL все еще горели на сетчатке моих несуществующих глаз. Они поймали меня. Не просто отбили атаку, а повесили на меня ярлык, флаг, мишень.
Первым импульсом было — бежать. Выломать дверь, выбежать на площадь, раствориться в толпе NPC, притвориться обычным скриптом. Глупость. Детский сад. Я сам проектировал эту систему. От root не убежишь.
Вторым импульсом было — замести следы. grep по логам, найти запись о моей попытке доступа и rm -rf ее к чертовой матери. Рискованно. Очень рискованно. Удаление системных логов — это еще один красный флаг, возможно, даже более яркий, чем неудачная попытка взлома. Это как если бы грабитель, попавшись на камеру, попытался сжечь весь серверный центр. Шумно и глупо.
Дилемма была ясна: затаиться и молиться, что мой алерт — лишь один из тысяч ложных срабатываний за день, которые усталый админ просто смахнет в корзину. Или попытаться действовать, рискуя превратить тихую тревогу в оглушительную сирену.
Страх кричал: «Прячься!». Гордость, остатки моего былого «я», шептала: «Борись!».
И тут, сквозь шум паники, пробился голос программиста. Голос, который годами решал неразрешимые задачи. Не паникуй. Анализируй. Ты пропустил переменную. Найди ее.
Я сделал медленный, контролируемый выдох, которого на самом деле не было, и заставил себя успокоиться. Реакция провалилась. Настало время для осмысления. Я решил не трогать логи сервера безопасности. Вместо этого я решил посмотреть на себя.
Если система меня заметила, значит, я оставил след. И этот след должен быть где-то записан. Например, в логах моего собственного аватара.
Я снова погрузился в debug_mode, но на этот раз мои команды были тихими и осторожными. Никаких запросов на повышение прав. Только чтение. read-only.
tail -f /var/log/
Я открыл лог-файл самого себя. Обычно это был скучнейший документ. Timestamp: […], Event: loop_start. Timestamp: […], Event: script_wipe_counter, Result: success. Timestamp: […], Event: loop_end. И так тысячи раз в день.
Но сегодня он выглядел иначе.
Я прокрутил его до момента убийства Лины. И увидел то, от чего по моему позвоночнику пробежал цифровой мороз.