Skip to main content
Blog
Blog

O que é Segurança CSS? | Prevenindo Phishing e Clickjacking em Ataques CSS

CSS controla o que os usuários veem. Atacantes exploram isso. Este artigo explora vulnerabilidades client-side baseadas em CSS e como se proteger contra elas.

Dec 23, 2025 14 min read
o que é segurança css - cside

A confiança do usuário é visual. Os usuários só confiam no que veem. É o navegador que entrega essa promessa visualmente. É o CSS que entrega essa promessa visual. CSS vai além de apenas estilizar páginas para deixá-las bonitas e destacar sua marca.

CSS entrega a interface: o que os usuários podem ver e o que não podem. Se você não vê um popup de aviso, por que se preocuparia? Quando atacantes controlam o que é renderizado nos navegadores, eles controlam a confiança dos usuários. Podem enganá-los injetando CSS malicioso. É por isso que CSS também é uma superfície de ataque oculta.

Em março de 2025, 150.000 sites descobriram isso da pior forma. Visitantes que esperavam sites legítimos foram redirecionados para plataformas de jogos de azar chinesas. Como foi feito? Atacantes injetaram JavaScript malicioso e usaram overlays CSS para substituir as páginas reais.

"Toda folha de estilo é um canal potencial pelo qual recursos externos são solicitados pelo navegador. Portanto, folhas de estilo CSS fazem parte da postura geral de segurança client-side."

Resumo

  • Por que CSS é um risco de segurança: CSS controla o que os usuários veem. Se atacantes encontrarem um ponto de entrada, podem sobrepor uma interface falsa para realizar ataques de phishing em múltiplas etapas.
  • Como funcionam os ataques baseados em CSS: Primeiro, os atacantes obtêm um caminho de injeção (frequentemente via XSS ou scripts de terceiros). Depois, CSS pode ser usado para suprimir alertas, reposicionar elementos, reordenar conteúdo ou empilhar overlays invisíveis para clickjacking e phishing.
  • Dicas para prevenir abuso de CSS: Restrinja fontes de estilo com CSP, proteja ativos estáticos com SRI, bloqueie incorporação em iframes e fortaleça a proteção contra vulnerabilidades XSS. Como alternativa, use uma ferramenta de monitoramento contínuo como o cside para acompanhar mudanças no DOM.

O que é CSS?

HTML, CSS e JavaScript: quem faz o quê?

CSS, sigla para Cascading Style Sheets (Folhas de Estilo em Cascata), define a aparência das páginas do seu site. Ele controla a camada visual: bordas, alinhamento, cores, fontes, espaçamento, tamanho e muitos outros recursos de estilo.

Funciona em harmonia com o HTML, que fornece a estrutura e o conteúdo da página, e com o JavaScript, que executa o comportamento e a lógica: gerenciando cliques, exibindo mensagens de erro, enviando ou buscando dados de um servidor. Por exemplo, o HTML define <form>, <button> ou <input>, o CSS escolhe cores, layouts e fontes, e o JavaScript adiciona propriedades dinâmicas, validação ou a API da requisição.

Por que CSS Importa para a Segurança Web

<compare-table data='{ "head_class": "!font-normal !bg-white", "cols": { "css": { "title": "Capacidades do CSS" }, "browser": { "title": "Comportamento do Navegador" }, "attack": { "title": "Ataque e Impacto" } }, "rows": [ { "css": "url() em background-image, @font-face, ícones", "browser": "Solicita recursos externos (fontes, imagens, ícones)", "attack": "Atacante altera folhas de estilo ou URLs de recursos" }, { "css": "display: none; visibility: hidden; conteúdo fora da tela", "browser": "Renderiza o que está visível ou oculto, na tela ou fora dela", "attack": "Interface manipulada: avisos ocultados, banners de consentimento minimizados, botões movidos" }, { "css": "Reestilizar botões, formulários, banners", "browser": "Aplica estilos a nós do DOM criados por HTML/JS", "attack": "Atacante injeta HTML/JS (XSS, ativos comprometidos)" }, { "css": "Overlays, camadas sobrepostas", "browser": "Faz o conteúdo injetado parecer "nativo" se corresponder ao CSS existente", "attack": "CSS existente faz o DOM malicioso parecer normal e confiável" } ] }'

Eis por que profissionais de segurança devem prestar atenção: HTML, JavaScript e CSS rodam no navegador e compartilham a mesma origem e limites de confiança. O Document Object Model (DOM) é fundamental aqui. Quando uma página carrega, o navegador analisa o HTML no DOM tree e o CSS no CSS Object Model (CSSOM). O resultado é uma Render Tree que contém apenas os elementos visíveis e estilizados.

O JavaScript foi projetado para ler e manipular o DOM: pode adicionar, alterar, remover e ocultar elementos em tempo de execução.

Tudo que pode alterar o DOM, como HTML ou JavaScript injetados, pode mudar a interface e o que é exibido na tela do usuário. Isso cria oportunidade e risco.

É por isso que a segurança CSS deve começar pela prevenção de manipulação do DOM: prevenção de XSS, CSP e segurança da cadeia de suprimentos.

CSS: do design visual à superfície de ataque

Ao contrário do JavaScript, CSS não pode executar código, mas pode instruir o navegador a carregar recursos adicionais, como fontes, imagens ou ícones, de servidores externos. Por exemplo, valores url() em background-image ou @font-face podem dizer ao navegador para buscar esses recursos em servidores externos.

Toda folha de estilo é um canal potencial pelo qual recursos externos são solicitados pelo navegador e, portanto, faz parte da postura geral de segurança client-side.

Mesmo sem executar código, CSS decide o que é exibido e o que permanece oculto com display:none; ou visibility:hidden;. Também pode reposicionar conteúdo fora da tela, de modo que os usuários nem vejam certas opções ou botões. Pode mover e reestilizar botões e formulários, ocultar ou minimizar visualmente avisos e banners de consentimento, ou até adicionar camadas que mudam como os usuários interagem com a página.

Se atacantes puderem alterar quais folhas de estilo são carregadas ou quais imagens, fontes ou ícones elas referenciam, podem influenciar o que os usuários veem.

É assim que CSS se torna parte da sua superfície de ataque CSS e da sua superfície de ataque client-side mais ampla, e por que deve ser incluído no seu gerenciamento e avaliação de riscos. Após uma vulnerabilidade de injeção, como cross-site scripting, agentes maliciosos podem usar CSS como arma.

Como CSS Leva os Usuários a Confiar em Você

Os usuários confiam no que veem se a interface se comporta como esperado. Se a interface parece familiar, as pessoas confiam no processo.

Isso torna a hierarquia visual uma preocupação de design de UX. Mas se torna uma preocupação de segurança quando atacantes manipulam um design confiável. Por exemplo, você projeta seu botão "Pagar agora" para se destacar, com mensagens de erro claras para torná-las óbvias e legíveis, não difíceis de encontrar ou fáceis de ignorar.

O oposto também é verdade. Layouts ruins são confusos e levam a cliques errados ou a ações irreversíveis sem aviso, e a confiança cai. Um CSS adequado e um design de UI cuidadoso devem evitar layouts confusos e reduzir cliques errados. Devem fornecer feedback inequívoco e dar pistas visuais claras sobre o que está acontecendo e o que se espera dos usuários.

UX "seguro por design" usa CSS para apoiar e ajudar os clientes a navegar com confiança em suas aplicações. Se os usuários estão confusos e não entendem o que está acontecendo ou por quê, seus controles de segurança não funcionam.

Os usuários confiam em padrões e os atacantes sabem disso: eles injetam um pouco de CSS, reposicionam um botão de pagamento, ocultam um aviso e sobrepõem um formulário de pagamento falso.

Como CSS É Usado em Ataques de Clickjacking

como-usuarios-sao-enganados-em-ataques-de-clickjacking

Além disso, margens negativas extremas podem empurrar elementos para fora da tela. Um aviso de segurança pode ser empurrado para fora da área visível usando .security-warning { margin-top: -9999px; }.

Outros truques para manipular o que os usuários veem:

  • display: none remove o conteúdo
  • visibility: hidden oculta o conteúdo e preserva seu espaço
  • overflow: hidden corta conteúdo que pode conter avisos
  • overflow: visible estende o conteúdo para fora do seu contêiner, sobrepondo outros elementos

Para fluxos críticos como login, consentimento ou pagamento, é necessário verificar o dimensionamento dos elementos no DOM e se há algo empilhado por cima ou empurrado para fora da vista.

Pontos de entrada de ataques CSS: XSS, CDNs, cadeia de suprimentos e widgets

Na maioria dos casos, os atacantes precisam primeiro de um ponto de entrada. Veja como eles inserem CSS malicioso na sua página:

  • Vulnerabilidade XSS — Injeta tags <style> ou estilos inline
  • CDN comprometida — CSS malicioso servido de uma fonte confiável
  • Ataque à cadeia de suprimentos — Pacote npm, tema ou plugin comprometido
  • Widgets de terceiros — Ferramentas de chat, analytics, testes A/B com controle de layout

Esses ataques visam o navegador do usuário de formas diferentes.

XSS e widgets de terceiros injetam CSS malicioso diretamente na página enquanto ela está sendo executada no navegador do usuário.

Ataques a CDN e à cadeia de suprimentos envenenam o CSS na origem. Ataques a CDN substituem seu CSS por versões maliciosas no servidor. Ataques à cadeia de suprimentos inserem CSS malicioso na sua base de código durante o build, via pacote npm ou temas comprometidos.

Engano de interface em ataques baseados em framing

Alguns ataques de interface, como clickjacking baseado em framing, não precisam alterar seu CSS. Em vez disso, o atacante atrai o usuário para sua própria página. Ele incorpora seu site em um iframe e disfarça visualmente o que o usuário está clicando (UI redressing). Isso só funciona se seu site puder ser incorporado em iframes, ou seja, sem restrição frame-ancestors no CSP e sem o cabeçalho X-Frame-Options.

SVG Clickjacking

O clickjacking baseado em framing pode ir muito além do clássico clique em um único botão oculto. Em dezembro, a pesquisadora de segurança Lyra Rebane compartilhou uma prova de conceito que demonstra isso. Em vez de depender de overlays clássicos, a técnica combina filtros SVG e renderização CSS de uma forma totalmente nova para criar um ataque de clickjacking interativo e em múltiplas etapas. As implicações são sérias: se iframes incorporados forem permitidos, tal ataque pode vazar dados de origens cruzadas, como foi demonstrado com conteúdo do Google Docs. Conclusão: se suas páginas podem ser incorporadas em frames, assuma que os atacantes já as identificaram.

Pesquisas independentes que expandem o SVG clickjacking:

Como Tornar o CSS Mais Seguro: Prevenir, Detectar, Defender

CSS não pode ser usado como arma sozinho. Os atacantes precisam primeiro de um ponto de entrada. Uma vez que esse ponto de apoio existe, o CSS se torna um amplificador. A segurança CSS requer defesa em camadas, com atenção focada nos cenários que oferecem mais alavancagem aos atacantes com o menor esforço (especialmente fluxos de login, consentimento e pagamento).

Uma abordagem prática impede que estilos maliciosos sejam carregados no navegador, detecta manipulação visual e defende usuários e sistemas para limitar o impacto.

Como Prevenir Ataques Baseados em CSS

Para prevenir ataques CSS, bloqueie-os na entrada. Se você impedir que injeção inline e estilos não confiáveis sejam carregados no navegador, os atacantes não conseguirão manipular sua interface.

As medidas a seguir tornarão o abuso de CSS muito mais difícil.

1 - Controle de onde os estilos podem ser carregados com Content Security Policy (CSP)

Use style-src 'self' para permitir apenas estilos do seu domínio. Claro, você vai querer evitar style-src 'unsafe-inline' ao máximo, pois esse controle é exatamente o que habilita estilos injetados. Caso precise de estilos inline mesmo assim, faz sentido usar nonces ou hashes.

Não deixe o medo de quebrar funcionalidades te impedir. Você pode testar seu CSP com segurança antes da implantação usando CSP Report-Only.

Os relatórios do CSP mostram o que quebraria. Eles listam estilos inline e fontes externas que seriam bloqueadas, além de dependências de terceiros que você pode ter esquecido. Corrija-os e então aplique a política.

2 - Fixe CSS de terceiros com Subresource Integrity (SRI)

Para evitar que arquivos adulterados sejam carregados, adicione SRI (integrity + crossorigin) para folhas de estilo hospedadas em CDN.

Por exemplo:

<link rel="stylesheet" href="https://cdn.example.com/style.css"

integrity="sha384-..." crossorigin="anonymous">

Isso funciona melhor para ativos estáticos e versionados, porque toda vez que a CDN atualiza esse arquivo, o hash muda. Como resultado, sua verificação SRI falhará e o navegador o bloqueará. Isso significa que você terá que atualizar manualmente o hash de integridade. Para CSS crítico que muda com frequência, é melhor hospedá-lo você mesmo.

Subresource Integrity é uma medida de defesa robusta para arquivos estáticos. Arquivos dinâmicos, como JavaScript de scripts de terceiros, precisarão de uma solução de monitoramento contínuo.

3 - Bloqueie incorporação em iframes com cabeçalhos anti-framing

Outro grande problema são os ataques clássicos de clickjacking que incorporam seu site em um iframe invisível em uma página fraudulenta. Content-Security-Policy: frame-ancestors 'none' e X-Frame-Options: DENY impedem que atacantes incorporem ou sobreponham elementos de interface falsos e, consequentemente, enganem usuários para que cliquem em botões dos quais nem têm consciência.

4 - Prevenção de XSS = segurança CSS

Estilos inline aumentam o risco e dificultam a aplicação do CSP. A forma como você previne Cross-Site Scripting (XSS) define em grande parte sua segurança CSS. A maioria dos abusos de CSS depende de um caminho de injeção (frequentemente XSS). Se você prevenir XSS, o ataque não conseguirá injetar blocos <style> ou atributos style="" inline.

Controles preventivos como CSP, SRI e hardening contra XSS reduzem o risco, mas não fornecem visibilidade sobre o que realmente é renderizado para os usuários. O cside oferece às equipes de segurança e conformidade visibilidade contínua em nível de página sobre mudanças de estilo e layout client-side.

Como Detectar Ataques CSS: Monitore a Interface Crítica para Identificar Abusos

Prevenção sozinha não é suficiente. Mas você não pode corrigir o que não consegue ver. Se um ataque escapar das medidas preventivas, a detecção o captura cedo. Então pergunte a si mesmo onde a manipulação de interface teria maior impacto na segurança e quais sinais de alerta você deve observar.

A adulteração de CSS provavelmente aparece na interface crítica. É uma boa ideia configurar alertas automáticos para páginas de login, checkout e pagamento, e de privacidade e consentimento.

1. Detecção Manual de CSS Malicioso

Agora que você determinou onde procurar, fique atento a folhas de estilo desconhecidas que aparecem do nada e verifique sinais de alerta e padrões suspeitos:

  • z-index extremo aponta para ataques de overlay: z-index: 9999
  • Margens negativas enormes para ocultar conteúdo fora da tela: margin: -9999px
  • Mensagens de segurança ocultas com display: none e visibility: hidden em avisos, banners de consentimento ou mensagens de erro
  • Reordenação visual para enterrar informações críticas abaixo da dobra com Flexbox order: 999
  • Tamanho de fonte minúsculo ou baixo contraste para limitar a visibilidade em botões "Cancelar/Rejeitar": font-size: 6px

Verificações manuais de segurança podem funcionar para projetos menores e limitados; use o DevTools para identificar sinais de alerta nas suas páginas de login, pagamento e consentimento. Antes de ir para produção, teste em dispositivos móveis, pois é mais fácil para os atacantes ocultar conteúdo em telas pequenas.

2. Detecção Automatizada de CSS Malicioso

Para builds grandes e complexos, verificações manuais não escalam. Em vez disso, incorpore detecção automática no seu sistema de monitoramento de segurança:

  • Monitoramento de segurança em tempo de execução client-side: o cside detecta manipulação de DOM e JavaScript continuamente em tempo real e envia um alerta quando elementos críticos são adulterados.
  • Relatórios de violação de CSP: adicione report-uri (ou report-to) ao seu CSP para que os navegadores reportem violações de política automaticamente. Além disso, execute um validador de CSP em cada build para detectar configurações incorretas.
  • Monitoramento sintético em páginas-chave: ferramentas de regressão visual detectam mudanças inesperadas na interface comparando capturas de tela. Se um botão de pagamento encolher ou um aviso desaparecer, você saberá antes dos usuários.
  • Scanners de estilos inline: configure seu pipeline de CI/CD para verificar estilos inline em páginas críticas e bloquear commits antes que cheguem à produção.

Riscos de Segurança do CSS Gerado por Vibe Coding

Ferramentas de codificação com IA aceleram o desenvolvimento web e geram estilos CSS em segundos. Mas há um trade-off: se as equipes aceitam CSS gerado sem revisão de segurança, também correm o risco de acelerar suas vulnerabilidades de ataque.

O uso de estilos inline traz o risco de bypass de CSP; links não controlados para CDNs externas sem verificações de integridade criam vulnerabilidades na cadeia de suprimentos.

Padrões CSS Que Devem Acender um Alerta:

  • style="display: none" espalhado por todo o código (estilos inline complicam o CSP e a revisão)
  • Links para CSS de terceiros sem Subresource Integrity (SRI)
  • z-index: 999999 habilita overlays em tela cheia
  • Layouts complexos de Flexbox/Grid que ninguém consegue explicar
  • CDNs externas de ícones e fontes carregadas por padrão

Ferramentas de codificação com IA são indiferentes às suas preocupações de segurança: priorizam velocidade em detrimento da segurança. E isso aparece no resultado final. Estilos inline podem aparecer em todo lugar sem estrutura clara, o que complica a aplicação do CSP com style-src posteriormente. CDNs de terceiros de onde temas e fontes são obtidos podem ser atalhos que criam risco na cadeia de suprimentos.

Leia mais no artigo dedicado com dicas de defesa para código gerado por IA.

Juan Combariza
Growth Marketer Juan Combariza

Researching & writing about client side security.

FAQ

Frequently Asked Questions

CSS controla o que os usuários veem. Se o seu CSS for manipulado, seus usuários também serão. CSS não pode ser usado como arma sozinho — os atacantes precisam primeiro de um ponto de entrada, como Cross-Site Scripting (XSS) ou uma dependência comprometida. Uma vez dentro, CSS injetado pode ser usado para phishing e fraude ao enganar visualmente os usuários.

XSS injeta JavaScript malicioso na sua página e pode executar ações como um usuário real, incluindo roubo de cookies ou captura de teclas digitadas. A injeção de CSS, por outro lado, manipula o que os usuários veem em uma página web e normalmente é o segundo passo de um ataque, após a página já ter sido comprometida.

Sim. Estilos inline adicionam um atributo style diretamente aos elementos dentro do HTML, o que cria pontos cegos de segurança em sites grandes e complexos. Se atacantes explorarem uma vulnerabilidade como XSS, podem injetar estilos inline maliciosos por todo o HTML, tornando-os extremamente difíceis de encontrar e revisar em escala.

Content Security Policy (CSP) funciona como um segurança na entrada: verifica credenciais, mas não controla o comportamento interno. Embora o CSP bloqueie estilos inline por padrão, muitos sites habilitam unsafe-inline para evitar quebrar funcionalidades. Isso cria uma vulnerabilidade porque atacantes podem injetar estilos inline maliciosos em qualquer lugar, e o CSP os permitirá. Alternativas mais seguras incluem o uso de nonces ou hashes para blocos `