UN PLAN PARA EL SPAM
Agosto de 2002
(Este artículo describe las técnicas para filtrado de spam utilizadas en el lector de correo a prueba de spam basado en web que creamos para probar Arc. Un algoritmo mejorado se describe en Better Bayesian Filtering.)
Creo que es posible detener el spam, y que los filtros basados en contenido son la manera de hacerlo. El talón de Aquiles de los spammers es su mensaje. Pueden eludir cualquier otra barrera que configures. Lo han hecho hasta ahora, al menos. Pero tienen que hacer llegar su mensaje, cualquiera que sea. Si logramos escribir software que reconozca sus mensajes, no habrá manera de que puedan eludirlo.
— — —
Para el destinatario, el spam es fácilmente reconocible. Si contrataras a alguien para leer tu correo y descartar el spam, tendrían pocos problemas haciéndolo. ¿Cuánto tenemos que hacer, a falta de inteligencia artificial, para automatizar este proceso?
Creo que podremos resolver el problema con algoritmos muy simples. De hecho, he descubierto que es posible filtrar aceptablemente bien el spam de hoy en día utilizando solamente una combinación Bayesiana de probabilidad de spam para las palabras individuales. Utilizando un filtro Bayesiano ligeramente adaptado (como se describe más adelante), ahora se nos escapan menos de 5 de cada 1000 spams, con 0 falsos positivos.
El enfoque estadístico no suele ser el primero que prueban las personas cuando escriben filtros de spam. El primer instinto de la mayoría de los hackers es tratar de escribir software que reconozca las propiedades individuales del spam. Ves el spam y piensas: que descaro el de estos tipos, tratando de enviarme correo que comienza con "Querido Amigo" o que tiene una línea de asunto toda en mayúscula y termina con ocho signos de exclamación. Puedo filtrar esas cosas con una línea de código.
Y así lo haces, y al principio funciona. Unas cuantas reglas sencillas asestarán una gran mordida a tu spam entrante. Con tan sólo buscar la palabra "click" atrapo el 79,7% de los correos electrónicos en el corpus del spam, con sólo el 1.2% de falsos positivos.
Pasé unos seis meses escribiendo software que buscaba características individuales en el spam antes de intentar el enfoque estadístico. Lo que descubrí fue que reconocer ese último porcentaje de spam se hizo muy difícil, y que conforme hice los filtros más estrictos obtuve más falsos positivos.
Los falsos positivos son mensajes inocentes que quedan erróneamente identificados como spam. Para la mayoría de los usuarios, perderse correos electrónicos legítimos es un orden de magnitud peor que recibir spam, por lo que un filtro que produce falsos positivos es como una cura del acné que conlleva un riesgo de muerte para el paciente.
Cuanto más spam recibe el usuario, menos probable es que pueda notar un correo inocente alojado en su carpeta de correo no deseado. Y por extraño que parezca, conforme mejoran tus filtros de spam, más peligrosos se vuelven los falsos positivos, porque cuando los filtros son muy buenos, los usuarios estarán más dispuestos a ignorar todo lo que atrapan.
No sé por qué evité intentar el enfoque estadístico durante tanto tiempo. Creo que fue porque me hice adicto a tratar de identificar las características del spam yo mismo, como si estuviera jugando una especie de juego competitivo contra los spammers. (Los que no son hackers no suelen darse cuenta de esto, pero la mayoría de los hackers son muy competitivos.) Cuando probé el análisis estadístico, descubrí inmediatamente que era mucho más inteligente de lo que yo había sido. Descubrió, por supuesto, que términos como "virtumundo" y "adolescentes" eran buenos indicadores de spam. Pero también descubrió que "per" y "FL" y "ff0000" son buenos indicadores de spam. De hecho, "ff0000" (html para rojo brillante) resulta ser tan buen indicador de spam como cualquier término pornográfico.
— — —
He aquí un bosquejo de cómo hago filtrado estadístico. Empiezo con un corpus de spam y uno de correo no spam. Al empezar, cada uno tiene alrededor de 4000 mensajes. Escaneo la totalidad del texto, incluyendo las cabeceras, el HTML incrustado y el JavaScript de cada mensaje en cada corpus. Considero los caracteres alfanuméricos, guiones, apóstrofes y signos de dólar como parte de los tokens, y todo lo demás como un separador de símbolos. (Probablemente haya margen de mejora aquí.) Ignoro los tokens que son sólo dígitos, y también ignoro los comentarios HTML, sin siquiera considerarlos como separadores de tokens.
Cuento el número de veces que cada token (ignorando, por el momento, mayúsculas y minúsculas) se produce en cada corpus. En esta etapa termino con dos grandes tablas hash, una para cada corpus, que mapean el número de ocurrencias de los tokens.
Luego creo una tercera tabla hash, mapeando esta vez la asignación de cada ficha a la probabilidad de que un correo electrónico que la contenga sea spam, que calculó de la siguiente manera [1]:
(let ((g (* 2 (o (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)))))))))
donde word
es el token cuya probabilidad estamos calculando, good
y bad
son las tablas hash que he creado en el primer paso, y ngood
y nbad
son el número de mensajes no spam y spam respectivamente.
Expliqué esto como código para mostrar un par de detalles importantes. Quiero predisponer ligeramente las probabilidades para evitar falsos positivos, y por ensayo y error he descubierto que una buena manera de hacerlo es duplicar todos los números en good
. Esto ayuda a distinguir entre palabras que en ocasiones aparecen en el correo electrónico legítimo y palabras que casi nunca lo hacen. Sólo considero las palabras que se producen más de cinco veces en total (en realidad, debido a la duplicación, que ocurra tres veces en correo no spam sería suficiente). Y luego está la cuestión de qué probabilidad asignar a las palabras que aparecen en un corpus, pero no el otro. Otra vez, por ensayo y error elegí .01 y .99. Puede haber espacio para el ajuste aquí, pero a medida que el corpus crece, tal ajuste sucederá automáticamente de todos modos.
El observador cuidadoso notara que si bien considero cada corpus como una sola corriente larga de texto a efecto de contar las ocurrencias, utilizo el número de mensajes de correo en cada uno, en lugar de su longitud total, como divisor en el cálculo de probabilidades de spam. Esto añade otro ligero sesgo para proteger contra los falsos positivos.
Cuando llega correo nuevo, se escanea en fichas, y las quince fichas más interesantes —donde interesante se mide por lo lejos que su probabilidad de ser spam se encuentre de un neutral .5—, se utilizan para calcular la probabilidad de que el correo sea spam. Si probs
es una lista de las quince probabilidades individuales, se calcula la probabilidad combinada de esta manera:
(let ((prod (apply # '* probs)))
(/ prod (+ prod (apply # '* (mapcar #' (lambda (x)
(- 1 x))
probs)))))
Una pregunta que surge en la práctica es qué probabilidad asignar a una palabra que nunca has visto, es decir, una que no se da en la tabla hash de probabilidades de palabras. He descubierto, de nuevo por ensayo y error, que .4 es un buen número para utilizar. Si nunca has visto una palabra antes, probablemente sea bastante inocente; las palabras de spam tienden a ser demasiado familiares.
Hay ejemplos de este algoritmo aplicados a los correos electrónicos reales en un apéndice al final.
Trato el correo como spam si el algoritmo anterior le da una probabilidad de más de .9 de ser spam. Pero en la práctica no importa mucho donde ponga este umbral, porque pocas probabilidades terminan en el medio de la gama.
— — —
Una gran ventaja del enfoque estadístico es que no tienes que leer muchos spams. En los últimos seis meses, he leído literalmente miles de ellos, y es realmente algo desmoralizante. Norbert Wiener dijo que si compites contra esclavos te conviertes en esclavo, y hay algo igual de degradante acerca de competir contra los spammers. Para reconocer las características individuales del spam tienes que tratar de entrar en la mente del spammer, y, francamente, quiero pasar el menor tiempo posible en el interior de sus mentes.
Pero la verdadera ventaja de la aproximación bayesiana, por supuesto, es que sabes lo que estás midiendo. Filtros de reconocimiento de características como SpamAssassin asignan una “puntuación” al correo electrónico. El enfoque bayesiano asigna una probabilidad real. El problema con una "puntuación" es que nadie sabe lo que significa. El usuario no sabe lo que significa, pero lo que es peor, tampoco lo sabe el desarrollador del filtro. ¿Cuántos puntos debe obtener un correo electrónico por tener la palabra "sexo"? Una probabilidad puede, por supuesto, estar equivocada, pero hay poca ambigüedad acerca de lo que significa, o de que manera se debe combinar la evidencia para calcularla. Con base en mi corpus, "sexo" indica una probabilidad de .97 de que el correo sea spam, mientras que "sexy" indica una probabilidad de .99. Y la Regla de Bayes, igualmente inequívoca, dice que un correo electrónico que contiene ambas palabras tendría, en la (poco probable) ausencia de cualquier otra evidencia, una posibilidad del 99.97% de ser spam.
Debido a que está midiendo las probabilidades, el enfoque bayesiano considera toda la evidencia en el correo electrónico, tanto buena como mala. Las palabras que de manera desproporcionada ocurren rara vez en el spam (como "though" o "tonight" o "apparently") contribuyen a disminuir la probabilidad de la misma manera en que malas palabras tales como "unsubscribe" y "opt-in" contribuyen a aumentarla. Así que un correo electrónico inocente que por casualidad incluye la palabra "sexo" no será marcado como spam.
Idealmente, las probabilidades deben ser calculadas de manera individual para cada usuario. Recibo una gran cantidad de correo con la palabra "Lisp", y (hasta ahora) ningún spam que la contenga. Así que una palabra como esa es en realidad una especie de contraseña para enviarme correo. En mi anterior programa para filtrado de spam, el usuario podía configurar una lista de tales palabras y los correos que las contenían automáticamente pasaban los filtros. En mi lista he puesto palabras como "Lisp" y también mi código postal, de modo que (a menos que suenen mucho a spam) los recibos procedentes de los pedidos en línea pasan. Pensé que estaba siendo muy inteligente, pero me encontré con que el filtro Bayesiano hizo lo mismo por mí, y además descubrió muchas palabras que yo no había pensado.
Cuando al principio dije que nuestros filtros dejan pasar menos de 5 de cada 1000 spams con 0 falsos positivos, estoy hablando de filtrar mi correo basado en un corpus de mi correo. Pero estos números no son engañosos, porque ese es el enfoque que estoy defendiendo: filtrar el correo de cada usuario basado en el spam y correo no-spam que recibe. Esencialmente, cada usuario debe tener dos botones, uno ordinario para borrar, y otro para borrar-como-spam. Todo lo eliminado como spam entra en el corpus del spam, y todo lo demás entra en el corpus no-spam.
Podrías iniciar a los usuarios con un filtro semilla, pero en última instancia, cada usuario debe tener sus propias probabilidades por palabras basadas en el correo concreto que recibe. Esto (a) hace a los filtros más eficaces, (b) permite a cada usuario decidir su propia definición precisa de spam, y (c) tal vez lo mejor de todo: hace que sea difícil para los spammers afinar los correos para que pasen a través de los filtros. Si una gran parte del cerebro del filtro se encuentra en las bases de datos individuales, entonces afinar los spams simplemente para que pasen a traves de los filtros semilla no garantiza nada acerca de lo bien que pasaran a través de los variados y mejor entrenados filtros de los diferentes usuarios individuales.
El filtrado de spam basado en el contenido se combina a menudo con una lista blanca, una lista de remitentes cuyo correo puede ser aceptado sin filtro. Una forma fácil de crear una lista blanca es mantener una lista de todas las direcciones a las que el usuario ha enviado correo. Si un lector de correo electrónico tiene un botón de borrar-como-spam, entonces también se puede añadir la dirección de correo electrónico de todo correo que el usuario ha eliminado como basura normal.
Soy un defensor de las listas blancas, pero más como una forma de ahorrar cálculo que como una forma de mejorar la filtración. Solía pensar que las listas blancas harían el filtrado más fácil, ya que sólo tendrías que filtrar el correo electrónico de gente de la que nunca habías oído hablar, y alguien que te envía correo por primera vez se ve limitado por la convención en lo que puede decirte. Alguien que ya conoces puede enviarte correo hablando de sexo, pero que lo haga alguien que te envía correo por primera vez sería poco probable. El problema es que la gente puede tener más de una dirección de correo electrónico, por lo que una nueva dirección no garantiza que el emisor se dirige a ti por primera vez. No es inusual para un viejo amigo (especialmente si se trata de un hacker) enviarte correo electrónico con una nueva dirección, por lo que no puedes arriesgarte a falsos positivos filtrando correo procedente de direcciones desconocidas de manera tan estricta.
Aunque, en cierto sentido, mis filtros encarnan una especie de lista blanca (y lista negra), ya que se basan en mensajes completos, incluyendo las cabeceras. Así que en ese sentido "conocen" las direcciones de correo electrónico de remitentes de confianza e incluso las rutas por las que me llega el correo de ellos. Y conocen lo mismo del spam, incluyendo los nombres de servidor, versiones de programa de correo, y protocolos.
— — —
Si pensara que puedo mantener las tasas actuales de filtrado de spam, consideraría este problema resuelto. Pero no significa mucho poder filtrar la mayoría del spam actual, porque éste evoluciona. De hecho, la mayoría de las técnicas antispam hasta el momento han sido como los pesticidas que no hacen más que crear una nueva cepa de insectos más resistente.
Soy más optimista acerca de los filtros bayesianos, ya que evolucionan con el spam. Así que conforme los spammers empiecen a usar "c0ck" en lugar de "cock" para eludir ingenuos filtros de spam basados en palabras individuales, los filtros bayesianos lo notaran automáticamente. De hecho "c0ck" es una prueba más irrefutable que "cock", y los filtros bayesianos saben con precisión que tanto más.
Sin embargo, cualquier persona que proponga un plan para el filtrado de spam tiene que ser capaz de responder a la pregunta: ¿si los spammers supieran exactamente lo que estas haciendo, qué tan bien podrían colarse? Por ejemplo, creo que si el filtrado de spam basado en la suma de comprobación se convierte en un serio obstáculo, los spammers simplemente cambiarán a técnicas mad-lib para generar cuerpos de mensaje.
Para vencer a los filtros bayesianos, no sería suficiente con que los spammers hicieran originales sus mensajes de correo o dejaran de usar malas palabras individuales. Tendrían que hacer sus mensajes de correo indistinguibles de tu correo ordinario. Y esto, creo, los restringe severamente. El spam es ante todo argumentos de venta, por lo que a menos que tu correo normal sea sólo argumentos de venta, el spam tendrá inevitablemente un carácter diferente. Y los spammers, por supuesto, tendrán también que cambiar (y seguir cambiando) toda su infraestructura, porque de lo contrario las cabeceras lucirían tan mal como siempre a los filtros bayesianos, sin importar lo que hayan hecho con el cuerpo del mensaje. No conozco lo suficiente sobre la infraestructura que utilizan los spammers para saber que tan difícil sería conseguir que las cabeceras luzcan inocentes, pero creo que sería aún más difícil que hacer que el mensaje luzca inocente.
Asumiendo que puedan resolver el problema de los encabezados, el spam en el futuro probablemente lucirá así:
¡Hola! Creo que deberías revisar lo siguiente:
http://www.27meg.com/foo
porque eso es lo máximo que el filtrado basado en contenidos le dejaría al spammer como argumento de ventas. (De hecho, sería difícil incluso conseguir que estos pasaran los filtros anteriores, ya que si todo lo demás en el correo electrónico es neutral, la probabilidad de spam dependerá de la URL, y tomará algún esfuerzo hacer que ésta luzca neutral.)
Los spammers van desde empresas que administran listas opt-in que ni siquiera tratan de ocultar su identidad, a individuos que secuestran servidores de correo para enviar spams que promueven sitios porno. Si utilizamos filtros para reducir gradualmente sus opciones a correos como el de arriba, eso debería poner más o menos a los spammers en el extremo “legitimo” del espectro fuera del negocio; se sienten obligados por las leyes de varios estados a incluir plantillas acerca de por qué su spam no es spam, y cómo cancelar tu "suscripción", y ese tipo de texto es fácil de reconocer.
(Solía pensar que era ingenuo creer que leyes más estrictas disminuirían el spam. Ahora creo que si bien leyes más estrictas pueden no reducir la cantidad de spam que los spammers envían, ciertamente pueden ayudar a los filtros a reducir la cantidad de spam que los destinatarios ven.)
A lo largo del espectro, si se restringen los argumentos de venta que los spammers pueden hacer, tenderías inevitablemente a ponerlos fuera del negocio. Es muy importante recordar la palabra negocio. Los spammers son hombres de negocios. Envían spam porque funciona. Funciona porque a pesar de que la tasa de respuesta es abominablemente baja (en el mejor de los casos 15 por millón, frente a 3000 por millón en la distribución de un correo de catálogo), el costo, para ellos, es prácticamente nulo. El costo es enorme para los destinatarios, aproximadamente 5 semanas-hombre por cada millón de receptores que invierten un segundo en eliminar el correo no deseado, pero el spammer no tiene que pagar eso.
Sin embargo, enviar spam, le cuesta algo al spammer. [2] Así que mientras más baja se pueda mantener la tasa de respuesta —ya sea por filtración, o mediante el uso de filtros para obligar a los spammers a diluir sus mensajes— más empresas descubrirán que no vale la pena su tiempo enviar spam.
La razón por la que los spammers echan mano al tipo de argumentos de venta que utilizan es para aumentar las tasas de respuesta. Esto es, posiblemente, incluso más desagradable que meterse en la mente de un spammer, pero vamos a echar un vistazo dentro de la mente de alguien que responde a un spam. O esta persona es asombrosamente crédula o profundamente en negación acerca de sus intereses sexuales. En cualquier caso, repulsivo o idiota como nos parezca el spam, para ellos es emocionante. Los spammers no dirían estas cosas si no sonaran emocionantes. Y "pensé que deberías revisar lo siguiente" sencillamente no tendrá el mismo empuje con el receptor de spam como el tipo de cosas que los spammers dicen ahora. Resultado: si no puede contener argumentos de venta emocionantes, el spam se vuelve menos eficaz como vehículo de mercadotecnia y menos empresas querrán usarlo.
Esa es la gran ganancia al final. Empecé a escribir software de filtrado de spam porque no quería tener que mirar esas cosas nunca más. Pero si nos hacemos lo suficientemente buenos filtrando spam, dejará de funcionar, y los spammers dejarán de enviarlo.
— — —
De todos los enfoques de la lucha contra el spam, desde el software a las leyes, creo que el filtrado Bayesiano será el más eficaz. Pero también creo que mientras efectuemos mas tipos diferentes de esfuerzos antispam, mejor, ya que cualquier medida que limite a los spammers tendera a hacer más fácil el filtrado. E incluso dentro del mundo de filtrado basado en contenidos, creo que será una buena cosa si hay muchos tipos diferentes de software utilizándose simultáneamente. Mientras haya más filtros diferentes, más difícil será para los spammers afinar los spams para que pasen a través de ellos.
Apéndice: Ejemplos de Filtrado
He aquí un ejemplo de un spam que llegó mientras escribía este artículo. Las quince palabras más interesantes en este spam son:
qvp0045
indira
mx-05
intimail
$ 7500
freeyankeedom
cdo
bluefoxmedia
jpg
unsecured
platinum
3D0
qves
7C5
7c266675
Las palabras son una mezcla de cosas en las cabeceras y el cuerpo del mensaje, lo cual es típico del spam. Típico también es que cada una de estas palabras tiene una probabilidad de spam, en mi base de datos, de .99. De hecho, hay más de quince palabras con probabilidades de .99, y estas son sólo las primeras quince que aparecieron.
Desafortunadamente, eso hace de este correo un aburrido ejemplo del uso de la Regla de Bayes. Para ver una interesante variedad de probabilidades tenemos que ver esto, en realidad, bastante atípico del spam.
Los quince palabras más interesantes en este spam, con sus probabilidades, son las siguientes:
madam 0,99
promotion 0,99
republic 0,99
shortest 0,047225013
mandattory 0,047225013
standarization 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
Esta vez la evidencia es una mezcla de bueno y malo. Una palabra como "shortest" es casi tanto una prueba de la inocencia al igual que una palabra como "madam" o "promotion" lo es para la culpa. Pero aún en el caso de la culpa es más fuerte. Si se combinan estos números de acuerdo con la Regla de Bayes, la probabilidad resultante es 0,9027.
"Madam" es obviamente de spams que comienzan con "Dear Sir or Madam". No son muy comunes, pero la palabra "madam" no ocurre nunca en mi correo electrónico legítimo, y todo tiene que ver con la relación.
"Republic" tiene puntaje alto ya que aparece a menudo en los correos electrónicos nigerianos fraudulentos, y también ocurre una o dos veces en spams que se refieren a Corea y Sudáfrica. Se podría decir que es un accidente que ayuda a identificar a este tipo de spam. Pero lo que he descubierto al examinar las probabilidades de spam es que hay muchos de estos accidentes, y tienen una extraña tendencia a llevar las cosas en la dirección correcta en lugar de la incorrecta. En este caso, no es del todo una coincidencia que la palabra "Republic" aparezca en los correos electrónicos de estafa nigerianos y en este spam. Hay toda una clase de propuestas de negocios dudosas que involucran a los países menos desarrollados, y éstos, a su vez, son más propensos a tener nombres que especifican explícitamente (porque no lo son) que son repúblicas. [3]
Por otro lado, "enter" es una verdadera omisión. Ocurre sobre todo en las instrucciones para darse de baja, pero aquí se usa de una manera completamente inocente. Afortunadamente, el enfoque estadístico es bastante robusto, y puede tolerar muchos fallos antes de que los resultados empiecen a descartarse.
Para la comparación, he aquí un ejemplo de ese pájaro raro, un spam que se cuela a través de los filtros. ¿Por qué? Debido a que por casualidad resulta estar cargado con palabras que aparecen en mi correo 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
Hay un par de buenas noticias aquí. En primer lugar, este correo probablemente no pasaría a través de los filtros de alguien que no resulte especializarse en lenguajes de programación y tenga un buen amigo llamado Morris. Para el usuario promedio, todas las cinco palabras principales aquí serían neutrales y no contribuirían a la probabilidad de spam.
En segundo lugar, creo que el filtrado basado en pares de palabras (véase más adelante) podría atrapar estas: "cost effective", "setup fee", "money back" —cosas bastante incriminatorias. Y por supuesto, si continuaran enviándome spam (o una red a la que yo perteneciera), "Hostex" en sí misma sería reconocida como un término de spam.
Por último, he aquí un correo inocente. Sus quince palabras más interesantes son las siguientes:
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
La mayoría de las palabras aquí indican que el correo es inocente. Hay dos palabras que huelen mal, "color" (los spammers aman las fuentes coloreadas) y "California" (que aparece en testimonios y los menús de las formas), pero no es suficiente, no pesan más que palabras obviamente inocentes como "continuation" y “example".
Es interesante que "describe" sea calificada como inocente. No se ha producido en uno solo de mis 4000 spams. Los datos resultan estar llenos de tales sorpresas. Una de las cosas que se aprenden cuando se analizan los textos de spam es lo estrecho de un subconjunto del lenguaje en el que operan los spammers. Es este hecho, junto con el vocabulario igualmente característico del correo electrónico de cualquier usuario individual, que hace que el filtrado Bayesiano sea una buena apuesta.
Apéndice: Más ideas
Una idea que no he probado todavía es filtrar basado en pares de palabras, o incluso tríos, en lugar de palabras individuales. Esto debería arrojar una estimación mucho más precisa de la probabilidad. Por ejemplo, en mi base de datos actual, la palabra "ofertas" tiene una probabilidad de .96. Si basaras las probabilidades en pares de palabras, terminarías con "ofertas especiales" y "ofertas valiosas" con probabilidades de .99 y, digamos, "ofertas similares" (como en "esta oferta similar") con una probabilidad de .1 o menos.
La razón por la que no lo he hecho es que el filtrado basado en palabras individuales ya funciona muy bien. Pero significa que hay margen para ajustar los filtros si el spam se hace más difícil de detectar. (Curiosamente, un filtro basado en pares de palabras sería de hecho un generador de texto en cadena de Márkov funcionando en reversa.)
Las características específicas del spam (por ejemplo, no ver la dirección del destinatario en el campo Para: ) tienen, por supuesto, un valor en el reconocimiento de spam. Se pueden considerar en este algoritmo, tratándolas como palabras virtuales. Probablemente haga esto en versiones futuras, al menos para un puñado de los indicadores de spam más atroces. Los filtros de reconocimiento de características de spam están bien en muchos detalles; lo que les falta es una disciplina general para combinar evidencia.
Reconocer las características de lo que no es spam puede ser más importante que reconocer las características del spam. Los falsos positivos son una preocupación que demanda medidas extraordinarias. Probablemente en versiones futuras añadiré un segundo nivel de análisis diseñado específicamente para evitar falsos positivos. Si un correo desencadena este segundo nivel de filtros será aceptado incluso si su probabilidad de spam está por encima del umbral.
No espero que este segundo nivel de filtrado sea Bayesiano. Inevitablemente, será no sólo ad hoc, sino basado en conjeturas, porque el número de falsos positivos tenderá a no ser lo suficientemente grande como para notar patrones. (De cualquier forma, es igual de bueno si un sistema de apoyo no se basa en la misma tecnología que el sistema primario.)
Otra cosa que probablemente pruebe en el futuro será dedicar atención extra en partes específicas del correo electrónico. Por ejemplo, alrededor del 95% del actual spam incluye la URL de un sitio que quieren que visites. (El restante 5% quiere que llames a un número de teléfono, respondas por correo electrónico o a una dirección de correo en los EE.UU., o en algunos casos que compres una acción determinada.) La URL es en estos casos prácticamente suficiente en sí misma para determinar si el correo electrónico es spam.
Los nombres de dominio se diferencian del resto del texto en un correo electrónico (no alemán) en que a menudo constan de varias palabras pegadas. Aunque computacionalmente costoso en el caso general, podría valer la pena tratar de separarlas. Si un filtro no ha visto nunca el identificador "xxxporn" tendrá una probabilidad individual de spam de .4, mientras que "xxx" y "porn" individualmente tienen probabilidades (en mi corpus) de .9889 y .99, respectivamente, y una probabilidad combinada de .9998.
Espero que separar las palabras en los nombres de dominio se vuelva más importante conforme los spammers se vean obligados a dejar de usar palabras incriminatorias en el texto de sus mensajes. (Una URL con una dirección IP es, por supuesto, una señal bastante incriminatoria, excepto en el correo de unos pocos administradores de sistemas.)
Podría ser una buena idea tener una lista de URLs promovidos por los spammers mantenida de manera cooperativa. Necesitaríamos una métrica de confianza del tipo estudiada por Raph Levien para impedir envíos maliciosos o incompetentes, pero si tuviéramos tal cosa daría un impulso a cualquier software de filtrado. Sería también una base conveniente para los boicots.
Otra manera de probar URLs dudosos sería enviar una araña web para buscar en el sitio antes de que el usuario vea el correo que lo menciona. Se podría usar un filtro Bayesiano para clasificar el sitio en la misma manera como lo harías con un correo electrónico, y cualquier cosa que se encuentre en el sitio puede ser incluida en el cálculo de la probabilidad de que el correo sea spam. Una URL que lleva a una redirección sería, por supuesto, particularmente sospechosa.
Uno de los proyectos de cooperación que creo realmente sería una buena idea es la de acumular un corpus gigante de spam. Un corpus grande, limpio, es la clave para que funcione bien el filtrado Bayesiano. Los filtros bayesianos podrían utilizar el corpus como entrada. Pero tal corpus sería útil para otros tipos de filtros también, ya que se podría utilizar para ponerlos a prueba.
La creación de este corpus plantea algunos problemas técnicos. Por supuesto, necesitaríamos métricas de confianza para prevenir envíos maliciosos o incompetentes. También necesitaríamos maneras de borrar información personal (no sólo en el espacio de Para: en las direcciones-y los ccs, sino también, por ejemplo, los argumentos para dar de baja URLs, que a menudo codifican el espacio Para-dirección) de correos en el corpus. Si alguien quiere abordar este proyecto, sería algo bueno para el mundo.
Anexo: Definición de Spam
Creo que hay un cierto consenso sobre lo que es el spam, pero sería útil contar con una definición explícita. Tendremos que hacerlo si queremos establecer un corpus central de spam, o incluso comparar las tasas de filtrado de spam de manera significativa.
Para empezar, el spam no es correo electrónico comercial no solicitado. Si alguien en mi vecindario se enteró de que estaba buscando una vieja Raleigh de tres velocidades en buen estado, y me envía un correo electrónico ofreciendo venderme una, estaría encantado, y sin embargo este mensaje sería tanto comercial como no solicitado. La característica definitoria del spam (de hecho, su raison d’être), no es que no sea solicitado, sino que es automatizado.
Es meramente incidental, también, que el spam suele ser comercial. Si alguien empieza a enviar correo electrónico masivo para apoyar alguna causa política, por ejemplo, sería spam tanto como un correo electrónico que promociona un sitio pornográfico.
Propongo definir el spam como correo electrónico automatizado no solicitado. Esta definición incluye por lo tanto algúnos correos electrónicos que muchas definiciones legales de spam no incluyen. Las definiciones legales del spam, influenciadas probablemente por los grupos de presión, tienden a excluir el correo enviado por empresas que tienen una "relación existente" con el destinatario. Pero comprar algo a una compañía, por ejemplo, no implica que hayas solicitado correo electrónico permanente de la misma. Si ordeno algo de una tienda en linea, y luego me envían un flujo de spam, sigue siendo spam.
Las empresas que envían spam a menudo te proporcionan una manera de "darte de baja", o te piden que vayas a su sitio y cambies tus "preferencias de la cuenta" si deseas dejar de recibir spam. Esto no es suficiente para impedir que el correo siga siendo spam. Desuscribirse no es lo mismo que suscribirse. A menos que el destinatario haya marcado explícitamente una casilla claramente etiquetada (cuyo valor predeterminado es no) pidiendo recibir el correo electrónico, entonces es spam.
En algunas relaciones laborales solicitas de manera implícita ciertos tipos de correo. Cuando ordenas en línea, creo que implícitamente solicitas un recibo y notificación de cuando la orden se envía. No me molesta cuando Verisign me envía correo advirtiéndome que un nombre de dominio está a punto de expirar (al menos, si es el verdadero registrante del mismo). Pero cuando Verisign me envía un correo electrónico ofreciéndome una Guía GRATUITA Para Crear Mi Sitio de Comercio Electrónico, eso es spam.
Notas:
[1] Los ejemplos de este artículo se tradujeron en Common Lisp para, créanlo o no, una mayor accesibilidad. La aplicación descrita aquí es la que escribimos con el fin de probar un nuevo dialecto de Lisp llamado Arc que aún no se ha liberado.
[2] En la actualidad la tasa más baja parece ser alrededor de $200 para enviar un millón de mensajes de spam. Eso es muy barato, 1/50avo de centavo por spam. Pero filtrar el 95% del spam, por ejemplo, aumentaría el costo de los spammers para llegar a una audiencia dada por un factor de 20. Pocos pueden tener márgenes lo suficientemente grandes como para absorber eso.
[3] Como regla general, mientras más calificadores haya delante del nombre de un país, más corruptos los gobernantes. Un país llamado La República Socialista Popular Democrática de X probablemente sea el último lugar del mundo donde te gustaría vivir.
Gracias a Sarah Harlin por leer los borradores de esto; Daniel Giffin (que también está escribiendo el intérprete de Arc) por varias ideas buenas sobre el filtrado y por crear nuestra infraestructura de correo; Robert Morris, Trevor Blackwell y Erann Gat por muchas discusiones sobre el spam; Raph Levien por los consejos sobre las métricas de confianza; y Chip Coldwell y Sam Steingold por el asesoramiento sobre las estadísticas.
Traducido de A Plan for Spam por Paul Graham. Traducción: Armando Alvarez