Por que o inventário de scripts não detecta o QR trocado
Por Laís Peixoto
Growth Marketer, Proteside
Publicado em · 6 min de leitura
O inventário responde "o que roda na página", e a troca de QR não precisa de script novo: vem de extensão, plugin já autorizado ou conteúdo alterado. Detectá-la exige comparar o que a tela mostra com o que a loja emitiu, no navegador de quem paga.
Uma loja de material esportivo em Curitiba passou pela auditoria de PCI DSS em agosto. O inventário de scripts da página de pagamento estava completo: cada arquivo listado, justificado e com a integridade conferida. Em setembro, uma cliente pagou R$ 412 por Pix, o pedido ficou em “aguardando pagamento” e o dinheiro nunca chegou. O relatório daquela semana não registrou script novo, alteração não autorizada ou alerta. Tudo verde. O QR tinha sido trocado mesmo assim.
Para que o inventário foi criado
Os requisitos 6.4.3 e 11.6.1 do PCI DSS existem por causa de um problema específico: scripts carregados na página de pagamento que capturam os dados do cartão de crédito ou do cartão de débito digitados pelo cliente. O 6.4.3 pede que cada script seja autorizado, justificado e tenha a integridade garantida. O 11.6.1 pede um mecanismo que detecte alterações não autorizadas nos cabeçalhos de segurança e no conteúdo da página, com verificação ao menos semanal.
As ferramentas construídas para esses requisitos fazem o que prometem: inventariam o que a página carrega, avisam quando um script novo aparece e detectam quando um arquivo conhecido muda. A pergunta que elas respondem é “o que está rodando nesta página?”.
Um QR trocado faz outra pergunta: “o que aparece na tela corresponde ao que a loja emitiu?”. A lista de scripts responde à primeira e fica em silêncio na segunda.
Três cenas
Cena 1: o Pix
A loja gera a cobrança no provedor de pagamento e recebe um QR dinâmico e o código copia e cola. No navegador do cliente, uma extensão instalada meses atrás (um “buscador de cupons” baixado de uma loja de extensões) reconhece o padrão do código Pix e substitui a chave e o nome do recebedor, mantendo o valor. O cliente escaneia, vê R$ 412 e um nome de empresa razoável no aplicativo do banco, e confirma.
O que o inventário vê: os mesmos scripts de sempre, com as mesmas assinaturas de integridade. A extensão roda no navegador do cliente, fora do alcance de qualquer lista que a loja mantenha.
O que o inventário não vê: que o texto do copia e cola e a imagem do QR mudaram depois de a página carregar.
Cena 2: o boleto
Um plugin de frete, autorizado e justificado no inventário há um ano, recebe uma atualização pela conta comprometida do desenvolvedor. A nova versão faz tudo o que fazia antes e mais uma coisa: quando a página do boleto aparece, reescreve a linha digitável e o código de barras com os de um boleto emitido por outro beneficiário, no mesmo valor e com o mesmo vencimento.
O que o inventário vê: um script autorizado que mudou de versão, um evento rotineiro que muitas equipes aprovam sem ler o código.
O que o inventário não vê: que a linha digitável na tela já não é a que a loja emitiu. Para a ferramenta, a linha digitável é conteúdo, um dado qualquer da página, e dados mudam a cada pedido.
Cena 3: UPI e PromptPay
Uma loja na Índia mostra o QR de UPI com o identificador de pagamento do lojista. Uma loja na Tailândia mostra o QR de PromptPay com o número do comerciante. Nas duas, a troca vem do tema da plataforma, comprado em um marketplace e presente na lista de scripts desde o primeiro dia. Um trecho discreto do tema substitui a imagem do QR por outra gerada na hora, com o identificador de uma conta de passagem.
O que o inventário vê: o tema, autorizado desde a instalação, sem alteração recente de arquivo (o trecho sempre esteve lá, inativo).
O que o inventário não vê: dois QRs diferentes para a mesma cobrança, um no servidor e outro na tela.
O ponto em comum
Nas três cenas não existe um script “novo” para detectar. O ataque usa algo já autorizado (um plugin, um tema), algo que a loja nunca controlou (uma extensão do cliente) ou uma alteração em conteúdo que a ferramenta trata como dado, e não como código.
E o resultado é um pagamento válido para o sistema financeiro. Em setembro de 2026, o Procon-SP divulgou um alerta sobre isso: QR e copia e cola do Pix alterados em páginas de lojas legítimas, com valor correto e sem sinal visual na tela, dias depois de a Kaspersky descrever uma campanha que atingiu pelo menos 90 lojas virtuais brasileiras. A recomendação ao consumidor foi conferir nome e CNPJ do recebedor no aplicativo do banco. É um conselho correto e insuficiente: o cliente não sabe o CNPJ da loja, e o golpista escolhe nomes plausíveis.
O que a verificação precisa fazer
Se a troca acontece depois de a página carregar, no navegador do cliente, a conferência precisa acontecer lá também. E precisa comparar duas coisas: o que a loja emitiu e o que a tela está mostrando.
Vale para cada meio de pagamento com destino visível:
- No Pix, a chave, o nome do recebedor e o valor contidos no QR e no copia e cola.
- No boleto, a linha digitável e o código de barras.
- No UPI, o identificador de pagamento do lojista; no PromptPay, o número do comerciante.
- Em carteiras de stablecoins, o endereço de destino e a rede.
- No cartão de crédito e no cartão de débito, o formulário que recebe os dados e o destino para onde eles são enviados.
Sem o lado “emitido”, a verificação só consegue dizer que algo mudou, sem saber se a mudança é legítima. Sem o lado “exibido”, ela confere um servidor que estava certo o tempo todo.
Como o Proteside faz
O inventário de scripts continua, porque o PCI DSS pede e porque ele resolve o problema para o qual foi criado. É o primeiro passo. Os outros são:
- Registrar o emitido. Quando a loja ou o provedor gera a cobrança, o Proteside recebe o QR, a chave, a linha digitável ou o endereço, e guarda o registro atrelado ao pedido.
- Conferir no navegador de quem paga. Um script leve na página de pagamento lê o que está na tela (o QR, o texto do copia e cola, a linha digitável, o endereço) e compara com o registro do passo 1, em cada tela, de cada cliente, em cada pedido.
- Bloquear antes da confirmação. Se o que aparece não corresponde ao que foi emitido, o cliente vê um aviso no lugar do QR, e o botão de copiar não entrega o código trocado. O pagamento não sai.
- Registrar a tentativa. Cada divergência vira um evento com data, pedido, meio de pagamento, valor esperado e valor encontrado. É evidência para a equipe de segurança e para o auditor do PCI DSS, ao lado do inventário.
No relatório da semana, o inventário diz “nenhum script não autorizado”. A conferência diz “três tentativas de troca de QR bloqueadas”. A primeira frase era verdadeira na loja de Curitiba. A segunda teria salvado a venda de R$ 412.
Para saber o que cada tipo de ferramenta de segurança da página de pagamento faz e não faz, com base em informações públicas e datadas, veja a página de comparativo.