Хакери са взели на прицел 61 публични хранилища в GitHub в координирана кампания за инжектиране на команди, целяща кражба на данни от автоматизирани системи за разработка.

Изследователи от Radware идентифицираха 83 злонамерени заявки за проблеми (issues), заявки за сливане (pull requests) и коментари, публикувани на 1 септември 2026 г., с доказателства, че инжектираните команди са били изпълнени в два работни процеса на GitHub Actions. Констатациите показват как рутинните дискусии по проекти могат да се превърнат във входни точки към системите за компилиране на софтуер.

Според разследването на Radware, 77 злонамерени елемента са се появили в рамките на около 43 минути. Още шест са последвали във втора вълна, продължила приблизително две минути.

Целите са включвали Google LangExtract, Trivy, Brave Browser, MLflow, ToolJet и PX4-Autopilot. Включването им в списъка не означава, че всеки от тези проекти е бил успешно компрометиран.

Веригата на атаката (източник: Radware)
Веригата на атаката (източник: Radware)

Кампанията е експлоатирала работни процеси, които поставят контролиран от потребителя текст директно в shell скриптове. GitHub Actions може автоматично да реагира, когато някой отвори заявка за проблем (issue), изпрати заявка за сливане (pull request) или публикува коментар. Тези задачи могат да проверяват заглавия, да задават етикети или да изпращат известия.

Хакери атакуват 61 хранилища в GitHub

Атакуващите са поставили изрази за заместване на команди в Bash, записани като $(), вътре в това съдържание. Когато уязвим работен процес вмъкне текста в изпълним shell код, Bash третира вградения израз като команда, а не като обикновен текст. Ограждането на вмъкнатото заглавие в двойни кавички не предотвратява изпълнението.

Инжектираният код стартира env за събиране на променливи на средата, кодира резултата с Base64, премахва символите за нов ред и използва curl, за да опита HTTP POST заявка.

PX4/PX4-Autopilot — Заявка за сливане (Pull Request) #28488 (източник: Radware)
PX4/PX4-Autopilot — Заявка за сливане (Pull Request) #28488 (източник: Radware)

Всеки потвърден зловреден код е сочел към 54.205.16[.]142 на порт 8443, с отделен идентификатор за събиране за всеки опит. Въпреки номера на порта, връзката е използвала HTTP вместо HTTPS.

Рискът е зависел от това до какво има достъп всяка задача. Променливите на средата могат да съдържат служебни токени, идентификационни данни за внедряване или вътрешни настройки.

Тайните в GitHub Actions не са автоматично достъпни за всеки работен процес, така че самото изпълнение не доказва, че са били откраднати чувствителни идентификационни данни.

Snouzy/workout-cool Заявка за проблем (Issue) #251, показваща инжектирания код в заглавието (източник: Radware)
Snouzy/workout-cool Заявка за проблем (Issue) #251, показваща инжектирания код в заглавието (източник: Radware)

В PX4-Autopilot заявка за сливане, представяща се за корекция на документацията, е носела злонамерения код в заглавието си. Работен процес за проверка на заглавията е вмъкнал това заглавие в Bash команда, извикваща Python. Журналите (логовете) са показали предупреждение за заместване на команда и върнато съдържание, започващо с GIF89a, заместващо злонамерения израз.

В Snouzy/workout-cool работен процес за известия при проблеми е вмъкнал заглавието на атакуващия директно в присвояване на променлива в Bash. Предупреждение, свързано с този ред, е потвърдило заместването на команда. Последвала заявка към Discord се е провалила, тъй като тялото ѝ е съдържало невалиден JSON, въпреки че този неуспех не доказва успешна кражба на данни.

Radware не потвърждава за откраднати тайни, достъп за запис в хранилищата, промени в изходния код или компрометирани версии. Изследователите са открили и признаци, че някои от участващите акаунти може да са били превзети, включително един собственик, който публично е отрекъл да е отварял злонамерена заявка за проблем.

Констатациите допълват по-ранни доклади за кражба на идентификационни данни чрез GhostAction и атаката срещу веригата на доставки tj-actions. Тези инциденти са използвали различни пътища, но също са изложили на риск CI/CD тайните.

Поддържащите екипи трябва да подават ненадеждни заглавия чрез променливи на средата, вместо да ги вмъкват директно в изходния shell код, да избягват използването на eval и да ограничават правата на работните процеси.

Екипите, които открият доказателства за изпълнение, трябва да прегледат наличните тайни, да подменят потенциално изложените на риск идентификационни данни, да проверят одитните журнали и да разследват неочакван изходящ трафик. Дръжте задачите за известия отделно от привилегированите работни процеси за пускане на нови версии, за да намалите щетите, които една инжектирана команда би могла да причини.