Первый угон в Интернете: Один доброволец чуть не обрушил Linux
Пятьсот миллисекунд.
Полгоря секунды.
Предел, на который интернет не был захвачен.
Март 2024 года. San Francisco.
Тридцативосьмилетний инженер Microsoft по имени Andres Freund проводит бенчмаркинг PostgreSQL на Debian системе разработки. Это рутинная задача. Freund является коммиттером проекта PostgreSQL. Он тестирует производительность базы данных на предрелизных Linux дистрибутивах в рамках своей регулярной работы.
Что-то не так с тестовой средой.
Неудачные попытки входа по SSH — те самые, которые постоянно обрушиваются на любой общедоступный сервер, автоматизированные боты, пытающиеся подобрать случайные комбинации имени пользователя и пароля — используют гораздо больше CPU, чем должны. Неудачный вход должен завершаться быстро. Эти не завершаются быстро.
Freund замечает это.
Он исследует дальше. Успешные входы по SSH на его собственной локальной машине занимают на пятьсот миллисекунд больше, чем базовые приблизительно сто миллисекунд.
Полгоря секунды.
Freund запускает соединение под Valgrind, инструментом для отладки памяти. Valgrind выдает ошибки, указывающие на liblzma — библиотеку сжатия, которую SSH демону нет законных оснований вызывать.
Вот тогда расследование становится срочным.
В течение следующих нескольких дней Freund отслеживает ошибки. Он обнаруживает, что процесс sshd на его тестовой машине выполняет код из liblzma во время аутентификации. Он анализирует исходный код xz-utils в git репозитории. Исходный код чист. Но релизный tarball — сжатый архив исходного кода, который Debian фактически загружает и собирает — содержит файл build-to-host.m4, которого нет в исходном коде git.
Этот файл содержит обфусцированный скрипт. Скрипт декодирует bash скрипт, спрятанный внутри тестового файла bad-3-corrupt_lzma2.xz — файла, который маскируется под поврежденный тестовый ввод для обработки ошибок библиотеки сжатия. Bash скрипт декодирует второй файл, good-large_compressed.lzma, используя кастомную обфускацию в сочетании с RC4 дешифрованием.
В конце цепочки получается скомпилированный разделяемый объект.
Разделяемый объект — это бэкдор.
Вечером двадцать девятого марта 2024 года — по его собственному рассказу, слушая подкаст по безопасности во время перерыва на готовку — Andres Freund публикует свои находки в список рассылки oss-security на Openwall.
В течение 24 часов Red Hat присваивает ему номер CVE. Оценка серьезности — десять целых ноль. Наивысшая возможная. CISA выпускает экстренное предупреждение. Debian, SUSE, Fedora, Arch и Kali откатывают затронутые пакеты. GitHub приостанавливает учетную запись сопровождающего, который внес бэкдор.
Бэкдор, как оказалось, должен был быть включен в стабильные Linux дистрибутивы примерно через две недели.
Freund обнаружил его случайно.
Это досье о том, что произошло. О том, что почти произошло. И о том, что представляла собой операция.
Целью атаки был xz-utils.
xz-utils — это набор инструментов для сжатия. Его основной инструмент, команда xz, создает файлы .xz — Unix эквивалент файлов .zip, с более высокими коэффициентами сжатия. Под этим инструментом командной строки находится библиотека liblzma, которая предоставляет алгоритм сжатия другим программам, которым это необходимо.
liblzma загружается, прямо или косвенно, огромным количеством системного программного обеспечения Linux. Менеджеры пакетов линкуются с ней. Системные утилиты линкуются с ней. И — через цепочку, специально разработанную злоумышленниками — демон OpenSSH линкуется с ней.
Цепочка выглядит так. На большинстве основных Linux дистрибутивов sshd патчится для поддержки механизма уведомления служб systemd, называемого sd_notify. Этот патч заставляет sshd загружать библиотеку libsystemd. А libsystemd, в свою очередь, загружает liblzma.
Результат: на большинстве производственных Linux серверов демон SSH — процесс, который принимает удаленные входы — загружает библиотеку сжатия при запуске, хотя SSH не сжимает аутентификационный трафик.
Компрометация библиотеки сжатия компрометирует демон, который контролирует удаленный доступ к каждому Linux серверу в интернете.
На момент почти развертывания бэкдора Linux работал примерно на девяноста шести процентах из миллиона лучших веб-серверов в мире. На всех пятистах самых мощных суперкомпьютерах мира. Примерно на девяноста двух процентах виртуальных машин в Amazon Web Services, Google Cloud и Microsoft Azure. Android, который работает примерно на восьмидесяти пяти процентах смартфонов в мире, построен на ядре Linux.
Бэкдор xz-utils, если бы он был включен в стабильные дистрибутивы, присутствовал бы в значительной части всего вышеперечисленного.
Alex Stamos, бывший главный специалист по безопасности в Facebook, описал предполагаемый результат одной фразой: главный ключ к любому SSH серверу на Земле.
Именно поэтому CVE получил оценку десять целых ноль.
Технический дизайн бэкдора стоит понять точно.
Злоумышленник воспользовался тем фактом, что релизные tarball'ы содержат автоматически сгенерированные файлы, которых нет в версионируемом git источнике. В частности, файл build-to-host.m4 в tarball'е содержал одну строку, которая была изменена для внедрения обфусцированного скрипта на этапе configure процесса сборки.
Это означало, что любой, кто читал исходный код git, не мог увидеть бэкдор. Любой, кто собирал из git, не мог его вызвать. Только Linux дистрибутивы, которые собираются из выпущенных tarball'ов — что фактически относится ко всем из них — выполняли бы инъекцию.
Цепочка инъекции состояла из трех этапов. На первом этапе извлекался bash скрипт из файла, замаскированного под поврежденный тестовый ввод для сжатия. На втором этапе этот bash скрипт использовался для декодирования второго тестового файла в скомпилированный разделяемый объект. На третьем этапе разделяемый объект связывался со скомпилированным бинарным файлом liblzma.
Разделяемый объект использовал законную функцию glibc под названием IFUNC — непрямые резолверы функций — для перехвата специфической функции OpenSSH под названием RSA_public_decrypt.
RSA_public_decrypt — это функция OpenSSH, которая проверяет RSA подписи во время аутентификации по сертификату. Каждый раз, когда клиент пытается подключиться, используя RSA сертификат, sshd вызывает эту функцию для проверки подписи.
При активном бэкдоре sshd вместо этого вызывал код злоумышленника.
Код злоумышленника проверял открытый RSA модуль — большое целочисленное значение, передаваемое в сертификате клиента. Обычно это значение используется в стандартной RSA верификации. В бэкдоре это фактически был контейнер для полезной нагрузки. Код дешифровал полезную нагрузку, используя жестко закодированный симметричный ключ ChaCha20. Затем он проверял подпись дешифрованной полезной нагрузки, используя жестко закодированный открытый ключ Ed448.
Если подпись была проверена — что означало, что полезная нагрузка была подписана закрытым ключом злоумышленника — код выполнял встроенные shell команды от имени root.
Это то, что исследователи безопасности называют контролируемым удаленным выполнением кода. Бэкдор активируется только тогда, когда злоумышленник предоставляет действительную криптографическую подпись. Обычный злоумышленник, случайно наткнувшийся на бэкдор, не смог бы его использовать. Только владелец закрытого ключа Ed448 мог бы его активировать.
Эта деталь имеет значение. Криминальный актор, создающий уязвимость для продажи, делает ее пригодной для использования тем, кто ее покупает. Государственный актор, создающий возможность постоянного доступа, делает ее эксклюзивной. Только они, и те, кого они явно уполномочивают, могут использовать ключ.
Бэкдор xz-utils был разработан для эксклюзивного использования. Это не была уязвимость. Это был стратегический актив.
Операция по созданию бэкдора началась двадцать шестого января 2021 года.
В этот день был создан аккаунт GitHub под именем JiaT75. Отображаемое имя было Jia Tan. У аккаунта не было предыдущего цифрового следа. Никакого присутствия в социальных сетях под этим именем. Никаких выступлений на конференциях. Никаких предыдущих open-source вкладов. Никаких упоминаний в утечках данных. Имя, по-видимому, является псевдонимом.
Первый публичный вклад JiaT75 в xz-utils произошел двадцать девятого октября 2021 года — через девять месяцев после создания аккаунта. Это был незначительный патч для файла конфигурации редактора. Безобидный. Незначительный. Такой вклад, который устанавливает присутствие, не привлекая внимания.
В течение следующих двух лет и пяти месяцев JiaT75 был автором более пятисот коммитов в open-source проекты. Подавляющее большинство из них были законными улучшениями — ревью кода, переводы, поддержка непрерывной интеграции, исправления ошибок. Полезная работа. Действительно полезная.
Приблизительно восемь из этих коммитов были вредоносными.
Соотношение имеет значение. Шестьдесят к одному. На каждый вредоносный коммит оператор производил шестьдесят единиц реальной, полезной работы. Именно это сделало шаблон невозможным для обнаружения с помощью статистического анализа аномалий. Злоумышленник потратил два с половиной года целенаправленных усилий, производя действительно ценные вклады, исключительно для того, чтобы накопить доверие, необходимое для совершения восьми изменений, которые в конечном итоге имели значение.
Операция не работала в одиночку.
Начиная с апреля 2022 года, пользователь, называющий себя Jigar Kumar, появился в списке рассылки xz-devel. До апреля 2022 года у Kumar'а не было истории в этом списке. Все его присутствие состояло из электронных писем с давлением на ведущего сопровождающего проекта, жалуясь на медленное время отклика и требуя добавления нового сопровождающего.
В мае 2022 года появилась вторая учетная запись — Dennis Ens, которая интересовалась статусом поддержки Java версии xz-utils и продолжала оказывать дополнительное давление.
Обе учетные записи имели одинаковый профиль. Отсутствие цифрового присутствия до 2022 года. Отсутствие активности за пределами списка рассылки xz-devel. Отсутствие участия в каких-либо других проектах до или после кампании давления.
В феврале 2024 года — за несколько недель до коммита бэкдора — появилась третья учетная запись. Hans Jansen. Роль Jansen'а заключалась в давлении на сопровождающих Debian с целью как можно скорее принять скомпрометированную версию xz-utils. Двадцать пятого марта 2024 года Hans Jansen подал отчет об ошибке Debian, прямо требуя обновления.
Через четыре дня Andres Freund опубликовал свои выводы в oss-security.
Две дополнительные поддерживающие учетные записи — krygorin4545 и misoeater91 — оказывали фоновое давление в различных ветках, следуя той же схеме. Отсутствие присутствия до операции. Участие только в определенные периоды давления. Исчезновение после достижения целей.
Анализ Kaspersky после инцидента показал, что географическое оформление подставных имен было непоследовательным — сингапурским, европейским, индийским — что предполагает, что оператор намеренно рассеял прикрытия, чтобы избежать видимости координации. Но поведенческий шаблон — время появления, синхронизированные точки давления, коллективное исчезновение после каждой цели — указывал на одного оператора или тесно скоординированную команду.
Давление сработало.
Двадцать девятого июня 2022 года ведущий сопровождающий xz-utils — финский разработчик программного обеспечения по имени Lasse Collin — ответил на список рассылки и заявил, что Jia Tan будет играть более важную роль в проекте в будущем и, на практике, уже функционирует как со-сопровождающий.
Это была передача дел.
Чтобы понять, что только что произошло, необходимо понять, каково было положение Lasse Collin.
Collin поддерживал xz-utils в одиночку с 2009 года. Проект был неоплачиваемым. Он работал над ним в свое свободное время. Ранее в том же месяце, в ответе на список рассылки в июне 2022 года, Collin публично признал, что он боролся с долгосрочными проблемами психического здоровья. Он называл проект, по его собственным словам, неоплачиваемым хобби-проектом.
Lasse Collin не несет ответственности за произошедшее. Сообщество безопасности единодушно в этом вопросе. Collin занимался неоплачиваемой хобби-работой. Он боролся с документированными проблемами со здоровьем. Он находился под постоянным, скоординированным давлением со стороны того, что оказалось государственной разведывательной операцией. Система, которая поставила его в такое положение, подвела его. Он не подвел систему.
То, что эксплуатировала операция, было не компетентностью Collin'а. Это было его структурное положение — один, без оплаты, справляющийся с реальными стрессорами, ответственный за поддержку инфраструктуры, используемой миллиардами людей, без институциональной поддержки.
Профессиональный злоумышленник выявил эту структуру и нацелился на нее.
После завершения передачи дел началась подготовка инфраструктуры.
В октябре 2022 года Jia Tan был добавлен в организацию Tukaani на GitHub. В декабре 2022 года он создал организационную структуру репозитория и сделал свой первый релиз. В марте 2023 года он изменил основной адрес электронной почты для контактов по безопасности в Google's OSS-Fuzz — автоматизированной платформе сканирования уязвимостей — с адреса Lasse Collin'а на свой собственный. С этого момента любое сообщение об ошибке, связанной с безопасностью, достигало Jia Tan'а раньше, чем кого-либо другого.
В июне 2023 года Jia Tan внедрил инфраструктуру IFUNC резолверов в liblzma. Коммиты выглядели как законная работа по оптимизации производительности. Ретроспективно, это были хуки, через которые бэкдор в конечном итоге будет внедрен.
В июле 2023 года Jia Tan открыл pull request в OSS-Fuzz, чтобы отключить IFUNC фаззинг для xz. Изменение было направлено на предотвращение обнаружения фаззинг-тестированием аномалий в бэкдоре на основе IFUNC, когда он в конечном итоге будет выпущен.
В феврале 2024 года отдельный коммит нарушил обнаружение Landlock системой сборки — функцией безопасности ядра Linux, которая ограничивает привилегии процессов. Коммит отключил собственную песочницу xz на системах, которые в противном случае принудительно применяли бы ее.
Двадцать третьего февраля и девятого марта 2024 года сам бэкдор был внесен в два этапа, упакованный как часть релизов xz-utils 5.6.0 и 5.6.1.
Девятнадцать дней спустя Andres Freund заметил 500-миллисекундную задержку SSH.
Исследователи, анализирующие метаданные коммитов, оставленные операцией, заметили закономерность.
Отметки времени коммитов Jia Tan'а в основном совпадали с часовыми поясами Центральной Европы или Восточной Европы. Рабочие часы соответствовали примерно с девяти утра до пяти вечера по Центральноевропейскому времени. Активность продолжалась во время крупных китайских государственных праздников и приостанавливалась во время нескольких европейских.
Имя и заявленная операционная география были Восточноазиатскими. Фактический рабочий шаблон был европейским.
Это то, что аналитики разведывательной деятельности называют утечкой подписи. Оператор более тридцати месяцев поддерживал прикрытие. Но автоматические отметки времени, встроенные в каждый git коммит, периодически раскрывали фактическое местоположение машины, которая делала коммит.
Три возможных атрибуции появились в публичном анализе от исследователей безопасности с соответствующим опытом.
Американский исследователь безопасности Dave Aitel, бывший компьютерный ученый NSA, публично оценил, что операция соответствует шаблону, приписываемому APT29 — продвинутой постоянной угрозе, приписываемой правительствами United States и United Kingdom Службе внешней разведки Russia. APT29 известна длительными шпионскими кампаниями, включая компрометацию цепочки поставок SolarWinds, раскрытую в 2020 году. Рабочие часы, совпадающие с часовым поясом Moscow, соответствуют шаблону Jia Tan'а.
Costin Raiu — бывший директор Global Research and Analysis Team Kaspersky, с тридцатилетним опытом атрибуции сложных операций — выявил трех правдоподобных кандидатов в интервью подкасту в феврале 2026 года. APT29 Russia была одним из них. APT41 China, связанная с Ministry of State Security, была вторым. Lazarus Group North Korea, уже упоминавшаяся в более ранних материалах Fragment Zero, была третьей.
По состоянию на апрель 2026 года ни одна разведывательная служба публично не приписывала операцию. Никаких обвинений не было предъявлено. Никаких арестов не было произведено. Настоящая личность Jia Tan'а остается неизвестной.
Что не вызывает споров среди исследователей, обладающих соответствующим опытом, так это то, что терпение операции, операционная безопасность, криптографическая сложность и ресурсные затраты соответствуют разведывательной службе национального государства — или близкому функциональному эквиваленту — и несовместимы с деятельностью индивидуального преступника или хактивиста.
Это не была работа одинокого хакера.
Операция xz-utils стала возможной благодаря структурной особенности того, как современная технологическая цивилизация строит свою критическую инфраструктуру.
Программное обеспечение, на котором работает интернет, в значительной степени было создано добровольцами, работающими в свободное время. Компании, которые получают прибыль от этого программного обеспечения, вернули лишь небольшую часть его экономической ценности.
xz-utils поставлялся с каждым основным Linux дистрибутивом и работал на огромной доле мировых серверов. Его сопровождающий был неоплачиваемым. OpenSSL, библиотека, обеспечивающая криптографию для большей части интернета, была печально известна нехваткой персонала до уязвимости Heartbleed в 2014 году. Log4j, Java библиотека логирования, стоявшая за уязвимостью Log4Shell в 2021 году, поддерживалась горсткой добровольцев — за глобальной корпоративной инфраструктурой.
В каждом случае библиотека, рассматриваемая как критическая инфраструктура многомиллиардными компаниями, поддерживалась ресурсами хобби-проекта.
Операция xz-utils не изобрела эту структурную уязвимость. Она ее эксплуатировала.
Одиннадцатого апреля 2024 года — через две недели после раскрытия Freund'а — U.S. Cybersecurity and Infrastructure Security Agency опубликовало официальное заявление, признающее структурную проблему. Позиция CISA: бремя обеспечения безопасности open-source инфраструктуры не может ложиться на отдельных неоплачиваемых сопровождающих, и компании, использующие open-source программное обеспечение, должны вносить свой вклад, либо финансово, либо временем разработчиков, для создания устойчивой экосистемы.
Рекомендации были необязательными. Это были лучшие практики. Они зависели от добровольного принятия компаниями, чья структура стимулов исторически не вознаграждала инвестиции.
В течение месяца Linux Foundation и Open Source Security Foundation опубликовали совместное предупреждение о том, что аналогичные попытки захвата с использованием социальной инженерии уже ведутся в отношении нескольких других open-source проектов. OpenJS Foundation — которая поддерживает Node.js, jQuery и связанную JavaScript инфраструктуру — публично раскрыла, что получила скоординированную кампанию давления по тому же шаблону, что и xz-utils, и отклонила ее только потому, что раскрытие xz-utils научило сообщество, на что обращать внимание.
Отчет Linux Foundation за 2026 год задокументировал более широкий шаблон в экосистеме. Основной вывод отчета: то, что произошло с xz-utils, не было единичным инцидентом. Это был метод. Метод применяется в масштабе. Большинство успешных обнаружений происходят потому, что случай xz-utils предоставил сигнатуру для сопоставления.
Сколько существует неудачных обнаружений — операций, которые уже ведутся, но еще не были пойманы — по своей сути невозможно подсчитать из общедоступных источников.
Два эпизода назад в Fragment Zero досье по гипотезе Dark Forest закрылось наблюдением. Доктрина, которую Liu Cixin формализовал в 2008 году — тишина как выживание, сокрытие как стратегическая необходимость, раскрытие как экзистенциальная угроза — является старейшим принципом операционной безопасности в истории человеческих конфликтов.
Каждая сила, которая когда-либо действовала в условиях неопределенной угрозы и асимметричных возможностей, пришла к одному и тому же выводу.
Будьте тихи. Двигайтесь осторожно. Предполагайте наблюдение.
Операция xz-utils — это Dark Forest, реализованный внутри отношений человеческого доверия.
Злоумышленник не проникал через файрвол. Злоумышленник не эксплуатировал уязвимость нулевого дня. Злоумышленник не обходил криптографическую защиту. Злоумышленник сделал нечто гораздо более простое. Злоумышленник три года скрывался на виду, производя полезную работу, создавая подлинное доверие, ведя себя точно так же, как любой другой полезный участник, готовя — тихо, терпеливо, со стратегическим терпением, невообразимым для большинства технических организаций — момент, когда подготовленная инфраструктура будет использована.
Атака удалась почти полностью благодаря ее скрытности. Она была обнаружена не каким-либо инструментом безопасности, не каким-либо аудитом, не какой-либо институциональной защитой, а случайным наблюдением одного инженера пятисот миллисекунд необъяснимой задержки.
Заявление Andres Freund'а о своем собственном открытии, опубликованное в Mastodon через несколько недель после раскрытия, должно закрыть досье.
Полагаться на удачу в будущем — плохая стратегия.
Бэкдор xz-utils был пойман.
Версия операции Dark Forest — та, которая нацелена на доверительные отношения, а не на компьютерные системы — осуществляется прямо сейчас, в этот момент, против неопределенного числа других критически важных open-source проектов. Шаблон работает. Экономические стимулы, которые заставляют его работать, существенно не изменились. Институциональные реакции были реальными, но недостаточными.
Инженеру, который найдет следующий, тоже понадобится удача. Ему нужно будет смотреть на правильный бенчмарк в правильное время в правильной системе. Ему нужно будет достаточно заботиться, чтобы отследить аномалию до ее источника. Ему нужно будет опубликовать свои находки до того, как принципал операции уже отправил полезную нагрузку в стабильные релизы.
Им понадобится, в частности, пятьсот миллисекунд.
Этот интервал был тем, что стояло между интернетом в марте 2024 года и единственным криптографическим ключом, принадлежащим неизвестному актору, который разблокировал бы каждый Linux сервер, работающий с SSH на Земле.
Fragment Zero будет отслеживать это досье.
Досье не закрывается. Оно ждет.