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 à prova de spam que criamos para usar o Arc . Um algoritmo aprimorado é descrito em Melhor filtragem bayesiana .)
Acho que é possível parar o spam, e que filtros baseados em conteúdo são a maneira de fazer isso. O calcanhar de Aquiles dos spammers é a mensagem deles. Eles podem contornar qualquer outra barreira que você estabelecer. Eles conseguiram até agora, pelo menos. Mas eles têm que entregar sua mensagem, seja ela qual for. Se pudermos 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, eles teriam pouca dificuldade em fazer isso. Quanto temos que fazer, além da IA, para automatizar esse processo?
Acho que conseguiremos resolver o problema com algoritmos bem simples. Na verdade, descobri que você pode filtrar spam atual aceitavelmente bem usando nada mais do que uma combinação bayesiana das probabilidades de spam de palavras individuais. Usando um filtro bayesiano ligeiramente ajustado (conforme descrito abaixo), agora perdemos menos de 5 por 1000 spams, com 0 falsos positivos.
A abordagem estatística não é geralmente a primeira que as pessoas tentam quando escrevem filtros de spam. O primeiro instinto da maioria dos hackers é tentar escrever software que reconheça propriedades individuais de spam. Você olha para spams e pensa, a coragem desses caras de tentar me enviar e-mails que começam com "Caro amigo" ou têm uma linha de assunto toda em letras maiúsculas e terminam com oito pontos de exclamação. Eu 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 dar uma grande mordida no seu spam recebido. Simplesmente procurar pela 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 recursos individuais de spam antes de tentar a abordagem estatística. O que descobri foi que reconhecer os últimos poucos por cento de spams ficou muito difícil, e que conforme eu tornava os filtros mais rigorosos, obtive mais falsos positivos.
Falsos positivos são e-mails inocentes que são erroneamente identificados como spams. 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 produz falsos positivos é como uma cura 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 em sua pasta de spam. E, estranhamente, quanto melhores seus filtros de spam ficam, mais perigosos os falsos positivos se tornam, porque quando os filtros são realmente bons, os usuários têm mais probabilidade de ignorar tudo o que pegam.
Não sei por que evitei tentar a abordagem estatística por tanto tempo. Acho que foi porque fiquei viciado em tentar identificar recursos de spam sozinho, como se estivesse jogando algum tipo de jogo competitivo com os spammers. (Os não hackers geralmente não percebem isso, 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 tinha sido. Ela descobriu, é claro, que termos como "virtumundo" e "adolescentes" eram 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 eu faço filtragem estatística. Eu 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 examino o texto inteiro, incluindo cabeçalhos e HTML e JavaScript incorporados, de cada mensagem em cada corpus. Atualmente, considero caracteres alfanuméricos, traços, apóstrofos e cifrões como parte de tokens, e todo o resto como um separador de tokens. (Provavelmente há espaço para melhorias aqui.) Eu 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, atualmente) ocorre em cada corpus. Nesse estágio, eu termino com duas grandes tabelas de 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 um e-mail que o contém ser um spam, que calculo da seguinte forma [1]:
(let ((g (* 2 (or (gethash word good) 0))) (b (or (gethash word bad) 0))) (unless (< (+ gb) 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 de hash que criei no primeiro passo, 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 as probabilidades ligeiramente 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, por causa da duplicação, ocorrer três vezes em e-mails não spam seria o 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, embora eu considere cada corpus como um único e longo fluxo de texto para fins de contagem de ocorrências, eu uso o número de e-mails em cada um, em vez de seu comprimento combinado, como o divisor no cálculo de probabilidades de spam. Isso adiciona outro leve viés para proteger contra falsos positivos.
Quando um novo e-mail chega, ele é escaneado em tokens, e os quinze tokens mais interessantes, onde interessante é medido por quão longe sua probabilidade de spam está de um neutro .5, são usados para calcular a probabilidade de que o e-mail seja spam. Se probs for 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 para usar. Se você nunca viu uma palavra antes, ela provavelmente é bem inocente; palavras de spam tendem a ser muito familiares.
Há exemplos desse algoritmo sendo aplicado a e-mails reais em um apêndice no final.
Eu trato o e-mail como spam se o algoritmo acima der a ele uma probabilidade de mais de 0,9 de ser spam. Mas na prática não importaria muito onde eu coloco esse limite, porque poucas probabilidades acabam no meio do intervalo.
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 similarmente degradante em competir com spammers. Para reconhecer características individuais de spam, você tem que tentar entrar na mente do spammer, e francamente eu quero passar o mínimo de tempo possível dentro da mente dos spammers.
Mas a vantagem real 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 significa. O usuário não sabe o que significa, mas pior ainda, nem o desenvolvedor do filtro. Quantos pontos um e-mail deve receber por ter a palavra "sexo" nele? Uma probabilidade pode, é claro, ser equivocada, mas há pouca ambiguidade sobre o que significa, ou como as evidências devem ser combinadas para calculá-la. Com base no meu corpus, "sexo" indica uma probabilidade de 0,97 de o e-mail que o contém ser um spam, enquanto "sexy" indica uma probabilidade de 0,99. E a Regra de Bayes, igualmente inequívoca, 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.
Como 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 "hoje à noite" ou "aparentemente") contribuem tanto para diminuir a probabilidade quanto palavras ruins como "cancelar inscrição" e "opt-in" fazem para aumentá-la. Então, um e-mail inocente que por acaso inclua a palavra "sexo" não será marcado como spam.
O ideal, é claro, é que as probabilidades sejam 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 um tipo de senha para enviar e-mails para mim. No meu software de filtragem de spam anterior, o usuário podia configurar uma lista dessas palavras e os e-mails que as continham passariam automaticamente pelos filtros. Na minha lista, coloquei palavras como "Lisp" e também meu código postal, para que os recibos de pedidos online (que de outra forma soariam um tanto spam) passassem. Achei que estava sendo muito inteligente, mas descobri que o filtro bayesiano fez a mesma coisa por mim e, além disso, descobri muitas palavras nas quais eu não tinha pensado.
Quando eu disse no começo 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 todo o resto vai para o corpus não spam.
Você pode começar os usuários com um filtro de semente, mas, no final das contas, cada usuário deve ter suas próprias probabilidades por palavra com base no e-mail real que ele 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 torne difícil 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 de semente não garantirá nada sobre o quão bem eles passarão pelos filtros variados e muito mais treinados de usuários individuais.
A filtragem de spam baseada em 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 criar uma lista de permissões é manter uma lista de todos os endereços para os quais o usuário já enviou e-mails. Se um leitor de e-mail tiver um botão de excluir como spam, você também pode adicionar o endereço de cada e-mail que o usuário excluiu como lixo comum.
Sou um defensor das listas brancas, mas mais como uma forma de economizar computação do que como uma forma de melhorar a filtragem. Eu costumava pensar que as listas brancas tornariam a filtragem mais fácil, porque você só teria que filtrar e-mails de pessoas de quem nunca tinha ouvido falar, e alguém que lhe envia e-mails 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 e-mails pela primeira vez provavelmente não o faria. 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.
Em certo sentido, porém, meus filtros por si só incorporam um tipo de lista branca (e lista negra) porque são baseados em mensagens inteiras, incluindo os cabeçalhos. Então, nessa medida, eles "sabem" os endereços de e-mail de remetentes confiáveis e até mesmo as rotas pelas quais o e-mail chega deles até mim. E eles sabem o mesmo sobre spam, incluindo os nomes dos servidores, versões do mailer e protocolos.
Se eu achasse que conseguiria manter as taxas atuais de filtragem de spam, consideraria esse problema resolvido. Mas 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 têm sido como pesticidas que não fazem nada além de criar uma nova e resistente cepa de insetos.
Estou mais esperançoso sobre os filtros Bayesianos, porque eles evoluem com o spam. Então, conforme os spammers começam a usar "c0ck" em vez de "cock" para escapar de filtros de spam simplistas baseados em palavras individuais, os filtros Bayesianos percebem automaticamente. De fato, "c0ck" é uma evidência muito mais contundente do que "cock", e os filtros Bayesianos sabem precisamente o quanto mais.
Ainda assim, qualquer um que proponha um plano para filtragem de spam tem que ser capaz de responder à pergunta: se os spammers soubessem exatamente o que você estava fazendo, quão bem eles conseguiriam passar por você? Por exemplo, eu 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 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 obscenas. Eles teriam que tornar seus e-mails indistinguíveis do seu e-mail comum. E isso eu acho que os restringiria severamente. O spam é principalmente discursos de vendas, então, a menos que seu e-mail regular seja todo discursos de vendas, os spams inevitavelmente terão um caráter diferente. E os spammers também teriam, é claro, 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 eles 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 os cabeçalhos parecerem inocentes, mas meu palpite é que seria ainda mais difícil do que fazer a mensagem parecer inocente.
Supondo que eles consigam resolver o problema dos cabeçalhos, o spam do futuro provavelmente será algo como isto:
Hey there. Thought you should check out the following: http://www.27meg.com/foo
porque isso é quase o máximo de discurso de vendas que a filtragem baseada em conteúdo deixará ao spammer espaço para fazer. (De fato, será difícil até mesmo passar pelos filtros, porque se todo o resto no e-mail for neutro, a probabilidade de spam dependerá da URL, e será preciso algum esforço para fazer com que pareça neutra.)
Os spammers variam de empresas que administram as chamadas listas opt-in que nem tentam esconder suas identidades, a caras que sequestram servidores de e-mail para enviar spams promovendo sites pornográficos. Se usarmos filtragem para reduzir suas opções a e-mails como o acima, isso deve praticamente colocar os spammers na extremidade "legítima" do espectro fora do mercado; eles se sentem obrigados por várias leis estaduais a incluir clichês sobre por que seu spam não é spam e como cancelar sua "assinatura", e esse tipo de texto é fácil de reconhecer.
(Eu costumava achar 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 os argumentos de venda que os spammers podem fazer, você inevitavelmente tenderá a colocá-los fora do mercado. Essa palavra negócio é importante de lembrar. Os spammers são homens de negócios. Eles enviam spam porque funciona. Funciona porque, embora a taxa de resposta seja abominavelmente baixa (na melhor das hipóteses, 15 por milhão, contra 3000 por milhão para um catálogo de mala direta), o custo, para eles, é praticamente zero. 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.
No entanto, enviar spam custa algo ao spammer. [2] Portanto, quanto menor for a taxa de resposta — seja por filtragem ou pelo uso de filtros para forçar os spammers a diluírem seus argumentos — menos empresas acharão que vale a pena enviar spam.
A razão pela qual os spammers usam os tipos de discursos de vendas que eles usam é para aumentar as taxas de resposta. Isso é possivelmente ainda mais repugnante do que entrar na mente de um spammer, mas vamos dar uma olhada rápida na mente de alguém que responde a um spam. Essa pessoa é surpreendentemente crédula ou profundamente em negação sobre seus interesses sexuais. Em ambos os casos, repulsivo ou idiota como o spam nos parece, é excitante para eles. Os spammers não diriam essas coisas se não soassem excitantes. E "pensei que você deveria verificar o seguinte" simplesmente não vai ter nem de longe a mesma atração com o destinatário do spam como o tipo de coisa que os spammers dizem agora. Resultado: se não puder conter discursos de vendas excitantes, o spam se torna menos eficaz como um veículo de marketing, e menos empresas querem usá-lo.
Essa é a grande vitória no final. Comecei a escrever um software de filtragem de spam porque não queria mais ter que olhar para as coisas. Mas se ficarmos bons o suficiente em filtrar spam, ele vai parar de funcionar, e os spammers vão parar de enviá-lo.
De todas as abordagens para combater spam, de software a leis, acredito que a filtragem bayesiana será a mais eficaz. Mas também acho que quanto mais tipos diferentes de esforços antispam empreendermos, melhor, porque qualquer medida que restrinja os spammers tenderá a tornar a filtragem mais fácil. E mesmo dentro do mundo da filtragem baseada em conteúdo, acho que será uma coisa boa 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 está 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 tem uma probabilidade de spam, no meu banco de dados, de .99. Na verdade, há mais de quinze palavras com probabilidades de .99, e essas 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 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 "mais curto" é quase tanta evidência para inocência quanto uma palavra como "senhora" ou "promoção" é para culpa. Mas ainda assim o caso para culpa é mais forte. Se você combinar esses números de acordo com a Regra de Bayes, a probabilidade resultante é .9027.
"Senhora" obviamente vem de spams que começam com "Prezado Senhor ou Senhora". Eles não são muito comuns, mas a palavra "senhora" nunca aparece em meus e-mails legítimos, e tudo depende da proporção.
"República" pontua alto porque frequentemente aparece em e-mails de golpes nigerianos, e também ocorre uma ou duas vezes em spams referentes à Coreia e à África do Sul. Você pode dizer que é um acidente que isso ajude a identificar esse spam. Mas eu 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. Nesse caso, não é inteiramente uma coincidência que a palavra "República" ocorra em e-mails de golpes nigerianos e neste spam. Há toda uma classe de propostas comerciais duvidosas envolvendo países menos desenvolvidos, e estes, por sua vez, são mais propensos 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 forma completamente inocente. Felizmente, a abordagem estatística é bastante robusta e pode tolerar muitos erros antes que os resultados comecem a ser descartados.
Para efeito de comparação, aqui está um exemplo daquele pássaro raro, um spam que passa pelos filtros. Por quê? Porque por puro acaso ele está carregado com palavras que ocorrem no 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 fosse especialista 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 filtrar com base em pares de palavras (veja abaixo) pode muito bem pegar isso: "custo-efetivo", "taxa de instalação", "dinheiro de volta" -- coisas bem incriminatórias. E, claro, se eles continuassem a me enviar spam (ou uma rede da qual eu fazia parte), "Hostex" em si seria reconhecido como um termo de spam.
Finalmente, aqui está 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. Há duas palavras de 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 o suficiente para superar palavras obviamente inocentes como "continuation" e "example".
É interessante que "describe" taxas como tão completamente inocentes. Isso não ocorreu em nenhum dos meus 4000 spams. Os dados acabam sendo cheios de tais surpresas. Uma das coisas que você aprende quando analisa textos de spam é quão estreito é um subconjunto da linguagem em que os spammers operam. É esse fato, junto 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 tentei é filtrar com base em pares de palavras, ou mesmo triplos, em vez de palavras individuais. Isso deve gerar uma estimativa muito mais precisa da probabilidade. Por exemplo, no 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 "estas ofertas de abordagem") tendo uma probabilidade de .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 com base em pares de palavras seria, na verdade, um gerador de texto de encadeamento de Markov 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 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 um punhado dos indicadores de spam mais flagrantes. Os filtros de spam que reconhecem recursos estão certos em muitos detalhes; o que falta é uma disciplina geral para combinar evidências.
Reconhecer recursos não spam pode ser mais importante do que reconhecer recursos 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. Inevitavelmente, não será 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, de qualquer forma, se um sistema de backup não depender da mesma tecnologia do 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 determinada ação.) A URL é, em tais casos, praticamente suficiente por si só para determinar se o e-mail é spam.
Os nomes de domínio diferem do restante do texto em um e-mail (não alemão) porque geralmente consistem em várias palavras grudadas. 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 de spam individual de .4, enquanto "xxx" e "porn" individualmente têm probabilidades (no 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 são gradualmente forçados a parar de usar palavras incriminatórias no texto de suas mensagens. (Uma URL com um endereço IP é, claro, um sinal extremamente incriminador, exceto no e-mail de alguns administradores de sistemas.)
Pode ser uma boa ideia ter uma lista cooperativamente mantida 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 daria 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 faria com 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. Uma URL que levasse a um redirecionamento seria, é claro, especialmente suspeita.
Um projeto cooperativo que eu acho que seria realmente uma boa ideia seria acumular um corpus gigante de spam. Um corpus grande e limpo é a chave para fazer a filtragem bayesiana funcionar bem. Os 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 e ccs, mas também, por exemplo, os argumentos para cancelar a assinatura de URLs, que geralmente codificam o endereço) de e-mails no corpus. Se alguém quiser assumir esse projeto, seria uma coisa boa 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 taxas de filtragem de spam de forma significativa.
Para começar, spam não é e-mail comercial não solicitado. Se alguém na minha vizinhança soubesse que eu estava procurando uma velha Raleigh de três marchas em boas condições e me enviasse um e-mail oferecendo-me uma, eu ficaria encantado, e ainda assim esse e-mail seria comercial e não solicitado. A característica definidora do spam (na verdade, sua razão de ser ) não é que ele seja não solicitado, mas que seja automatizado.
É meramente incidental, também, que spam geralmente seja comercial. Se alguém começasse a enviar e-mails em massa para apoiar alguma causa política, por exemplo, seria tanto spam quanto e-mails promovendo um site pornô.
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 dela. Se eu pedir algo de uma loja online e eles me enviarem um fluxo de spam, ainda é spam.
As empresas que enviam spam geralmente oferecem uma maneira de "cancelar a assinatura" ou pedem para você ir ao site delas e alterar 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 marcado explicitamente uma caixa claramente rotulada (cujo padrão era não) pedindo para receber o e-mail, então ele é spam.
Em alguns relacionamentos comerciais, você implicitamente solicita certos tipos de correspondência. Quando você faz um pedido on-line, acho que você implicitamente solicita 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 dele). 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 para Common Lisp para, acredite ou não, maior acessibilidade. O aplicativo descrito aqui é um que escrevemos para testar um novo dialeto Lisp chamado Arc 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 um centavo por spam. Mas filtrar 95% do spam, por exemplo, aumentaria o custo dos spammers para atingir um determinado público por 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 serão os governantes. Um país chamado República Democrática Popular Socialista de X é provavelmente o último lugar no mundo onde você gostaria de viver.
Agradecemos a Sarah Harlin pela leitura dos rascunhos; a Daniel Giffin (que também está escrevendo o interpretador Arc de produção) por várias boas ideias sobre filtragem e por criar nossa infraestrutura de e-mail; a Robert Morris, Trevor Blackwell e Erann Gat por muitas discussões sobre spam; a Raph Levien pelos conselhos sobre métricas de confiança; e a Chip Coldwell e Sam Steingold pelos conselhos sobre estatísticas.
Você encontrará este ensaio e outros 14 em [
Hackers e pintores
](http://www.amazon.com/gp/product/0596006624) .
Mais informações: