Команда разработчиков свободной системы управления контентом Plone раскрыла детали сложного инцидента безопасности, который произошел в их организации на GitHub. Атака, начавшаяся в декабре, была нацелена на разработчиков и включала в себя скрытое внедрение вредоносного кода через операцию принудительной перезаписи истории изменений (force push). Этот случай подчеркивает важность строгого контроля за доступом и настройки правил защиты в репозиториях.
Инцидент был инициирован после компрометации учетной записи одного из давних участников проекта. Как сообщил координатор по безопасности Plone Мауритс ван Рис в письме в список рассылки oss-security, злоумышленники, получив контроль, добавили в аккаунт новый персональный токен доступа (Personal Access Token, PAT) и выждали около двух месяцев перед активными действиями. Первые подозрительные коммиты были обнаружены 7 января, однако позже выяснилось, что атака затронула пять репозиториев проекта, включая ключевые компоненты вроде "plone/volto" и "plone/plone.app.mosaic".
Особенностью атаки стало активное использование операции "force push", которая позволяет полностью перезаписать историю ветки в удаленном репозитории. В отличие от обычных коммитов, такие действия не всегда сразу заметны. Например, в репозитории "plone.app.mosaic" злоумышленникам удалось подменить основную ветку "master". Они создали коммит, датированный задним числом 18 декабря, который внешне выглядел как рутинное обновление номера версии. Однако внутри файла "prettier.config.js" после множества пробелов был скрыт обфусцированный вредоносный JavaScript-код. В интерфейсе GitHub он не отображался по умолчанию, а для его просмотра требовалось нажать кнопку "Load Diff".
Как отметил ван Рис, атака была нацелена в первую очередь на разработчиков, а не на конечных пользователей. Вредоносный код активировался в процессе сборки проекта. После выполнения он обеспечивал себе постоянное присутствие в системе (persistence), загружал эксплойт для удаленного выполнения команд (RCE), получал полный контроль над сервером и занимался поиском конфиденциальных данных. В частности, код был настроен на извлечение учетных данных, API-ключей, профилей браузеров и данных криптокошельков.
Команда Plone оперативно отреагировала на инцидент. Скомпрометированная учетная запись была заблокирована 14 января, а вредоносные коммиты - отменены. Для предотвращения подобных атак в будущем были ужесточены правила безопасности на уровне всей организации в GitHub. Теперь для основных веток (таких как "main" или "master") и веток обслуживания (например, "*.x") заблокированы операции принудительной перезаписи и удаления. Аналогичные ограничения применены и к тегам версий.
Этот инцидент служит важным напоминанием для всех open-source проектов. Необходимо регулярно проводить аудит списка персональных токенов доступа и других секретов в учетных записях разработчиков, чтобы вовремя обнаружить несанкционированные добавления. Крайне рекомендуется отключать возможность force push для всех ключевых веток в репозиториях, поскольку это значительно усложняет скрытую подмену кода. Как подчеркнул ван Рис, во многих репозиториях Plone такая защита уже была включена, что предотвратило более масштабные последствия.
Расследование показало, что атака была хорошо спланирована. Злоумышленники не только выждали длительный период после компрометации, но и использовали техники, затрудняющие обнаружение, такие как подделка дат коммитов и скрытие кода. Несмотря на сложность атаки, ни один вредоносный код не попал в официальные релизы Plone, что минимизировало риски для пользователей. Этот случай демонстрирует, насколько важны бдительность и проактивные меры безопасности в современных проектах с открытым исходным кодом.