Grafana path traversal
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.
Resumo
Path traversal não autenticado no endpoint de assets de plugins do Grafana (/public/plugins//), que permite ler qualquer arquivo do sistema de arquivos acessível ao processo grafana-server. Como toda instalação padrão já vem com plugins pré-instalados (Prometheus, MySQL, InfluxDB etc.), a lista de URLs vulneráveis é fixa e conhecida — o atacante não precisa descobrir nada sobre o ambiente. O CVSS 7.5 reflete só impacto de confidencialidade (sem RCE direto), mas o vazamento da falha antes do patch público (virou 0-day), a presença em massa de scanners com Metasploit/Nuclei e a listagem no catálogo KEV da CISA tornam o risco prático mais alto do que o número sugere.
Detalhamento técnico
A falha está em pkg/api/plugins.go, na função getPluginAssets, que atende o endpoint /public/plugins/:pluginId/*. O código original aplicava filepath.Clean() diretamente sobre o wildcard capturado da URL e depois fazia filepath.Join() com o diretório do plugin. Sem um prefixo absoluto antes do Clean, sequências como ../../../../etc/passwd não eram neutralizadas — o Clean normaliza o caminho, mas sem uma raiz fixa ele preserva os '..' que sobem além do diretório base, e o Join subsequente simplesmente concatena isso ao PluginDir, resultando em leitura fora da sandbox esperada. Classifica-se como CWE-22 (Path Traversal / 'Directory Traversal').
O atacante controla o segmento de caminho após o pluginId (o wildcard '*' da rota), único ponto de entrada não sanitizado corretamente. Não há verificação de autenticação nessa rota — ela serve assets estáticos de plugins e é pública por design, o que a torna sensível a qualquer erro de canonicalização.
A correção (commit c798c0e) prefixa '/' antes do filepath.Clean(), calcula o caminho relativo com filepath.Rel('/', requestedFile) e só então junta esse caminho relativo — agora garantidamente contido — ao caminho absoluto do diretório do plugin (filepath.Abs(plugin.PluginDir)). Essa sequência impede que qualquer valor de entrada resulte em um caminho final fora do diretório do plugin, independente de quantos '../' o atacante encadear.
Como é explorada
O vetor é uma requisição HTTP GET simples e não autenticada contra /public/plugins// seguida de sequências de travessia de diretório para escapar do diretório do plugin e alcançar arquivos arbitrários legíveis pelo processo do Grafana (configurações, /etc/passwd, chaves, e potencialmente grafana.ini com credenciais de datasource, dependendo de como o serviço foi implantado). Não exige configuração não padrão: qualquer instância Grafana entre 8.0.0-beta1 e 8.3.0 tem plugins built-in habilitados por padrão (prometheus, mysql, influxdb, testdata, entre outros listados pelo fornecedor), então a superfície de ataque é idêntica em praticamente todo deploy exposto à rede.
A vulnerabilidade foi reportada responsavelmente ao Grafana em 2021-12-03, mas em 2021-12-07 a informação vazou publicamente antes da disponibilização do patch para todos os usuários, forçando a equipe a antecipar o release com apenas duas horas de janela — na prática tornou-se um 0-day ativamente exploitado nas horas seguintes à divulgação. Isso explica a presença no catálogo KEV da CISA e a rápida disponibilidade de módulo Metasploit, template Nuclei e PoCs públicas: a exploração é trivial de automatizar e foi varrida em massa contra instâncias expostas na internet.
O resultado final da exploração é leitura arbitrária de arquivo (disclosure), sem escrita nem execução direta — mas leitura de arquivos de configuração ou segredos costuma servir como trampolim para comprometimento mais profundo (credenciais de datasource, tokens de API, chaves SSH se o processo tiver privilégios elevados).
Versões
Como se proteger
A correção definitiva é atualizar para 8.3.1, 8.2.7, 8.1.8 ou 8.0.7, conforme o branch em uso — o fornecedor liberou patches paralelos para as quatro séries ativas na época, cada um contendo somente o fix de segurança. Não existe flag de configuração que desative a rota vulnerável sem quebrar a UI de plugins, então atualizar é o caminho recomendado.
Se a atualização não for imediatamente viável, o próprio fornecedor recomenda colocar um reverse proxy na frente do Grafana que normalize o PATH da requisição antes de repassá-la (o advisory cita como exemplo a opção normalize_path do Envoy). Esse paliativo reduz a exposição mas não corrige a causa raiz e precisa também tratar variantes url-encoded do path, senão pode ser contornado. Grafana Cloud nunca foi afetado justamente porque já operava com essa camada de normalização de path por padrão (defesa em profundidade), o que reforça que a mitigação por proxy é tecnicamente válida quando bem configurada.
Vale não confundir com os patches subsequentes 8.3.2 e 7.5.12, que corrigem CVE-2021-43813 (leitura de arquivos .md, autenticado) e CVE-2021-43815 (leitura de .csv, autenticado, exige datasource TestData DB habilitado — desabilitado por padrão). São falhas relacionadas mas distintas, com pré-requisitos de autenticação que CVE-2021-43798 não tem; atualizar apenas para essas versões cobre também o CVE-2021-43798, mas o inverso (aplicar só o fix de dezembro/07) não cobre as duas de dezembro/10.
Como detectar
Procurar em logs de acesso do Grafana requisições para o padrão /public/plugins//... contendo sequências de travessia — '../' literal ou suas variantes url-encoded como '..%2f', '%2e%2e/', '%2e%2e%2f'. O próprio fornecedor orientou, no follow-up sobre as CVEs relacionadas de .md/.csv, buscar por '..%2f' nos logs de requisição como indício de tentativa de exploração. Uma resposta HTTP 200 para esse tipo de path contra um dos plugins pré-instalados (prometheus, mysql, testdata etc.) é indício forte de exploração bem-sucedida, não apenas de tentativa; não há um sinal de rede distinto além do próprio padrão da URL, já que a técnica não depende de payload complexo ou cabeçalhos especiais.