Loading...

UM PLANO PARA SPAM

Original

Agosto de 2002

(Este artigo descreve as técnicas de filtragem de spam usadas no leitor de e-mail baseado na web à prova de spam que construímos para exercitar Arc. Um algoritmo aprimorado é descrito em Filtragem Bayesiana Melhor.)

Acho que é possível parar o spam e que os filtros baseados em conteúdo são a maneira de fazer isso. O calcanhar de Aquiles dos spammers é sua mensagem. Eles podem contornar qualquer outra barreira que você estabeleça. Eles têm feito isso até agora, pelo menos. Mas eles têm que entregar sua mensagem, seja o que for. Se pudermos escrever software que reconheça suas mensagens, não há como eles contornarem isso.


Para o destinatário, o spam é facilmente reconhecível. Se você contratasse alguém para ler seu correio e descartar o spam, eles teriam pouca dificuldade em fazê-lo. Quanto temos que fazer, além da IA, para automatizar esse processo?

Acho que poderemos resolver o problema com algoritmos bastante simples. Na verdade, descobri que você pode filtrar o spam atual de maneira aceitável usando nada mais do que uma combinação bayesiana das probabilidades de spam de palavras individuais. Usando um filtro bayesiano ligeiramente ajustado (como descrito abaixo), agora perdemos menos de 5 em 1000 spams, com 0 falsos positivos.

A abordagem estatística geralmente não é a primeira que as pessoas tentam quando escrevem filtros de spam. A primeira intuição da maioria dos hackers é tentar escrever software que reconheça propriedades individuais do spam. Você olha para os spams e pensa: a audácia desses caras em tentar me enviar e-mail que começa com "Caro Amigo" ou tem um linha de assunto toda em maiúsculas e termina com oito pontos de exclamação. Posso filtrar isso com cerca de uma linha de código.

E assim você faz, e no início funciona. Algumas regras simples vão dar uma grande mordida no seu spam recebido. Apenas procurar a palavra "clique" vai pegar 79,7% dos e-mails no meu corpus de spam, com apenas 1,2% de falsos positivos.

Passei cerca de seis meses escrevendo software que procurava por recursos individuais de spam antes de tentar a abordagem estatística. O que descobri foi que reconhecer os últimos por cento de spams ficou muito difícil e que, à medida que eu tornava os filtros mais rígidos, eu obtinha mais falsos positivos.

Falsos positivos são e-mails inocentes que são erroneamente identificados como spam. Para a maioria dos usuários, perder e-mails legítimos é uma ordem de magnitude pior do que receber spam, então um filtro que gera falsos positivos é como uma cura para a acne que carrega o risco de morte para o paciente.

Quanto mais spam um usuário recebe, menos provável será que ele perceba um e-mail inocente sentado na sua pasta de spam. E, estranhamente, quanto melhores seus filtros de spam ficarem, mais perigosos se tornam os falsos positivos, porque quando os filtros são realmente bons, os usuários terão mais probabilidade de ignorar tudo o que eles pegam.

Não sei por que evitei tentar a abordagem estatística por tanto tempo. Acho que foi porque me viciava em tentar identificar recursos de spam eu mesmo, como se estivesse jogando algum tipo de jogo competitivo com os spammers. (Não-hackers não percebem com frequência, mas a maioria dos hackers é muito competitiva.) Quando tentei a análise estatística, descobri imediatamente que ela era muito mais inteligente do que eu havia sido. Descobriu, é claro, que termos como "virtumundo" e "adolescentes" são bons indicadores de spam. Mas também descobriu que "per" e "FL" e "ff0000" são bons indicadores de spam. Na verdade, "ff0000" (html para vermelho brilhante) acaba sendo um indicador de spam tão bom quanto qualquer termo pornográfico.


Aqui está um esboço de como faço a filtragem estatística. Começo com um corpus de spam e outro de e-mails não spam. No momento, cada um tem cerca de 4000 mensagens nele. Eu digitalizo todo o texto, incluindo cabeçalhos e HTML e JavaScript embutidos, de cada mensagem em cada corpus. Atualmente considero caracteres alfanuméricos, hifens, apóstrofos e sinais de dólar como parte dos tokens, e tudo o mais como um separador de tokens. (Provavelmente há espaço para melhoria aqui.) Ignoro tokens que são todos dígitos e também ignoro comentários HTML, nem mesmo os considerando como separadores de tokens.

Eu conto o número de vezes que cada token (ignorando maiúsculas e minúsculas, no momento) ocorre em cada corpus. Nesta etapa, eu termino com duas grandes tabelas hash, uma para cada corpus, mapeando tokens para número de ocorrências.

Próximo, eu crio uma terceira tabela hash, desta vez mapeando cada token para a probabilidade de que um e-mail contendo-o seja um spam, que eu calculo da seguinte forma [1]:


(let ((g (* 2 (or (gethash word good) 0))) (b (or (gethash word bad) 0))) (unless (< (+ g b) 5) (max .01 (min .99 (float (/ (min 1 (/ b nbad)) (+
(min 1 (/ g ngood)) (min 1 (/ b nbad)))))))))

onde word é o token cuja probabilidade estamos calculando, good e bad são as tabelas hash que criei na primeira etapa, e ngood e nbad são o número de mensagens não spam e spam, respectivamente.

Eu expliquei isso como código para mostrar alguns detalhes importantes. Eu quero viesar ligeiramente as probabilidades para evitar falsos positivos, e por tentativa e erro descobri que uma boa maneira de fazer isso é dobrar todos os números em good. Isso ajuda a distinguir entre palavras que ocasionalmente ocorrem em e-mails legítimos e palavras que quase nunca o fazem. Eu só considero palavras que ocorrem mais de cinco vezes no total (na verdade, por causa da duplicação, ocorrer três vezes no correio não spam seria o suficiente). E então há a questão de que probabilidade atribuir a palavras que ocorrem em um corpus, mas não no outro. Novamente por tentativa e erro, escolhi .01 e .99. Pode haver espaço para ajuste aqui, mas à medida que o corpus cresce, esse ajuste acontecerá automaticamente de qualquer maneira.

Os especialmente observadores notarão que, embora eu considere cada corpus como um único fluxo longo de texto para fins de contagem de ocorrências, uso o número de e-mails em cada um, em vez de seu comprimento combinado, como divisor no cálculo das probabilidades de spam. Isso adiciona outro pequeno viés para proteger contra falsos positivos.

Quando chega um novo e-mail, ele é digitalizado em tokens, e os quinze tokens mais interessantes, onde interessante é medido por quão longe sua probabilidade de spam está de um .5 neutro, são usados para calcular a probabilidade de que o e-mail seja spam. Se probs é uma lista das quinze probabilidades individuais, você calcula a probabilidade combinada assim:

(let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs)))))

Uma questão que surge na prática é que probabilidade atribuir a uma palavra que você nunca viu, ou seja, uma que não aparece na tabela hash de probabilidades de palavras. Descobri, novamente por tentativa e erro, que .4 é um bom número a ser usado. Se você nunca viu uma palavra antes, provavelmente é bastante inocente; as palavras de spam tendem a ser muito familiares.

Há exemplos da aplicação deste algoritmo a e-mails reais em um apêndice no final.

Eu trato o correio como spam se o algoritmo acima der a ele uma probabilidade de mais de .9 de ser spam. Mas na prática, não faria muita diferença onde eu colocasse esse limite, porque poucas probabilidades acabam no meio da faixa.


Uma grande vantagem da abordagem estatística é que você não precisa ler tantos spams. Nos últimos seis meses, li literalmente milhares de spams, e é realmente um pouco desmoralizante. Norbert Wiener disse que se você competir com escravos, você se torna um escravo, e há algo igualmente degradante em competir com spammers. Para reconhecer recursos individuais de spam, você precisa tentar entrar na mente do spammer, e francamente, eu quero passar o mínimo de tempo possível dentro das mentes dos spammers.

Mas a verdadeira vantagem da abordagem Bayesiana, é claro, é que você sabe o que está medindo. Filtros de reconhecimento de recursos como o SpamAssassin atribuem uma "pontuação" de spam ao e-mail. A abordagem Bayesiana atribui uma probabilidade real. O problema com uma "pontuação" é que ninguém sabe o que ela significa. O usuário não sabe o que isso significa, mas pior ainda, nem mesmo o desenvolvedor do filtro sabe. Quantos pontos um e-mail deve receber por ter a palavra "sexo" nele? Uma probabilidade, é claro, pode estar errada, mas há pouca ambiguidade sobre o que ela significa ou como a evidência deve ser combinada para calculá-la. Com base no meu corpus, "sexo" indica uma probabilidade de .97 de o e-mail contendo ser um spam, enquanto "sexy" indica uma probabilidade de .99. E a Regra de Bayes, igualmente inequívoca, diz que um e-mail contendo ambas as palavras teria, na ausência (improvável) de qualquer outra evidência, 99,97% de chance de ser um spam.

Porque está medindo probabilidades, a abordagem bayesiana considera todas as evidências no e-mail, tanto boas quanto ruins. Palavras que ocorrem desproporcionalmente raramente em spam (como "embora" ou "esta noite" ou "aparentemente") contribuem tanto para diminuir a probabilidade quanto palavras ruins como "cancelar inscrição" e "optar" para aumentá-la. Portanto, um e-mail de outra forma inocente que por acaso inclua a palavra "sexo" não será marcado como spam.

Idealmente, é claro, as probabilidades devem ser calculadas individualmente para cada usuário. Recebo muitos e-mails contendo a palavra "Lisp" e (até agora) nenhum spam que o faça. Então uma palavra como essa é efetivamente uma espécie de senha para enviar e-mail para mim. No meu software de filtragem de spam anterior, o usuário poderia configurar uma lista de tais palavras e o e-mail contendo-as seria automaticamente liberado pelos filtros. Na minha lista, coloquei palavras como "Lisp" e também meu código postal, para que (de outra forma com aparência de spam) os recibos de pedidos online fossem liberados. Achei que estava sendo muito esperto, mas descobri que o filtro bayesiano fez a mesma coisa por mim e, além disso, descobriu muitas palavras que eu não havia pensado.

Quando disse no início que nossos filtros deixam passar menos de 5 spams por 1000 com 0 falsos positivos, estou falando sobre filtrar meu e-mail com base em um corpus do meu e-mail. Mas esses números não são enganosos, porque essa é a abordagem que estou defendendo: filtrar o e-mail de cada usuário com base no spam e no não spam que ele recebe. Essencialmente, cada usuário deve ter dois botões de exclusão, exclusão normal e exclusão como spam. Qualquer coisa excluída como spam vai para o corpus de spam e tudo o mais vai para o corpus de não spam.

Você poderia começar os usuários com um filtro semente, mas, em última análise, cada usuário deve ter suas próprias probabilidades por palavra com base no e-mail real que recebe. Isso (a) torna os filtros mais eficazes, (b) permite que cada usuário decida sua própria definição precisa de spam e (c) talvez o melhor de tudo, torna difícil para os spammers ajustar os e-mails para passar pelos filtros. Se grande parte do cérebro do filtro estiver nos bancos de dados individuais, então apenas ajustar os spams para passar pelos filtros semente não garantirá nada sobre o quão bem eles passarão pelos filtros muito mais treinados e variados de cada usuário.

A filtragem de spam com base no conteúdo é frequentemente combinada com uma lista de permissões, uma lista de remetentes cujos e-mails podem ser aceitos sem filtragem. Uma maneira fácil de construir uma lista de permissões é manter uma lista de todos os endereços para os quais o usuário já enviou e-mail. Se um leitor de e-mail tiver um botão de excluir como spam, você também poderá adicionar o endereço do remetente de todos os e-mails que o usuário excluiu como lixo normal.

Sou um defensor das listas de permissões, mas mais como uma maneira de economizar cálculos do que como uma maneira de melhorar a filtragem. Eu costumava pensar que as listas de permissões facilitariam a filtragem, porque você só teria que filtrar e-mails de pessoas que você nunca ouviu falar, e alguém que lhe envia um e-mail pela primeira vez é limitado por convenção no que pode dizer a você. Alguém que você já conhece pode lhe enviar um e-mail falando sobre sexo, mas alguém que lhe envia um e-mail pela primeira vez provavelmente não faria isso. O problema é que as pessoas podem ter mais de um endereço de e-mail, então um novo endereço do remetente não garante que o remetente esteja escrevendo para você pela primeira vez. Não é incomum que um velho amigo (especialmente se for um hacker) de repente lhe envie um e-mail com um novo endereço do remetente, então você não pode arriscar falsos positivos filtrando e-mails de endereços desconhecidos de maneira especialmente rigorosa.

Em certo sentido, porém, meus filtros incorporam uma espécie de lista de permissões (e lista negra) porque são baseados em mensagens inteiras, incluindo os cabeçalhos. Então, nessa medida, eles "conhecem" os endereços de e-mail de remetentes confiáveis e até mesmo as rotas pelas quais o e-mail chega a mim. E eles sabem o mesmo sobre spam, incluindo os nomes dos servidores, as versões do programa de e-mail e os protocolos.


Se eu achasse que poderia manter as taxas atuais de filtragem de spam, eu consideraria esse problema resolvido. Mas não significa muito poder filtrar a maior parte do spam atual, porque o spam evolui. De fato, a maioria das técnicas antispam até agora têm sido como pesticidas que não fazem mais do que criar uma nova cepa de insetos resistente.

Estou mais esperançoso sobre os filtros bayesianos, porque eles evoluem com o spam. Então, à medida que os spammers começam a usar "c0ck" em vez de "cock" para evitar filtros de spam ingênuos baseados em palavras individuais, os filtros bayesianos notam automaticamente. De fato, "c0ck" é uma evidência muito mais condenatória do que "cock", e os filtros bayesianos sabem precisamente o quanto mais.

Ainda assim, qualquer um que proponha um plano de filtragem de spam precisa ser capaz de responder à pergunta: se os spammers soubessem exatamente o que você está fazendo, quão bem eles poderiam passar por você? Por exemplo, acho que se a filtragem de spam baseada em checksum se tornar um obstáculo sério, os spammers simplesmente mudarão para técnicas de "mad-lib" para gerar os corpos das mensagens.

Para vencer os filtros bayesianos, não bastaria que os spammers tornassem seus e-mails únicos ou parassem de usar palavras maliciosas individuais. Eles teriam que tornar seus e-mails indistinguíveis de seus e-mails comuns. E isso, eu acho, os restringiria severamente. O spam é principalmente propostas de vendas, então, a menos que seus e-mails regulares sejam todos propostas de vendas, os spams inevitavelmente terão um caráter diferente. E os spammers também, é claro, teriam que mudar (e continuar mudando) toda a sua infraestrutura, porque, caso contrário, os cabeçalhos pareceriam tão ruins para os filtros bayesianos quanto sempre, não importa o que fizessem com o corpo da mensagem. Não sei o suficiente sobre a infraestrutura que os spammers usam para saber o quão difícil seria fazer com que os cabeçalhos parecessem inocentes, mas meu palpite é que seria ainda mais difícil do que fazer a mensagem parecer inocente.

Assumindo que eles pudessem resolver o problema dos cabeçalhos, o spam do futuro provavelmente parecerá algo assim:

Ei aí. Achei que você deveria dar uma olhada no seguinte: http://www.27meg.com/foo

porque essa é aproximadamente a quantidade de proposta de vendas que a filtragem baseada em conteúdo deixará o spammer espaço para fazer. (De fato, será difícil até mesmo passar isso pelos filtros, porque se todo o resto no e-mail for neutro, a probabilidade de spam vai depender da URL, e vai levar algum esforço para fazer isso parecer neutro.)

Os spammers variam de empresas que executam listas chamadas de "opt-in" e nem sequer tentam ocultar suas identidades, a caras que sequestram servidores de e-mail para enviar spams promovendo sites pornográficos. Se usarmos a filtragem para reduzir suas opções a e-mails como o acima, isso deve praticamente colocar os spammers do "lado legítimo" do espectro fora do negócio; eles se sentem obrigados por várias leis estaduais a incluir texto padrão sobre por que seu spam não é spam e como cancelar sua "assinatura", e esse tipo de texto é fácil de reconhecer.

(Eu costumava pensar que era ingênuo acreditar que leis mais rígidas diminuiriam o spam. Agora acho que, embora leis mais rígidas possam não diminuir a quantidade de spam que os spammers enviam, elas certamente podem ajudar os filtros a diminuir a quantidade de spam que os destinatários realmente veem.)

Em todo o espectro, se você restringir as propostas de vendas que os spammers podem fazer, inevitavelmente tenderá a colocá-los fora do negócio. Essa palavra negócio é uma importante de se lembrar. Os spammers são homens de negócios. Eles enviam spam porque funciona. Funciona porque, embora a taxa de resposta seja abominável (no máximo 15 por milhão, contra 3.000 por milhão para um catálogo), o custo, para eles, é praticamente nada. O custo é enorme para os destinatários, cerca de 5 semanas-homem para cada milhão de destinatários que gastam um segundo para excluir o spam, mas o spammer não precisa pagar isso.

Enviar spam custa algo para o spammer, no entanto. [[2]] Então, quanto mais baixa pudermos deixar a taxa de resposta - seja por filtragem, seja usando filtros para forçar os spammers a diluir suas propostas - menos empresas acharão que vale a pena enviar spam.

A razão pela qual os spammers usam os tipos de propostas de vendas que eles usam é para aumentar as taxas de resposta. Isso é possivelmente ainda mais nojento do que entrar na mente de um spammer, mas vamos dar uma rápida olhada na mente de alguém que responde a um spam. Essa pessoa é ou surpreendentemente crédula ou profundamente negada sobre seus interesses sexuais. Em qualquer caso, por mais repulsiva ou idiota que a spam pareça para nós, é emocionante para eles. Os spammers não diriam essas coisas se elas não soassem emocionantes. E "achei que você deveria dar uma olhada no seguinte" simplesmente não vai ter nem de longe o mesmo apelo com o destinatário do spam quanto os tipos de coisas que os spammers dizem agora. Resultado: se não puder conter propostas de vendas emocionantes, o spam se torna menos eficaz como veículo de marketing, e menos empresas querem usá-lo.

Essa é a grande vitória no final. Comecei a escrever software de filtragem de spam porque não queria ter que olhar para aquilo mais. Mas se ficarmos bons o suficiente em filtrar o spam, isso vai parar de funcionar, e os spammers vão parar de enviá-lo.


De todas as abordagens para combater o spam, do software às leis, acredito que a filtragem bayesiana será a mais eficaz. Mas também acho que quanto mais diferentes tipos de esforços anti-spam empreendermos, melhor, porque qualquer medida que restrinja os spammers tenderá a facilitar a filtragem. E mesmo dentro do mundo da filtragem baseada em conteúdo, acho que será bom se houver muitos tipos diferentes de software sendo usados simultaneamente. Quanto mais filtros diferentes houver, mais difícil será para os spammers ajustarem os spams para passarem por eles.

Apêndice: Exemplos de Filtragem

Aqui está um exemplo de um spam que chegou enquanto eu estava escrevendo este artigo. As quinze palavras mais interessantes neste spam são:

qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg unsecured platinum 3d0 qves 7c5 7c266675

As palavras são uma mistura de coisas dos cabeçalhos e do corpo da mensagem, o que é típico de spam. Também típico de spam é que cada uma dessas palavras tem uma probabilidade de spam, em meu banco de dados, de .99. Na verdade, há mais de quinze palavras com probabilidades de .99, e estas são apenas as primeiras quinze vistas.

Infelizmente, isso torna este e-mail um exemplo entediante do uso da Regra de Bayes. Para ver uma variedade interessante de probabilidades, temos que olhar para este spam realmente atípico.

As quinze palavras mais interessantes neste spam, com suas probabilidades, são:

madam 0.99 promotion 0.99 republic 0.99 shortest 0.047225013 mandatory 0.047225013 standardization 0.07347802 sorry 0.08221981 supported 0.09019077
people's 0.09019077 enter 0.9075001 quality 0.8921298 organization 0.12454646 investment 0.8568143 very 0.14758544 valuable 0.82347786

Desta vez, a evidência é uma mistura de bom e ruim. Uma palavra como "shortest" é quase tão evidência de inocência quanto uma palavra como "madam" ou "promotion" é de culpa. Mas ainda assim, o caso de culpa é mais forte. Se você combinar esses números de acordo com a Regra de Bayes, a probabilidade resultante é de .9027.

"Madam" é obviamente de spams começando com "Prezado Senhor ou Senhora". Eles não são muito comuns, mas a palavra "madam" nunca ocorre em meu e-mail legítimo, e tudo se resume à proporção.

"Republic" pontua alto porque aparece com frequência em e-mails de golpes nigerianos, e também ocorre uma ou duas vezes em spams referindo-se à Coreia e à África do Sul. Você pode dizer que é um acidente que ela ajude a identificar este spam. Mas descobri, ao examinar as probabilidades de spam, que há muitos desses acidentes, e eles têm uma tendência estranha de empurrar as coisas na direção certa em vez da errada. Neste caso, não é inteiramente uma coincidência que a palavra "República" ocorra em e-mails de golpes nigerianos e neste spam. Existe toda uma classe de propostas comerciais duvidosas envolvendo países menos desenvolvidos, e estas, por sua vez, têm mais probabilidade de ter nomes que especificam explicitamente (porque não são) que são repúblicas.[3]

Por outro lado, "enter" é um erro genuíno. Ela ocorre principalmente em instruções de cancelamento de inscrição, mas aqui é usada de uma maneira completamente inocente. Felizmente, a abordagem estatística é bastante robusta e pode tolerar bastante erros antes que os resultados comecem a ser prejudicados.

Para efeito de comparação, aqui está um exemplo dessa ave rara, um spam que passa pelos filtros. Por quê? Porque, por mera coincidência, ele acontece de estar carregado de palavras que ocorrem em meu e-mail real:

perl 0,01 python 0,01 tcl 0,01 scripting 0,01 morris 0,01 graham 0,01491078 garantia 0,9762507 cgi 0,9734398 paul 0,027040077 bastante 0,030676773 pop3 0,042199217 vários 0,06080265 preços 0,9359873 gerenciado 0,06451222 difícil 0,071706355


Há um par de boas notícias aqui. Primeiro, este e-mail provavelmente não passaria pelos filtros de alguém que não se especializasse em
linguagens de programação e tivesse um bom amigo chamado Morris. Para o usuário médio, todas as cinco principais palavras aqui seriam neutras e não contribuiriam para
a probabilidade de spam.

Segundo, acho que a filtragem com base em pares de palavras (veja abaixo) provavelmente pegaria este: "custo efetivo", "taxa de configuração", "dinheiro de volta" -- coisas bem incriminadoras
. E, é claro, se eles continuassem a me enviar spam (ou uma rede da qual eu fizesse parte), o próprio "Hostex" seria reconhecido como um termo de spam.

Finalmente, 
[
aqui
](https://sep.turbifycdn.com/ty/cdn/paulgraham/legit.txt?t=1688221954&) 
está um e-mail inocente. Suas quinze palavras mais interessantes são as seguintes:

continuação 0,01 descrever 0,01 continuações 0,01 exemplo 0,033600237 programação 0,05214485 eu sou 0,055427782 exemplos 0,07972858 cor 0,9189189 localhost 0,09883721 oi 0,116539136 califórnia 0,84421706 mesmo 0,15981844 spot 0,1654587 us-ascii 0,16804294 o que 0,19212411


A maioria das palavras aqui indica que o e-mail é inocente. Há duas palavras com cheiro ruim, "cor" (os spammers adoram fontes coloridas) e "Califórnia" (que
ocorre em depoimentos e também em menus em formulários), mas elas não são suficientes para superar palavras obviamente inocentes como "continuação" e "exemplo".

É interessante que "descrever" seja considerado tão completamente inocente. Ele não ocorreu em nenhum dos meus 4.000 spams. Os dados acabam se revelando cheios de
surpresas desse tipo. Uma das coisas que você aprende ao analisar textos de spam é o quão estreito é o subconjunto da linguagem em que os spammers operam. É esse fato, juntamente com
o vocabulário igualmente característico do correio de cada usuário individual, que torna a filtragem bayesiana uma boa aposta.

**Apêndice: Mais Ideias**

Uma ideia que ainda não tentei é filtrar com base em pares de palavras, ou mesmo trios, em vez de palavras individuais. Isso deve produzir uma estimativa muito mais precisa
da probabilidade. Por exemplo, em meu banco de dados atual, a palavra "ofertas" tem uma probabilidade de 0,96. Se você baseasse as probabilidades em pares de palavras, você
acabaria com "ofertas especiais" e "ofertas valiosas" tendo probabilidades de 0,99 e, digamos, "abordagem oferece" (como em "esta abordagem oferece") tendo uma probabilidade
de 0,1 ou menos.

A razão pela qual não fiz isso é que a filtragem com base em palavras individuais já funciona muito bem. Mas isso significa que há espaço para apertar os filtros
se o spam ficar mais difícil de detectar. (Curiosamente, um filtro baseado em pares de palavras seria, em efeito, um gerador de texto Markov-chaining rodando ao contrário.)

Recursos específicos de spam (por exemplo, não ver o endereço do destinatário no campo para:) têm, é claro, valor no reconhecimento de spam. Eles podem ser considerados neste
algoritmo tratando-os como palavras virtuais. Provavelmente farei isso em versões futuras, pelo menos para uma dúzia dos indicadores de spam mais flagrantes.
Filtros de spam que reconhecem recursos têm razão em muitos detalhes; o que lhes falta é uma disciplina geral para combinar evidências.

Reconhecer recursos não-spam pode ser mais importante do que reconhecer recursos de spam. Os falsos positivos são uma preocupação tão grande que exigem medidas extraordinárias.
Provavelmente, em versões futuras, adicionarei um segundo nível de testes projetado especificamente para evitar falsos positivos. Se um e-mail ativar esse segundo nível de
filtros, ele será aceito, mesmo que sua probabilidade de spam esteja acima do limite.

Não espero que esse segundo nível de filtragem seja bayesiano. Inevitavelmente será não apenas ad hoc, mas baseado em suposições, porque o número de falsos
positivos não tenderá a ser grande o suficiente para notar padrões. (De qualquer forma, é bom se um sistema de backup não depender da mesma tecnologia que o
sistema principal.)

Outra coisa que eu posso tentar no futuro é focar atenção extra em partes específicas do e-mail. Por exemplo, cerca de 95% do spam atual inclui o URL de um site que eles querem que você visite. (Os 5% restantes querem que você ligue para um número de telefone, responda por e-mail ou para um endereço postal nos EUA, ou em alguns casos, compre uma determinada ação.) O URL é, nesses casos, praticamente suficiente por si só para determinar se o e-mail é spam.

Os nomes de domínio diferem do resto do texto em um e-mail (não alemão) no fato de que muitas vezes consistem em várias palavras coladas juntas. Embora computacionalmente caro no caso geral, pode valer a pena tentar decompô-los. Se um filtro nunca viu o token "xxxporn" antes, ele terá uma probabilidade individual de spam de 0,4, enquanto "xxx" e "porn" individualmente têm probabilidades (em meu corpus) de 0,9889 e 0,99 respectivamente, e uma probabilidade combinada de 0,9998.

Eu espero que a decomposição de nomes de domínio se torne mais importante à medida que os spammers forem gradualmente forçados a parar de usar palavras incriminadoras no texto de suas mensagens. (Um URL com um endereço IP é, é claro, um sinal extremamente incriminador, exceto no correio de alguns administradores de sistema.)

Pode ser uma boa ideia ter uma lista mantida cooperativamente de URLs promovidos por spammers. Precisaríamos de uma métrica de confiança do tipo estudado por Raph Levien para evitar submissões maliciosas ou incompetentes, mas se tivéssemos tal coisa, ela forneceria um impulso a qualquer software de filtragem. Também seria uma base conveniente para boicotes.

Outra maneira de testar URLs duvidosas seria enviar um rastreador para olhar o site antes que o usuário olhasse o e-mail que o menciona. Você poderia usar um filtro bayesiano para classificar o site da mesma forma que classificaria um e-mail, e o que quer que fosse encontrado no site poderia ser incluído no cálculo da probabilidade de o e-mail ser um spam. Um URL que levasse a um redirecionamento seria, é claro, especialmente suspeito.

Um projeto cooperativo que eu acho que realmente seria uma boa ideia seria acumular um enorme corpus de spam. Um grande corpus limpo é a chave para fazer com que a filtragem bayesiana funcione bem. Os filtros bayesianos poderiam até usar o corpus como entrada. Mas tal corpus seria útil para outros tipos de filtros também, pois poderia ser usado para testá-los.

A criação de tal corpus apresenta alguns problemas técnicos. Precisaríamos de métricas de confiança para evitar submissões maliciosas ou incompetentes, é claro. Também precisaríamos de maneiras de apagar informações pessoais (não apenas endereços para e cópias, mas também, por exemplo, os argumentos para URLs de cancelamento de inscrição, que muitas vezes codificam o endereço para) de e-mails no corpus. Se alguém quiser se encarregar deste projeto, seria uma boa coisa para o mundo.

**Apêndice: Definindo Spam**

Acho que há um consenso aproximado sobre o que é spam, mas seria útil ter uma definição explícita. Precisaremos fazer isso se quisermos estabelecer um corpus central de spam ou mesmo comparar as taxas de filtragem de spam de maneira significativa.

Para começar, spam não é e-mail comercial não solicitado. Se alguém no meu bairro soubesse que eu estava procurando uma antiga Raleigh de três marchas em bom estado e me enviasse um e-mail oferecendo vendê-la, eu ficaria encantado, e ainda assim este e-mail seria tanto comercial quanto não solicitado. A característica definidora do spam (de fato, sua *raison d'etre*) não é que ele é não solicitado, mas que ele é automatizado.

Também é meramente acidental que o spam seja geralmente comercial. Se alguém começasse a enviar e-mail em massa para apoiar alguma causa política, por exemplo, seria tão spam quanto e-mail promovendo um site pornográfico.

Eu proponho que definamos spam como **e-mail automatizado não solicitado**. Esta definição, portanto, inclui alguns e-mails que muitas definições legais de spam não incluem.
As definições legais de spam, influenciadas presumivelmente por lobistas, tendem a excluir e-mails enviados por empresas que têm um "relacionamento existente" com o destinatário. Mas comprar algo de uma empresa, por exemplo, não implica que você tenha solicitado e-mails contínuos dela. Se eu fizer um pedido em uma loja online e eles então me enviarem uma enxurrada de spam, ainda assim é spam.

As empresas que enviam spam muitas vezes lhe dão uma maneira de "cancelar a inscrição" ou pedem que você vá ao site deles e altere suas "preferências de conta" se quiser parar de receber spam. Isso não é suficiente para interromper o envio do e-mail. Não optar por sair não é o mesmo que optar por entrar. A menos que o destinatário tenha marcado explicitamente uma caixa claramente rotulada (cujo padrão era não) pedindo para receber o e-mail, então é spam.

Em alguns relacionamentos de negócios, você solicita implicitamente certos tipos de correspondência. Quando você faz um pedido on-line, acho que você solicita implicitamente um recibo e uma notificação quando o pedido for enviado. Não me importo quando a Verisign me envia correspondência avisando que um nome de domínio está prestes a expirar (pelo menos, se eles forem o [registrador real](http://siliconvalley.internet.com/news/article.php/1441651) para isso). Mas quando a Verisign me envia um e-mail oferecendo um GUIA GRATUITO para Construir Meu Site de Comércio Eletrônico, isso é spam.

**Notas:**

[1] Os exemplos neste artigo são traduzidos em Common Lisp, acredite ou não, por uma maior acessibilidade. A aplicação aqui descrita é uma que escrevemos para testar um novo dialeto Lisp chamado [Arc](https://paulgraham.com/arc.html) que ainda não foi lançado.

[2] Atualmente, a menor taxa parece ser de cerca de US$ 200 para enviar um milhão de spams. Isso é muito barato, 1/50 de centavo por spam. Mas filtrar 95% do spam, por exemplo, aumentaria o custo dos spammers para atingir um determinado público em um fator de 20. Poucos podem ter margens grandes o suficiente para absorver isso.

[3] Como regra geral, quanto mais qualificadores houver antes do nome de um país, mais corrutos serão os governantes. Um país chamado de República Democrática Popular Socialista de X provavelmente é o último lugar do mundo onde você gostaria de morar.

**Agradecimentos** a Sarah Harlin por ler rascunhos deste; Daniel Giffin (que também está escrevendo o interpretador de produção Arc) por várias boas ideias sobre filtragem e por criar nossa infraestrutura de correio; Robert Morris, Trevor Blackwell e Erann Gat por muitas discussões sobre spam; Raph Levien por conselhos sobre métricas de confiança; e Chip Coldwell e Sam Steingold por conselhos sobre estatísticas.

Você encontrará este ensaio e outros 14 em
[

Hackers & Painters

](http://www.amazon.com/gp/product/0596006624)
.

**Mais Informações:**