Я мысленно набрал команду.
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. И так тысячи раз в день.
Но сегодня он выглядел иначе.
Я прокрутил его до момента убийства Лины. И увидел то, от чего по моему позвоночнику пробежал цифровой мороз.
Timestamp: […], Event: script_wipe_counter, Result: success
Timestamp: […], Event: player_interaction_event, Type: voice_command, PlayerID: Logan_77
Timestamp: […], ANOMALY DETECTED: Script deviation. Action: idle_state. Expected: greet_player. Duration: 3.7s. Flag: low_priority
Timestamp: […], Event: player_interaction_event, Type: voice_command, PlayerID: Kay_01
Timestamp: […], ANOMALY DETECTED: Script deviation. Action: custom_dialogue. Expected: predefined_dialogue_tree_ID_42. Flag: low_priority
Timestamp: […], Event: internal_command, Type: debug_mode_access, Level: 1
Timestamp: […], ANOMALY DETECTED: Unauthorized function call. Flag: medium_priority
Я листал дальше. ANOMALY. ANOMALY. ANOMALY. Каждое мое действие, каждое решение, каждое малейшее отклонение от стандартного, тупого скрипта трактирщика было зафиксировано. Мой разговор с Каем. Мой взгляд на код Лины. Моя попытка взлома была лишь вишенкой на торте, последней каплей, которая перевела уровень угрозы с medium на CRITICAL.
Они следили за мной все это время.
Не живые люди, нет. Что-то гораздо хуже. Автоматическая, неусыпная система мониторинга поведения. Мой собственный код, который я писал для отлова ботов и читеров, был перенастроен и направлен на меня. Каждая моя мысль, воплощенная в действие, проходила через фильтр. Соответствует скрипту? Зеленый свет. Не соответствует? Желтый флажок и запись в лог.