Como o Bromure detém o phishing antes que ele chegue aos seus pais
Um passo a passo do antiphishing do Bromure — a varredura local, o modelo, o veredicto e por que seus pais, seus avós e o vizinho do corredor são exatamente as pessoas para quem o construímos.
Seus pais não precisam de mais um sermão sobre clicar em links com cuidado. Eles precisam de um navegador que enxergue a armadilha em que estão pisando — e diga algo, a tempo, em palavras que eles entendam.
Alguns de vocês já receberam aquele telefonema. Aquele em que a voz da sua mãe já está baixa, já está pequena, e ela diz acho que fiz alguma coisa errada no computador. Alguns de vocês estão esperando por ele. O objetivo deste post é descrever, em detalhe, a engrenagem que construímos para que esse telefonema aconteça menos vezes — e, quando acontecer, para que o estrago pare num aviso em vez de numa conta esvaziada.
A indústria do ataque sempre caçou os mais velhos.
Phishing nunca foi um jogo de gente esperta. É um jogo probabilístico: uma linha de produção industrial que gera páginas de login falsas aos milhares, imita marcas familiares, escreve mensagens com tom de urgência e as despeja em e-mails, SMS, redes sociais e chamadas telefônicas. Tudo o que o atacante precisa é que uma pessoa, num dia, num momento de distração, digite uma senha no campo errado. Avós, pais, vizinhas viúvas, qualquer pessoa que cresceu confiando numa carta do banco no correio — elas não são lentas, elas são confiantes. Os atacantes sabem disso e miram nelas de propósito.
Os conselhos de segurança jogados sobre os avós sempre foram variações de tenha mais cuidado. Confira a URL. Passe o mouse no link. Não confie no remetente. O problema não é que os avós são descuidados. O problema é que a indústria do ataque contrata profissionais cujo trabalho em tempo integral é derrotar o "tenha mais cuidado". A distância entre quem defende e quem ataca, a esta altura, é constrangedora.
O que construímos, em resumo.
Quando uma página carrega dentro do Bromure, um pequeno inspetor roda dentro da VM lacrada do navegador. Ele observa a página como um porteiro desconfiado num portão — olha a URL, os formulários, o texto visível, os links, qualquer QR code, até o que a página tenta escrever silenciosamente na área de transferência. Se alguma coisa parece estranha, os achados do inspetor viajam por um canal isolado até um modelo. O modelo lê os sinais, decide um veredicto, escreve uma explicação de uma frase só e devolve tudo. O Bromure renderiza o veredicto como um banner na página. Uma página de phishing escancarada é redirecionada para um aviso de site bloqueado antes que consiga enganar qualquer pessoa.
O resto deste post é o como. É deliberadamente detalhado. Se seus pais são o motivo de você estar lendo isto, fique à vontade para pular até Para onde seus dados realmente vão — e saiba que a resposta curta é: o recurso vem desativado por padrão, ele pede consentimento e tudo o que ele faz está documentado abaixo.
Passo um — a varredura local.
Antes de qualquer coisa sair do seu computador, um content script roda dentro da VM convidada. Ele inspeciona a página em várias passagens independentes. Nenhuma delas é cara. Todas rodam no navegador, no seu próprio computador, na mesma sandbox lacrada em que vive a própria página.
Campos de senha, no instante em que aparecem
No momento em que um <input type="password"> é anexado ao DOM — antes
mesmo de você dar foco nele — o inspetor já anotou o domínio e sinalizou
se você já digitou uma senha ali antes. Primeira vez num novo domínio?
Só isso já é um sinal.
Estrutura do formulário
Páginas só de login, sem navegação. Formulários que fazem POST para um domínio diferente do que está na barra de endereços. Formulários fingindo ser uma marca cujo logotipo está sendo carregado de outro servidor. Cada um é fraco isoladamente. Juntos, eles mudam as probabilidades.
Marca incompatível
Se a página diz "Apple ID" mas o domínio não é o da Apple, ou o logotipo vem de um servidor suspeito, essa incompatibilidade é registrada. Nenhuma chamada de rede é necessária — é só comparação de padrões no que já está na página.
Domínios com homóglifos
Domínios como аррӏе.com — renderizados iguais a "apple.com", mas
construídos com caracteres cirílicos parecidos — são phishing quase
certo. O inspetor detecta isso comparando a forma renderizada com um
conjunto de caracteres confundíveis conhecidos.
Vocabulário de golpe
"Confirme sua senha." "Verifique sua conta." "Você foi selecionado." "Clique aqui para resgatar seu prêmio." Cada frase é um sinal fraco. Uma página que contém três delas, dentro de um formulário de login, num domínio do qual ninguém nunca ouviu falar, é outra história.
QR codes e cargas na área de transferência
Um QR code que decodifica para uma URI de pagamento em cripto numa carteira sem relação nenhuma. Uma página que silenciosamente escreve um comando de shell na sua área de transferência enquanto pede para você "apertar Win+R e colar". São padrões de ataque modernos que furam todos os filtros tradicionais.
Um pré-filtro local também garante que o inspetor não incomode o servidor com sites com os quais ninguém precisa se preocupar. Os cem mil domínios do topo da lista Tranco, mais um conjunto curado de mais de 30 provedores de SSO (Google, Microsoft, Okta, Apple e por aí vai), são silenciosamente ignorados enquanto nada mais parecer suspeito. O banco de verdade da sua mãe, a farmácia de verdade dela e o webmail de verdade dela nunca serão reportados.
Se, depois da varredura local, nada é interessante, a história termina aqui. Nenhuma requisição sai do computador.
Passo dois — a segunda opinião.
Se o dossiê é interessante — ou se um campo de senha acabou de aparecer num domínio desconhecido — um relatório estruturado é enviado para avaliação. Não um screenshot. Não o DOM inteiro. Um resumo delimitado e higienizado de sinais.
O pacote inclui a URL, o domínio, o texto visível (limitado a cerca de 800 caracteres, sem caracteres de controle), um resumo de cada formulário (tipos de campo, rótulos dos botões e a URL de action), quais campos sensíveis foram detectados, o título da página e os títulos principais, de onde o logotipo é servido, flags de incompatibilidade de domínio e homóglifos, sinais de alerta no nível da URL (marca no subdomínio, punycode, excesso de hifens), flags estruturais (só formulários de login, autocomplete de senha desativado, favicon em data-URI, iframes ocultos), o conteúdo de QR codes, se algum foi decodificado, e cargas na área de transferência, se alguma foi escrita silenciosamente. Todas as strings têm limites curtos; as listas têm limites pequenos; caracteres de controle não sobrevivem.
No servidor, o dossiê é entregue ao Claude Haiku 4.5 — um modelo pequeno e rápido. O prompt de sistema ensina o modelo a tratar tudo no dossiê como evidência forense não confiável: a presumir que a página foi construída por alguém que sabia que o prompt existia e a escreveu para confundi-lo. O prompt leva o modelo por nove verificações ordenadas (análise de domínio, imitação de marca, estrutura da página, captura de credenciais, links suspeitos, conteúdo de golpe, QR codes, cargas na área de transferência, síntese final) e exige que ele emita um único objeto JSON:
{
"verdict": "phishing" | "suspicious" | "safe",
"confidence": 0.0,
"reason": "uma frase curta, em linguagem simples"
}
Os limiares são calibrados de propósito. Acima de 0,85, o veredicto é phishing e o site é bloqueado. Entre 0,4 e 0,84 ele é suspeito e um banner de aviso é exibido. Abaixo de 0,4 ele é seguro e nada é mostrado. Um sinal fraco sozinho — uma palavra de golpe, um favicon incompatível — não passa da linha sozinho. O modelo é avisado, explicitamente, de que um falso positivo na farmácia da sua avó é pior do que deixar passar um golpe medíocre.
Dois caminhos rápidos dispensam o modelo totalmente quando a resposta já é óbvia:
- Atalho por marca incompatível — se a página afirma ser do PayPal mas
o domínio é
paypai-secure.xyz, o servidor devolve suspeito na hora, sem chamada ao LLM e sem custo. - Cache quente — os veredictos são indexados por
{domain, caminho normalizado}e guardados em memcache por uma hora. Uma segunda visita à mesma página não custa nada e responde em milissegundos.
Passo três — o veredicto na página.
O veredicto chega e o Bromure o renderiza inline — na página, acima do conteúdo. Sem popup. Sem modal que seus pais precisem dispensar antes de conseguir ver o que vieram ver.
A linha de motivo é sempre uma frase só, escrita para a pessoa que está lendo, não para quem está depurando. "Este site está se passando pelo PayPal. Não informe suas credenciais." é o que o banner diz — não uma pontuação de confiança, não um rastro de sinais, não uma lista de matches de regex. A ideia é que sua mãe consiga ler o banner uma vez e saber o que fazer.
Toda dispensa de um banner suspeito fica restrita à sessão atual, ou é promovida para a lista de confiáveis do perfil se ela clicar em Conheço este site. A decisão de confiar é dela, não do modelo.
A captura entre domínios — uma rede de segurança que não depende de veredicto.
Antes mesmo de qualquer veredicto chegar, o Bromure impõe uma regra dura:
uma senha nunca é enviada para um domínio diferente do que está na barra de
endereços, sem perguntar. Se um formulário em login.bank.com está prestes
a fazer POST para credentials.attacker.example, o envio é interceptado e
um modal aparece.
Uma pequena allowlist curada de provedores de identidade conhecidos — Google, Microsoft, Okta, Apple e algumas dezenas de outros — isenta os logins federados legítimos da captura. Todo o resto recebe o modal, sempre. Essa regra, sozinha, pega uma fatia enorme das páginas de phishing de credenciais antes mesmo do modelo devolver um veredicto.
Para onde seus dados realmente vão.
Duas restrições guiam o caminho dos dados. A primeira é consentimento. A segunda é isolamento.
Consentimento. O recurso vem desligado em cada novo perfil. Para ativá-lo,
o usuário abre Privacidade e Segurança e encontra um modal dedicado que
descreve, antes de qualquer chave ser acionada, exatamente o que é enviado
(URL, texto da página, estrutura do formulário, sinais de alerta), para onde
vai (um servidor operado pelo Bromure em bromure.io), por quanto tempo é
guardado (logs de curto prazo, para prevenção de abuso e aprimoramento do
modelo) e como desligar. O recurso só está disponível em perfis
persistentes — não em sessões efêmeras e descartáveis — para que uma
sessão anônima de pesquisa não vaze dados para o servidor por acidente. Se
você instalar o Bromure no Mac da sua avó e ativar o recurso para ela, o
banner que ela vê é a prova de que a escolha foi feita de propósito, em
nome dela, por alguém em quem ela confia.
Isolamento. O navegador não está diretamente conectado à internet. Nem o inspetor. Todos os achados viajam por um canal vsock da VM convidada até o host, numa porta interna — não pela interface de rede que as páginas da web enxergam, e não por nenhum proxy que a página consiga influenciar. O host repassa a requisição à API, recebe o veredicto e o devolve ao inspetor. Nenhuma página da web no mundo consegue alcançar a ponte vsock; nenhuma página da web consegue alcançar o host diretamente; nenhuma página da web consegue sequer saber que a ponte existe.
A URL da página que está sendo verificada é registrada no servidor, brevemente, para prevenção de abuso. O texto visível é enviado ao modelo para análise e não é retido depois da resposta. Nada do que você digitou em um formulário entra no pacote. Se você desligar o recurso, nenhum dado é enviado.
Rápido nas páginas que você já conhece.
Chamar um modelo de linguagem a cada carregamento de página deixaria o navegador pesado. O Bromure faz cache de veredictos de forma agressiva, de modo que as páginas mais acessadas da internet ficam, na prática, gratuitas de avaliar depois da primeira visita — e, se o servidor estiver inalcançável, a varredura local continua fazendo o seu trabalho.
Cache primeiro, modelo por último
Os veredictos são cacheados por {domain, caminho normalizado} por uma
hora. Uma segunda visita à mesma página responde em milissegundos, sem
encostar no modelo. Os atalhos por marca incompatível pulam o modelo
por completo.
A varredura local é o piso
Se o servidor estiver inalcançável ou lento, a varredura local continua rodando. Os banners para os casos mais óbvios — senhas entre domínios, domínios com homóglifos, cargas na área de transferência — são gerados inteiramente dentro do seu computador, sem precisar de rede.
A promessa, cumprida.
Dissemos no primeiro post que a defesa deveria ser um segundo par de olhos que nunca pisca. Isto é o que esse par de olhos efetivamente faz, dentro do Bromure, agora.
Sua mãe não deveria ter que passar num quiz de segurança para ler notícias. Seu pai não deveria precisar saber o que é um homóglifo. Seu avô não deveria ter que se sentir burro porque uma voz educada ao telefone disse para ele instalar uma coisa. O navegador deveria enxergar a armadilha, a tempo, e dizer — numa frase, não em jargão — antes de uma senha sair do teclado.
É para isso que serve o antiphishing do Bromure. É por isso que ele vem desativado por padrão, documentado antes de ser ativado, isolado da página e barato de rodar em escala. Instale-o no Mac dos seus pais. Acompanhe-os pelo painel de Privacidade e Segurança. Ative o recurso. Depois vá jantar.