UM PLANO PARA SPAM
OriginalAgosto de 2002
(Este artigo descreve as técnicas de filtragem de spam usadas no leitor de e-mail baseado na web que construímos para exercitar Arc. Um algoritmo melhorado é descrito em Melhor Filtragem Bayesiana.)
Acho que é possível parar o spam, e que filtros baseados em conteúdo são o caminho para fazê-lo. O ponto fraco dos spammers é sua mensagem. Eles podem contornar qualquer outra barreira que você estabelecer. Até agora, pelo menos. Mas eles têm que entregar sua mensagem, seja qual for. Se conseguirmos escrever um 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 e-mail e descartar o spam, essa pessoa teria pouca dificuldade em fazê-lo. Quanto precisamos fazer, além da IA, para automatizar esse processo?
Acho que seremos capazes de resolver o problema com algoritmos bastante simples. Na verdade, descobri que você pode filtrar o spam atual de forma 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 a cada 1000 spams, com 0 falsos positivos.
A abordagem estatística geralmente não é a primeira que as pessoas tentam quando escrevem filtros de spam. O primeiro instinto da maioria dos hackers é tentar escrever um software que reconheça propriedades individuais do spam. Você olha para os spams e pensa, a ousadia desses caras em tentar me enviar um e-mail que começa com "Caro Amigo" ou tem um assunto que está todo em maiúsculas e termina em oito pontos de exclamação. Posso filtrar essas coisas com cerca de uma linha de código.
E assim você faz, e no começo funciona. Algumas regras simples vão tirar uma grande parte do seu spam recebido. Apenas procurar pela palavra "clique" vai capturar 79,7% dos e-mails no meu corpus de spam, com apenas 1,2% de falsos positivos.
Passei cerca de seis meses escrevendo um software que procurava características individuais de spam antes de tentar a abordagem estatística. O que descobri foi que reconhecer os últimos poucos por cento de spams se tornou muito difícil, e que à medida que tornava os filtros mais rigorosos, obtinha mais falsos positivos.
Falsos positivos são e-mails inocentes que são identificados erroneamente como spams. Para a maioria dos usuários, perder um e-mail legítimo é uma ordem de magnitude pior do que receber spam, então um filtro que gera falsos positivos é como um remédio para acne que traz risco de morte para o paciente.
Quanto mais spam um usuário recebe, menos provável é que ele perceba um e-mail inocente sentado em sua pasta de spam. E estranhamente, quanto melhores seus filtros de spam se tornam, mais perigosos os falsos positivos se tornam, porque quando os filtros são realmente bons, os usuários tendem a ignorar tudo o que eles capturam.
Não sei por que evitei tentar a abordagem estatística por tanto tempo. Acho que foi porque me viciei em tentar identificar características de spam eu mesmo, como se estivesse jogando algum tipo de jogo competitivo com os spammers. (Os não-hackers não costumam perceber isso, mas a maioria dos hackers é muito competitiva.) Quando finalmente tentei a análise estatística, descobri imediatamente que era muito mais inteligente do que eu. Descobriu, é claro, que termos como "virtumundo" e "teens" eram bons indicadores de spam. Mas também descobriu que "per", "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 um de e-mails não spam. No momento, cada um tem cerca de 4000 mensagens. Eu escaneio todo o texto, incluindo cabeçalhos e html e javascript incorporados, de cada mensagem em cada corpus. Atualmente, considero caracteres alfanuméricos, traços, 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 melhorias aqui.) Ignoro tokens que são todos dígitos, e também ignoro comentários html, não considerando-os nem mesmo como separadores de tokens.
Conto o número de vezes que cada token (ignorando maiúsculas e minúsculas, atualmente) ocorre em cada corpus. Neste estágio, acabo com duas grandes tabelas hash, uma para cada corpus, mapeando tokens para o número de ocorrências.
Em seguida, crio uma terceira tabela hash, desta vez mapeando cada token para a probabilidade de que um e-mail contendo-o seja um spam, que 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.
Expliquei isso como código para mostrar alguns detalhes importantes. Quero enviesar 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 ocorrem. Considero apenas palavras que ocorrem mais de cinco vezes no total (na verdade, devido à duplicação, ocorrer três vezes em e-mails não spam seria suficiente). E então há a questão de qual 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, enquanto considero cada corpus como um único longo fluxo 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 o divisor no cálculo das probabilidades de spam. Isso adiciona outro leve viés para proteger contra falsos positivos.
Quando novos e-mails chegam, eles são escaneados em tokens, e os quinze tokens mais interessantes, onde interessante é medido pela distância de sua probabilidade de spam de um neutro .5, 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 é qual probabilidade atribuir a uma palavra que você nunca viu, ou seja, uma que não ocorre 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, ela provavelmente é bastante inocente; palavras de spam tendem a ser muito familiares.
Existem exemplos desse algoritmo sendo aplicado a e-mails reais em um apêndice no final.
Considero um e-mail como spam se o algoritmo acima lhe dá uma probabilidade de mais de .9 de ser spam. Mas na prática, não importaria muito 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 isso é realmente meio desmoralizante. Norbert Wiener disse que se você compete com escravos, você se torna um escravo, e há algo igualmente degradante em competir com spammers. Para reconhecer características individuais de spam, você tem que tentar entrar na mente do spammer, e francamente, quero passar o menor tempo possível dentro das mentes dos spammers.
Mas a verdadeira vantagem da abordagem bayesiana, é claro, é que você sabe o que está medindo. Filtros que reconhecem características, 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 isso significa. O usuário não sabe o que isso significa, mas pior ainda, o desenvolvedor do filtro também não sabe. Quantos pontos um e-mail deve receber por ter a palavra "sexo" nele? Uma probabilidade pode, é claro, estar errada, mas há pouca ambiguidade sobre o que isso significa ou como as evidências devem ser combinadas para calculá-la. Com base no meu corpus, "sexo" indica uma probabilidade de .97 de que o e-mail que o contém seja um spam, enquanto "sexy" indica uma probabilidade de .99. E a Regra de Bayes, igualmente não ambígua, diz que um e-mail contendo ambas as palavras teria, na (improvável) ausência de qualquer outra evidência, uma chance de 99,97% 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 por" fazem para aumentá-la. Assim, um e-mail inocente que inclui 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 a contenha. Assim, uma palavra como essa é efetivamente uma espécie de senha para enviar e-mails para mim. No meu software anterior de filtragem de spam, o usuário poderia configurar uma lista de tais palavras e e-mails contendo-as passariam automaticamente pelos filtros. Na minha lista, coloquei palavras como "Lisp" e também meu código postal, para que recibos (de outra forma, com som de spam) de pedidos online passassem. Pensei 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 e-mail não spam que ele recebe. Essencialmente, cada usuário deve ter dois botões de exclusão, exclusão comum 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 inicial, 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, dificulta para os spammers ajustarem os e-mails para passar pelos filtros. Se muito do cérebro do filtro estiver nos bancos de dados individuais, então apenas ajustar os spams para passar pelos filtros iniciais não garantirá nada sobre quão bem eles passarão pelos filtros variáveis e muito mais treinados de usuários individuais.
A filtragem de spam baseada em conteúdo é frequentemente combinada com uma lista branca, uma lista de remetentes cujo e-mail pode ser aceito sem filtragem. Uma maneira fácil de construir tal lista branca é 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 poderia adicionar o endereço de cada e-mail que o usuário excluiu como lixo comum.
Sou um defensor de listas brancas, mas mais como uma maneira de economizar computação do que como uma maneira de melhorar a filtragem. Eu costumava pensar que listas brancas tornariam a filtragem mais fácil, porque você só teria que filtrar e-mails de pessoas que nunca ouviu falar, e alguém que lhe envia um e-mail pela primeira vez é restringido 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 não seria provável que o fizesse. O problema é que as pessoas podem ter mais de um endereço de e-mail, então um novo endereço de remetente não garante que o remetente esteja escrevendo para você pela primeira vez. Não é incomum que um velho amigo (especialmente se ele for um hacker) de repente lhe envie um e-mail com um novo endereço de remetente, então você não pode arriscar falsos positivos filtrando e-mails de endereços desconhecidos de forma especialmente rigorosa.
De certa forma, no entanto, meus filtros incorporam uma espécie de lista branca (e lista negra) porque são baseados em mensagens inteiras, incluindo os cabeçalhos. Assim, até certo ponto, eles "sabem" os endereços de e-mail de remetentes confiáveis e até mesmo as rotas pelas quais os e-mails chegam até mim. E eles sabem o mesmo sobre spam, incluindo os nomes dos servidores, versões de mailers e protocolos.
Se eu achasse que poderia manter as taxas atuais de filtragem de spam, consideraria esse problema resolvido. Mas isso não significa muito poder filtrar a maioria dos spams atuais, porque o spam evolui. De fato, a maioria das técnicas antispam até agora tem sido como pesticidas que não fazem nada mais do que criar uma nova cepa resistente de insetos.
Estou mais esperançoso em relação aos filtros bayesianos, porque eles evoluem com o spam. Assim, à medida que os spammers começam a usar "c0ck" em vez de "cock" para evadir filtros de spam simplistas 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 exatamente quanto mais.
Ainda assim, qualquer um que proponha um plano para filtragem de spam deve 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 corpos de mensagens.
Para vencer os filtros bayesianos, não seria suficiente para os spammers tornarem seus e-mails únicos ou pararem de usar palavras individuais inapropriadas. Eles teriam que tornar seus e-mails indistinguíveis do seu e-mail comum. E isso, eu acho, os restringiria severamente. O spam é principalmente propostas de vendas, então, a menos que seu e-mail regular seja todo propostas de vendas, os spams inevitavelmente terão um caráter diferente. E os spammers também 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 quão difícil seria fazer os cabeçalhos parecerem 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, você. Achei que você deveria conferir o seguinte: http://www.27meg.com/foo
porque isso é aproximadamente tanto quanto a filtragem baseada em conteúdo deixará espaço para o spammer 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 dependerá da url, e levará algum esforço para fazer isso parecer neutro.)
Os spammers variam de empresas que operam listas de opt-in que nem 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 um 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 rigorosas diminuiriam o spam. Agora acho que, embora leis mais rigorosas 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.)
Ao longo de todo o espectro, se você restringir as propostas de vendas que os spammers podem fazer, você inevitavelmente tenderá a colocá-los fora do negócio. Essa palavra negócio é uma importante a se lembrar. Os spammers são homens de negócios. Eles enviam spam porque funciona. Funciona porque, embora a taxa de resposta seja abominavelmente baixa (no máximo 15 por milhão, contra 3000 por milhão para um envio de 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 deletar o spam, mas o spammer não precisa pagar isso.
Enviar spam custa algo ao spammer, no entanto. [2] Portanto, quanto mais baixo pudermos obter a taxa de resposta - seja por filtragem ou por usar 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 fazem é 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 incrivelmente crédula ou profundamente em negação sobre seus interesses sexuais. Em qualquer caso, repulsivo ou idiota como o spam parece para nós, é excitante para eles. Os spammers não diriam essas coisas se não soassem excitantes. E "achei que você deveria conferir o seguinte" simplesmente não terá quase o mesmo apelo para o destinatário de spam que 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 um veículo de marketing, e menos empresas querem usá-lo.
Esse é o grande ganho no final. Comecei a escrever software de filtragem de spam porque não queria mais olhar para essas coisas. Mas se ficarmos bons o suficiente em filtrar spam, ele deixará de funcionar, e os spammers realmente pararão de enviá-lo.
De todas as abordagens para combater o spam, de software a leis, acredito que a filtragem bayesiana será a mais eficaz. Mas também acho que quanto mais diferentes tipos de esforços antispam 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á uma boa coisa 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 passar por eles.
Apêndice: Exemplos de Filtragem
Aqui é um exemplo de um spam que chegou enquanto eu escrevia 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 tenha uma probabilidade de spam, em meu banco de dados, de .99. De fato, 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 chato do uso da Regra de Bayes. Para ver uma variedade interessante de probabilidades, temos que olhar para isso spam realmente bastante 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 boa e má. Uma palavra como "shortest" é quase tanta evidência de inocência quanto uma palavra como "madam" ou "promotion" é de culpa. Mas ainda assim, o caso para a culpa é mais forte. Se você combinar esses números de acordo com a Regra de Bayes, a probabilidade resultante é .9027.
"Madam" é obviamente de spams que começam com "Caro 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" tem uma pontuação alta porque frequentemente aparece em e-mails de golpe nigerianos, e também ocorre uma ou duas vezes em spams referindo-se à Coreia e à África do Sul. Você poderia dizer que é um acidente que isso 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 é totalmente uma coincidência que a palavra "Republic" ocorra em e-mails de golpe nigerianos e neste spam. Há toda uma classe de propostas de negócios duvidosas envolvendo países menos desenvolvidos, e estas, por sua vez, são mais propensas a ter nomes que especificam explicitamente (porque não são) que são repúblicas.[3]
Por outro lado, "enter" é um erro genuíno. Ocorre principalmente em instruções de cancelamento de inscrição, mas aqui é usado de uma maneira completamente inocente. Felizmente, a abordagem estatística é bastante robusta e pode tolerar muitos erros antes que os resultados comecem a ser afetados.
Para comparação, aqui é um exemplo daquela rara ave, um spam que passa pelos filtros. Por quê? Porque por pura sorte, 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 guarantee 0.9762507 cgi 0.9734398 paul 0.027040077 quite 0.030676773 pop3
0.042199217 various 0.06080265 prices 0.9359873 managed 0.06451222 difficult 0.071706355
Há algumas boas notícias aqui. Primeiro, este e-mail provavelmente não passaria pelos filtros de alguém que não tivesse a sorte de se especializar em linguagens de programação e ter um bom amigo chamado Morris. Para o usuário médio, todas as cinco primeiras palavras aqui seriam neutras e não contribuiriam para a probabilidade de spam.
Em segundo lugar, acho que a filtragem baseada em pares de palavras (veja abaixo) pode muito bem pegar este: "custo efetivo", "taxa de configuração", "garantia de devolução" - coisas bastante incriminadoras. E, claro, se continuassem a me enviar spam (ou a uma rede da qual eu fizesse parte), "Hostex" em si seria reconhecido como um termo de spam.
Finalmente, aqui é um e-mail inocente. Suas quinze palavras mais interessantes são as seguintes:
continuation 0.01 describe 0.01 continuations 0.01 example 0.033600237 programming 0.05214485 i'm 0.055427782 examples 0.07972858 color 0.9189189
localhost 0.09883721 hi 0.116539136 california 0.84421706 same 0.15981844 spot 0.1654587 us-ascii 0.16804294 what 0.19212411
A maioria das palavras aqui indica que o e-mail é inocente. Existem duas palavras com cheiro ruim, "color" (spammers adoram fontes coloridas) e "California" (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 "continuation" e "example".
É interessante que "describe" tenha uma classificação tão completamente inocente. Não ocorreu em nenhum dos meus 4000 spams. Os dados se revelam cheios de tais surpresas. Uma das coisas que você aprende ao analisar textos de spam é quão estreito é o subconjunto da linguagem em que os spammers operam. É esse fato, juntamente com o vocabulário igualmente característico do e-mail de qualquer usuário individual, que torna a filtragem bayesiana uma boa aposta.
Apêndice: Mais Ideias
Uma ideia que ainda não experimentei é filtrar com base em pares de palavras, ou até mesmo trios, em vez de palavras individuais. Isso deve resultar em uma estimativa muito mais precisa da probabilidade. Por exemplo, em meu banco de dados atual, a palavra "ofertas" tem uma probabilidade de .96. Se você baseasse as probabilidades em pares de palavras, acabaria com "ofertas especiais" e "ofertas valiosas" tendo probabilidades de .99 e, digamos, "ofertas de abordagem" (como em "esta abordagem oferece") tendo uma probabilidade de .1 ou menos.
A razão pela qual não fiz isso é que a filtragem baseada em palavras individuais já funciona tão bem. Mas isso significa que há espaço para apertar os filtros se o spam se tornar mais difícil de detectar. (Curiosamente, um filtro baseado em pares de palavras seria, na verdade, um gerador de texto em cadeia de Markov funcionando ao contrário.)
Características específicas de spam (por exemplo, não ver o endereço do destinatário no campo para:) têm, é claro, valor no reconhecimento de spam. Elas podem ser consideradas neste algoritmo tratando-as como palavras virtuais. Provavelmente farei isso em versões futuras, pelo menos para um punhado dos indicadores de spam mais flagrantes. Filtros de spam que reconhecem características estão certos em muitos detalhes; o que lhes falta é uma disciplina geral para combinar evidências.
Reconhecer características de não spam pode ser mais importante do que reconhecer características de spam. 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 teste projetado especificamente para evitar falsos positivos. Se um e-mail acionar 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. Ele será inevitavelmente não apenas ad hoc, mas baseado em palpites, porque o número de falsos positivos não tenderá a ser grande o suficiente para notar padrões. (É melhor assim, de qualquer forma, se um sistema de backup não depender da mesma tecnologia que o sistema primário.)
Outra coisa que posso tentar no futuro é focar atenção extra em partes específicas do e-mail. Por exemplo, cerca de 95% do spam atual inclui a 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 de correio dos EUA, ou em alguns casos compre uma certa ação.) A url é, nesses casos, praticamente suficiente por si só para determinar se o e-mail é spam.
Nomes de domínio diferem do resto do texto em um e-mail (não alemão) no sentido de que muitas vezes consistem em várias palavras coladas. Embora computacionalmente caro no caso geral, pode valer a pena tentar decompor esses nomes. Se um filtro nunca viu o token "xxxporn" antes, ele terá uma probabilidade individual de spam de .4, enquanto "xxx" e "porn" individualmente têm probabilidades (em meu corpus) de .9889 e .99, respectivamente, e uma probabilidade combinada de .9998.
Espero que a decomposição de nomes de domínio se torne mais importante à medida que os spammers sejam gradualmente forçados a parar de usar palavras incriminadoras no texto de suas mensagens. (Uma url com um endereço ip é, é claro, um sinal extremamente incriminador, exceto no e-mail de alguns sysadmins.)
Pode ser uma boa ideia ter uma lista mantida cooperativamente de urls promovidas por spammers. Precisaríamos de uma métrica de confiança do tipo estudado por Raph Levien para evitar envios maliciosos ou incompetentes, mas se tivéssemos algo assim, isso proporcionaria um impulso a qualquer software de filtragem. Também seria uma base conveniente para boicotes.
Outra maneira de testar urls duvidosas seria enviar um crawler para olhar o site antes que o usuário olhasse o e-mail mencionando-o. Você poderia usar um filtro bayesiano para avaliar o site assim como faria com um e-mail, e o que fosse encontrado no site poderia ser incluído no cálculo da probabilidade de o e-mail ser spam. Uma url que levasse a um redirecionamento seria, é claro, especialmente suspeita.
Um projeto cooperativo que acho que realmente seria uma boa ideia seria acumular um enorme corpus de spam. Um grande corpus limpo é a chave para fazer a filtragem bayesiana funcionar bem. Filtros bayesianos poderiam realmente usar o corpus como entrada. Mas tal corpus seria útil para outros tipos de filtros também, porque poderia ser usado para testá-los.
Criar tal corpus apresenta alguns problemas técnicos. Precisaríamos de métricas de confiança para evitar envios maliciosos ou incompetentes, é claro. Também precisaríamos de maneiras de apagar informações pessoais (não apenas endereços para e onde, mas também, por exemplo, os argumentos para urls de cancelamento de inscrição, que muitas vezes codificam o endereço para) dos e-mails no corpus. Se alguém quiser assumir este 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 para comparar taxas de filtragem de spam de maneira significativa.
Para começar, spam não é e-mail comercial não solicitado. Se alguém na minha vizinhança ouvisse que estou procurando uma bicicleta Raleigh de três marchas em boas condições e me enviasse um e-mail oferecendo vender uma, eu ficaria encantado, e ainda assim esse e-mail seria tanto comercial quanto não solicitado. A característica definidora do spam (na verdade, sua raison d'etre) não é que seja não solicitado, mas que é automatizado.
É meramente incidental, também, que o spam seja geralmente comercial. Se alguém começasse a enviar e-mails em massa para apoiar alguma causa política, por exemplo, seria tão spam quanto e-mails promovendo um site pornográfico.
Proponho que definamos spam como e-mail automatizado não solicitado. Essa definição, portanto, inclui alguns e-mails que muitas definições legais de spam não incluem. 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 deles. Se eu pedir algo de uma loja online, e eles então me enviarem uma enxurrada de spam, ainda é spam.
Empresas que enviam spam frequentemente 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 impedir que o e-mail seja spam. Não optar por sair não é o mesmo que optar por entrar. A menos que o destinatário tenha explicitamente marcado uma caixa claramente rotulada (cujo padrão era não) pedindo para receber o e-mail, então é spam.
Em alguns relacionamentos comerciais, você solicita implicitamente certos tipos de e-mail. Quando você pede algo online, 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 um e-mail avisando que um nome de domínio está prestes a expirar (pelo menos, se eles forem o registrador real para isso). Mas quando a Verisign me envia um e-mail oferecendo um Guia GRÁTIS para Construir Meu Site de Comércio Eletrônico, isso é spam.
Notas:
[1] Os exemplos neste artigo estão traduzidos para Common Lisp para, acredite ou não, maior acessibilidade. A aplicação descrita aqui é uma que escrevemos para testar um novo dialeto Lisp chamado Arc que ainda não foi lançado.
[2] Atualmente, a taxa mais baixa parece ser cerca de $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 alcançar 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 corruptos são os governantes. Um país chamado A República Democrática do Povo Socialista de X é provavelmente o último lugar do mundo onde você gostaria de viver.
Agradecimentos a Sarah Harlin por ler rascunhos disso; Daniel Giffin (que também está escrevendo o interpretador de produção do Arc) por várias boas ideias sobre filtragem e por criar nossa infraestrutura de e-mail; 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á esse ensaio e 14 outros em [
Hackers & Painters
](http://www.amazon.com/gp/product/0596006624) .
Mais Informações: