Что делает полезная нагрузка?Поведение скомпрометированного Trivy на хостах и на сборочных раннерах несколько отличается.
Первоначально скрипт проходится по PID процессов запуска GitHub Actions (Runner.Worker, Runner. Listener, runsvc, run. sh) и читает /proc/{PID}/environ, фильтруя переменные окружения, содержащие в своих именах env или ssh.
На Linux-раннерах, размещенных на GitHub, закодированный в Base64 скрипт на Python декодируется и выполняется с помощью sudo. Он находит процесс Runner. Worker, считывает его memory map через /proc/{PID}/maps и извлекает секреты GitHub Actions из /proc/{PID}/mem — в частности, из JSON-структур, соответствующих «name»:{"value":"…","isSecret":true}.
На self-hosted раннерах другой закодированный в Base64 скрипт на Python выполняет масштабный сбор учетных данных файловой системы. Он нацелен на следующие области:
- Закрытые ключи и конфигурации SSH
- Учетные данные облачных сервисов (AWS, Google Cloud, Azure)
- Конфигурации Kubernetes и Service Account токены
- Учетные данные реестра Docker
- Учетные данные баз данных (MySQL, PostgreSQL, MongoDB, Redis)
- Конфигурации CI/CD (GitLab CI, Travis, Jenkins, Drone)
- Секреты IaC (состояние/переменные Terraform, Ansible, Helm)
- Закрытые ключи TLS/SSL
- .env-файлы и ключи API
- Ключи криптокошельков (Bitcoin, Ethereum, пары ключей валидатора Solana, Cardano и другие)
- Системные файлы (/etc/passwd, /etc/shadow, bash history)
Собранные данные шифруются с помощью случайно сгенерированного сессионного ключа AES-256-CBC, а сессионный ключ упаковывается в захардкоженный 4096-битный открытый ключ RSA. Зашифрованный пакет (payload.enc + session.key.enc) упакован в tpcp.tar.gz. Это гарантирует, что расшифровать полезную нагрузку сможет только сервер злоумышленников, имеющий доступ к соответствующему закрытому ключу RSA.
Основной канал эксфильтрации — HTTPS POST-запрос к scan. aquasecurtiy[.]org — домену имитирующему легитимный aquasecurity.com компании Aqua Security.
Если эндпоинт возвращает ответ, отличный от 2XX, и доступен параметр INPUT_GITHUB_PAT, скрипт переключается на эксфильтрацию через сам GitHub. Он создаст общедоступный репозиторий с именем tpcp-docs в учетной записи GitHub жертвы, создаст релиз с меткой времени и загрузит зашифрованный пакет в качестве ресурса релиза.