Postgresql Global Development Group
O exportador de métricas no CloudNativePG abre uma conexão PostgreSQL como o superusuário `postgres` via socket Unix local do pod e, posteriormente, rebaixa a sessão usando `SET ROLE pg monitor`. Como o `SET ROLE` modifica apenas o `current user` enquanto o `session user` permanece como `postgres`, qualquer expressão SQL avaliada durante uma sessão de coleta (scrape) pode executar `RESET ROLE` para recuperar privilégios de superusuário. Um invasor pode então usar o comando `COPY ... TO PROGRAM` para iniciar um subprocesso no nível do sistema operacional como o usuário `postgres` dentro do pod primário. A flag de transação `READ ONLY` não impede isso, pois ela restringe apenas gravações no estado do banco de dados, não processos externos.
Existem dois caminhos principais de exploração:
1. Consultas de métricas personalizadas com identificadores não qualificados: Um usuário que possua um esquema no `search path` pode implantar um objeto sombra. Quando o exportador avalia a consulta, a expressão sombra é executada com privilégios de superusuário.
2. Configuração de monitoramento padrão: A métrica `pg extensions` no `default-monitoring.yaml` utilizava uma chamada `current database()` não qualificada em todos os bancos de dados de destino. Qualquer usuário sem privilégios de superusuário que possua um banco de dados de usuário poderia sombrear essa função para disparar a escalada.
Isso permite que uma função de banco de dados com baixos privilégios escale para superusuário do PostgreSQL e obtenha execução remota de código (RCE) como o usuário `postgres` dentro do pod primário.