Разработчики Plone сообщили о компрометации пяти хранилищ кода на GitHub.

В одном из крупнейших открытых проектов по управлению сайтами произошел скрытый инцидент безопасности. Неизвестный злоумышленник внедрил вредоносный код в несколько хранилищ на GitHub через принудительную перезапись истории изменений, причем часть правок долгое время выглядела безобидно и не вызывала подозрений.
Команда проекта Plone сообщила, что атака была обнаружена после странных изменений в запросах на добавление кода. Система GitHub автоматически пометила несколько веток как переписанные принудительно. При проверке разработчики нашли запутанный фрагмент JavaScript с обфускацией. По их оценке, код был вредоносным. Большую часть вмешательств удалось быстро откатить, но один из случаев вскрылся только позже.
Plone – это система управления содержимым с открытым исходным кодом, написанная на Python и JavaScript. Проект существует много лет и поддерживается большим сообществом. У ряда участников до сих пор оставались права на запись, хотя они давно не вносили вклад в разработку. Команда как раз планировала пересмотреть и сократить такие доступы.
Подозрительные изменения были выполнены от имени давнего участника проекта. Разработчики не считают его причастным к атаке и предполагают компрометацию учетной записи. По данным службы поддержки GitHub, зафиксированы вредоносные отправки изменений в пять хранилищ. В одном случае правка попала в основную ветку. Изменение маскировалось под обычное обновление версии после выпуска, но в одном из настроечных файлов оказался спрятан вредоносный фрагмент, скрытый за длинной строкой пробелов. В обычном просмотре отличий он выглядел как изменение форматирования.
Разработчики советуют в подобных случаях проверять все ветки по дате последнего обновления и сверять ее с фактическими датами правок. Также можно анализировать события через программный интерфейс GitHub и искать подозрительные операции отправки изменений.
Злоумышленник использовал именно принудительную перезапись истории, потому что такие действия сложнее заметить, чем обычные отправки изменений. В большинстве хранилищ проекта защита уже была включена и запрещала такие операции в основных ветках. После инцидента команда включила дополнительные правила на уровне всей организации. Теперь запрещены принудительные перезаписи и удаление ключевых веток, а также изменение тегов версий.
По описанию пострадавшей стороны, вредоносный код был нацелен прежде всего на разработчиков, а не на конечных пользователей. Он внедрялся в файлы в корне хранилища, которые запускаются при сборке программ. При выполнении код закреплялся в системе, загружал средства удаленного выполнения команд, получал контроль над сервером и пытался вывести учетные данные, ключи интерфейсов, профили браузеров и криптокошельки. Предположительно атакующие добавили скрытый персональный ключ доступа и выжидали около двух месяцев, прежде чем начать активные действия.
Команда проекта рекомендует разработчикам регулярно проверять список персональных ключей доступа и других секретов в своих учетных записях и удалять все неизвестные элементы. Также советуют по возможности запрещать принудительную перезапись истории в основных и обслуживаемых ветках хранилищ. Это заметно снижает риск скрытой подмены кода.