![image](https://habrastorage.org/getpro/habr/post_images/024/b37/080/024b370808daf1a2b7f72c5ccad9c2d9.png)
Обычный программист что-то гуглил в гугле и попал на репозиторий с вредоносным кодом и решил выяснить, сколько еще таких зараженных репозиториев, которые легко гуглятся.
3 августа Stephen Lacy написал в твиттере, что «обнаружил широкомасштабную атаку на 35 000 репозиториев GitHub», на проекты crypto, golang, python, js, bash, docker, k8s, а так же скрипты npm, образы докеров и установочные документы. (Позже он уточнил, что не «35 000 репозиториев», а 35 000 «code hits»)
Вскоре после его твита либо GitHub, либо злоумышленник удалил большинство общедоступных форков, а еще пару часов спустя появляется твит от только что созданной учетной записи пользователя @Pl0xP, где он утверждает, что он стоит за атакой, и это часть аудита за вознаграждение — bug bounty.
![image](https://habrastorage.org/getpro/habr/post_images/f21/861/853/f21861853f9eb32c59a055aa82008299.jpg)
Большинство коммитов кажутся безобидными, с такими сообщениями, как «поднять версию до 0.3.11».
Некоторые из этих repo histories включают коммиты от первоначального автора, но коммит не проверен GPG: github.com/redhat-openshift-ecosystem/operator-bundle-validate-container/commits?author=samvarankashyap
Некоторые из этих репозиториев были «заархивированы», например, этот в 2019 году.
github.com/Logicalis/asn1/commit/9962b33c959eb0e62f60280a7f65552365ff31cc
![image](https://habrastorage.org/getpro/habr/post_images/b50/01c/932/b5001c9326e6210444d1309a674e3eb5.jpg)
Некоторые из них замаскированы под законно выглядящие пулл-реквесты, но репозиторий не получил никаких PR, Каждый файл go в этом репозитории был заражен.
Stephen Lacy обнаружил эксплойт, когда просматривал проект, который нашел в поиске Google. Он рекомендует не устанавливать случайные packages из Интернета, и призывает подписывать коммиты GPG.
Эта атака, возможно, направлена на пользователей, которые вводят в search-engines-related code snippets и попадают в эти вредоносные репозитории GitHub.
Вот возможный сценарий атаки:
- Злоумышленник форкает репозиторий GitHub
- Злоумышленник изменяет последний исходный коммит и добавляет вредоносный код, используя исходный идентификатор коммиттера.
- Вредоносная начинка отправляет конфиденциальные переменные среды в инфраструктуру злоумышленника, а затем ожидает команды от злоумышленника для выполнения на машине.
Похоже, что злоумышленник изменял самый последний коммит и модифицировал его с помощью вредоносного кода. Возможно, он планировал внедрить этот код в исходный форкнутый проект.
Внося или фиксируя изменения правильным образом, злоумышленники могут выдать себя за другого пользователя GitHub и создать впечатление, что коммит исходит от них. Это делается путем локального изменения определенных переменных среды для получения имени пользователя и адреса электронной почты пользователя, за которого злоумышленник хотел бы выдать себя.
![image](https://habrastorage.org/getpro/habr/post_images/09f/7eb/ccd/09f7ebccd5418b5f5ee90b997be6e8b8.png)
Скриншот одного из зараженных коммитов. Обратите внимание, что подпись коммита не проверена
Зараженные Golang файлы
![image](https://habrastorage.org/getpro/habr/post_images/8da/279/569/8da279569e194f26690c93bd69a899e1.jpg)
Похоже, что злоумышленник запустил программу, чтобы «исправить» каждый из файлов «.go» клонированного проекта с помощью функции инициализации, таким образом получив возможность эксфильтрации переменных среды и выполнения кода на машине жертвы. Этот вредоносный код не будет работать, если переменная среды «e452d6ab=1» определена:
![image](https://habrastorage.org/getpro/habr/post_images/903/bf8/6b4/903bf86b49754a906501a7454c82fb6a.png)
Зараженные NPM файлы
Похоже, злоумышленник запустил программу для «исправления» каждого из файлов «package.json» клонированного проекта с оператором «postinstall», имея логику для эксфильтрации переменных среды и выполнения кода на машине жертвы:
![image](https://habrastorage.org/getpro/habr/post_images/04f/168/b44/04f168b444bcfa245bcaad07bf662aa8.png)
Зараженные YAML файлы
Файлы YAML, конфигурация инфраструктуры и контейнеры были изменены с помощью дополнительных шагов для выполнения команды curl для эксфильтрации всех переменных среды в настраиваемую службу:
![image](https://habrastorage.org/getpro/habr/post_images/bf4/b6b/e91/bf4b6be910ddc2bf171dcd188072503f.png)
Заявлению о том, что это «аудит» противоречат два момента:
- Код отфильтровал важные переменные среды. Допустим, вы делаете POC, и отправки имени вашего компьютера более чем достаточно.
- После эксфильтрации данных сервер отправлял команды для выполнения на машине жертвы.
Tane Piper написал, что 5 лет назад он сообщил почти о том же эксплойте в @npmjs, но никто не воспринял это всерьез.
Sven Slootweg прокомментировал: «На самом деле это не столько «эксплойт в npm», сколько более фундаментальная проблема с контролем доступа в операционных системах текущего поколения. Удаление постустановочных скриптов на самом деле ничего не решит — вместо этого вы просто вставите свой вредоносный код куда-нибудь в код пакета.»
Выводы
GitHub как вектор атаки в эпоху автоматизированных конвейеров ci/cd невероятно недооценен.
Данная атака нацелена на наивных разработчиков, так что будьте внимательны, когда гуглите куски кода. А если это все же было дело рук белого хакера, то уж очень потенциально вредоносные методы он выбрал.
PS
Не важно насколько криво я написал пост, важно сколько пользы для сообщества написали вы в комментариях.