2022-05-25 15:44:44
Что-то последнее время вообще не было времени, сори за длинную паузу.
Продолжим говорить о
CI/CD и в этот раз о
Jenkins (хотя частично информация актуальна для любой системы).
Предположим, что мы можем создавать и запускать
Job в Jenkins, но при этом исполнение на
master node запрещено конфигурацией. А также предположим что часть проектов использует разделяемый
ssh-agent.
Поднять свои права в Jenkins в таком случае не получится, однако в такой конфигурации мы можем запускать свои команды на агенте и соответственно влиять на процесс сборки других проектов. Все процессы сборки всех проектов на ssh-agent запускаются от имени одного и того же пользователя (по умолчанию -
jenkins). И порождает их общий процесс агента, который запущен из под того же самого пользователя. Соответственно нет никаких ограничений с точки зрения ОС на доступ к сборкам других проектов. Теоретически понятно, что мы можем:
1) читать
исходный код, т.к. он скачивается для сборки и какое-то время находится на агенте
2) получить доступ к используемым
секретам, ведь они используются при сборке и контроллер Jenkins должен их как-то передавать на агент
3) подменять
артефакты сборки, ведь они создаются на агенте и потом как-то отправляются на контроллер
Теперь практически.
Процесс jenkins агента в процессе сборки запускает команды ОС.
cmdline создаваемых процессов можно получить, например, с помощью pspy. В параметрах командной строки могут быть пути к директориям в которые делаются git clone (а значит там исходники), а также могут быть секреты.
Также, если разработчики конфигурируют пайплайны не аккуратно, секреты могут оставаться сохраненными на самом агенте. Например, если в процессе сборки выполняется docker login, то вероятно что в /home/jenkins/.docker/config останется пароль в открытом виде (а это дает нам возможность пушить в registry, то есть подменять артефакты). Также может остаться конфигурация в /home/jenkins/.kube/config. Короче, полезно заглянуть в домашний каталог и посмотреть что там лежит.
Часть секретов
jenkins агент использует внутри своего процесса и никуда не передает и не сохраняет. Для того чтобы достать такие секреты можно анализировать память процесса
jenkins агента. Напоминаю что
jenkins написан на Java и копаться в его памяти совсем не так сложно, как может показаться.
Снять
heapdump памяти можно такой командой:
jcmd
GC.heap_dump /tmp/heapdumpfile.hprof
Секреты храняться в наследниках класса hudson.util.Secret. Дальше анализировать такой дамп можно вручную с помощью jhat или Eclipse Memory Analyzer. Можно пытаться автоматизировать, я делал к этому подход на основе проекта - парсера hprof py-hprof. Но это конечно скорее PoC чем готовая тулза. Также секреты через некоторое время удаляются из памяти агента, так что для того чтобы насобирать секреты нужно продолжительное время постоянно снимать дампы и запускать их анализ.
856 viewsPavel Sorokin, 12:44