Loading...

UN PLAN PARA EL SPAM

Original

Agosto de 2002

(Este artículo describe las técnicas de filtrado de spam utilizadas en el lector de correo web a prueba de spam que construimos para ejercitar Arc . En Mejor filtrado bayesiano se describe un algoritmo mejorado).

Creo que es posible detener el spam y que los filtros basados en el contenido son la forma de hacerlo. El talón de Aquiles de los spammers es su mensaje. Pueden sortear cualquier otra barrera que se les ponga. Al menos hasta ahora lo han hecho. Pero tienen que entregar su mensaje, sea cual sea. Si podemos escribir un software que reconozca sus mensajes, no habrá forma de que puedan sortearlo.


Para el destinatario, el spam es fácilmente reconocible. Si contratara a alguien para que lea su correo y descarte el spam, no tendría problemas para hacerlo. ¿Cuánto tenemos que hacer, aparte de la IA, para automatizar este proceso?

Creo que podremos resolver el problema con algoritmos bastante simples. De hecho, he descubierto que se puede filtrar el spam actual de manera aceptable utilizando nada más que una combinación bayesiana de las probabilidades de spam de palabras individuales. Utilizando un filtro bayesiano ligeramente modificado (como se describe a continuación), ahora dejamos pasar menos de 5 por cada 1000 spam, con 0 falsos positivos.

El enfoque estadístico no suele ser el primero que se intenta cuando se crean filtros de spam. El primer instinto de la mayoría de los hackers es intentar escribir un software que reconozca las propiedades individuales del spam. Uno observa el spam y piensa: qué descaro tienen estos tipos al intentar enviarme un correo que empieza con "Estimado amigo" o que tiene un asunto en mayúsculas y termina con ocho signos de exclamación. Puedo filtrar ese tipo de cosas con una sola línea de código.

Y así lo haces, y al principio funciona. Unas cuantas reglas sencillas te ayudarán a reducir en gran medida el spam que recibes. Con solo buscar la palabra "clic", detectarás el 79,7 % de los correos electrónicos de mi carpeta de spam, con solo un 1,2 % de falsos positivos.

Pasé unos seis meses escribiendo un software que buscaba características individuales del spam antes de probar el método estadístico. Lo que descubrí fue que reconocer ese último porcentaje de spam era muy difícil y que, a medida que hacía más estrictos los filtros, obtenía más falsos positivos.

Los falsos positivos son correos electrónicos inocentes que se identifican por error como spam. Para la mayoría de los usuarios, no recibir un correo electrónico legítimo es mucho peor que recibir spam, por lo que un filtro que genere falsos positivos es como una cura para el acné que conlleva un riesgo de muerte para el paciente.

Cuanto más spam recibe un usuario, menos probable es que se dé cuenta de que hay un correo inocente en su carpeta de spam. Y, curiosamente, cuanto mejores sean los filtros de spam, más peligrosos serán los falsos positivos, porque cuando los filtros son realmente buenos, es más probable que los usuarios ignoren todo lo que detecten.

No sé por qué evité durante tanto tiempo probar el método estadístico. Creo que fue porque me volví adicto a tratar de identificar las características del spam por mí mismo, como si estuviera jugando una especie de juego competitivo con 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 que yo. Descubrió, por supuesto, que términos como "virtumundo" y "teens" eran buenos indicadores de spam. Pero también descubrió que "per", "FL" y "ff0000" son buenos indicadores de spam. De hecho, "ff0000" (html para rojo brillante) resulta ser un indicador de spam tan bueno como cualquier término pornográfico.


He aquí un esbozo de cómo realizo el filtrado estadístico. Comienzo con un corpus de correo no deseado y otro de correo no deseado. En este momento, cada uno tiene alrededor de 4000 mensajes. Examino todo el texto, incluidos los encabezados y el código HTML y JavaScript incrustados, de cada mensaje de cada corpus. Actualmente, considero que los caracteres alfanuméricos, los guiones, los apóstrofos y los signos de dólar forman parte de los tokens, y todo lo demás es un separador de tokens (probablemente haya margen de mejora en este aspecto). Ignoro los tokens que son todos dígitos y también ignoro los comentarios HTML, sin siquiera considerarlos separadores de tokens.

Cuento la cantidad de veces que aparece cada token (sin tener en cuenta las mayúsculas y minúsculas, por el momento) en cada corpus. En esta etapa, termino con dos tablas hash grandes, una para cada corpus, que asignan tokens a la cantidad de ocurrencias.

A continuación creo una tercera tabla hash, esta vez asignando cada token a la probabilidad de que un correo electrónico que lo contenga sea spam, que calculo de la siguiente manera [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)))))))))

donde palabra es el token cuya probabilidad estamos calculando, bueno y malo son las tablas hash que creé 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 sesgar ligeramente las probabilidades para evitar falsos positivos y, por ensayo y error, descubrí que una buena forma de hacerlo es duplicar todos los números en el caso de los mensajes de correo electrónico válidos. Esto ayuda a distinguir entre palabras que aparecen ocasionalmente en mensajes de correo electrónico legítimos y palabras que casi nunca aparecen. Solo tengo en cuenta las palabras que aparecen más de cinco veces en total (de hecho, debido a la duplicación, que aparezcan tres veces en mensajes de correo electrónico 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 en el otro. Nuevamente, por ensayo y error, elegí 0,01 y 0,99. Puede que haya margen para realizar ajustes aquí, pero a medida que el corpus crezca, dichos ajustes se realizarán automáticamente de todos modos.

Los más observadores notarán que, si bien considero que cada corpus es un único y largo flujo de texto a los efectos de contar las ocurrencias, utilizo la cantidad de mensajes de correo electrónico en cada uno, en lugar de su longitud combinada, como divisor para calcular las probabilidades de spam. Esto agrega otro ligero sesgo para proteger contra los falsos positivos.

Cuando llega un correo nuevo, se escanea y se convierte en tokens, y los quince tokens más interesantes (donde el interés se mide en función de la distancia entre su probabilidad de spam y un valor neutral de 0,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 la siguiente 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 aparece en la tabla hash de probabilidades de palabras. He descubierto, nuevamente por ensayo y error, que 0,4 es un buen número para usar. Si nunca has visto una palabra antes, probablemente sea bastante inocente; las palabras basura tienden a resultarte demasiado familiares.

Hay ejemplos de la aplicación de este algoritmo a correos electrónicos reales en un apéndice al final.

Considero que un correo es spam si el algoritmo anterior le otorga una probabilidad de más de 0,9 de ser spam. Pero en la práctica no importa mucho dónde coloque este umbral, porque pocas probabilidades terminan en el medio del rango.


Una gran ventaja del enfoque estadístico es que no es necesario leer tantos mensajes basura. En los últimos seis meses, he leído literalmente miles de mensajes basura, y es algo realmente desmoralizante. Norbert Wiener dijo que si compites con esclavos te conviertes en esclavo, y hay algo igualmente degradante en competir con los spammers. Para reconocer las características individuales del spam, tienes que intentar entrar en la mente del spammer y, francamente, quiero pasar el menor tiempo posible dentro de la mente de los spammers.

Pero la verdadera ventaja del método bayesiano, por supuesto, es que uno sabe lo que está midiendo. Los filtros que reconocen características como SpamAssassin asignan una "puntuación" de spam al correo electrónico. El método 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 peor aún, tampoco lo sabe el desarrollador del filtro. ¿Cuántos puntos debería obtener un correo electrónico por contener la palabra "sexo"? Por supuesto, una probabilidad puede ser errónea, pero hay poca ambigüedad sobre lo que significa o cómo se deben combinar las pruebas para calcularla. Según mi corpus, "sexo" indica una probabilidad de 0,97 de que el correo electrónico que contiene sea spam, mientras que "sexy" indica una probabilidad de 0,99. Y la regla de Bayes, igualmente inequívoca, dice que un correo electrónico que contenga ambas palabras tendría, en la (improbable) ausencia de cualquier otra prueba, una probabilidad del 99,97% de ser spam.

Como se trata de medir probabilidades, el método bayesiano tiene en cuenta todas las pruebas del correo electrónico, tanto las buenas como las malas. Las palabras que aparecen con una frecuencia desproporcionadamente baja en el correo basura (como "aunque", "esta noche" o "aparentemente") contribuyen tanto a reducir la probabilidad como las palabras malas como "cancelar la suscripción" y "aceptar" a aumentarla. Por lo tanto, un correo electrónico por lo demás inocente que incluya la palabra "sexo" no va a ser etiquetado como correo basura.

Lo ideal, por supuesto, es que las probabilidades se calculen individualmente para cada usuario. Recibo muchos mensajes de correo electrónico que contienen la palabra "Lisp" y (hasta ahora) ningún correo basura que la contenga. Por lo tanto, una palabra como esa es, en realidad, una especie de contraseña para enviarme correo. En mi anterior software de filtrado de correo basura, el usuario podía configurar una lista de esas palabras y el correo que las contuviera pasaría automáticamente los filtros. En mi lista puse palabras como "Lisp" y también mi código postal, de modo que los recibos de pedidos en línea (que de otro modo sonarían a correo basura) pasaran. Pensé que estaba siendo muy inteligente, pero descubrí que el filtro bayesiano hacía lo mismo por mí y, además, descubrí muchas palabras en las que no había pensado.

Cuando dije al principio que nuestros filtros dejan pasar menos de 5 mensajes spam por cada 1000 con 0 falsos positivos, me refiero a filtrar mi correo en función de 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 en función del correo spam y no spam que recibe. Básicamente, cada usuario debería tener dos botones de eliminación, el de eliminación normal y el de eliminación como spam. Todo lo que se elimine como spam va al corpus de spam y todo lo demás va al corpus de no spam.

Se podría empezar con un filtro de semillas para los usuarios, pero en última instancia cada usuario debería tener sus propias probabilidades por palabra en función del correo real que recibe. Esto (a) hace que los filtros sean más eficaces, (b) permite que cada usuario decida su propia definición precisa de spam y (c) quizás lo mejor de todo es que a los spammers les resulta difícil ajustar los correos para que pasen los filtros. Si gran parte del cerebro del filtro está en las bases de datos individuales, entonces ajustar simplemente los spam para que pasen los filtros de semillas no garantizará nada sobre lo bien que pasarán los filtros variables y mucho más entrenados de los usuarios individuales.

El filtrado de spam basado en contenido suele combinarse con una lista blanca, una lista de remitentes cuyo correo puede aceptarse sin filtrarse. Una forma sencilla de crear una lista blanca de este tipo es mantener una lista de todas las direcciones a las que el usuario ha enviado correo alguna vez. Si un lector de correo tiene un botón para eliminar como spam, también puede agregar la dirección de remitente de cada correo electrónico que el usuario haya eliminado como basura normal.

Soy partidario de las listas blancas, pero más como una forma de ahorrar cálculos que como una forma de mejorar el filtrado. Solía pensar que las listas blancas facilitarían el filtrado, porque solo tendrías que filtrar el correo electrónico de personas de las que nunca habías oído hablar, y alguien que te envía un correo por primera vez está limitado por la convención en lo que te puede decir. Alguien a quien ya conoces puede enviarte un correo electrónico hablando de sexo, pero alguien que te envía un correo por primera vez probablemente no lo hará. El problema es que las personas pueden tener más de una dirección de correo electrónico, por lo que una nueva dirección de remitente no garantiza que el remitente te esté escribiendo por primera vez. No es inusual que un viejo amigo (especialmente si es un hacker) te envíe de repente un correo electrónico con una nueva dirección de remitente, por lo que no puedes arriesgarte a falsos positivos filtrando el correo de direcciones desconocidas de forma especialmente estricta.

En cierto sentido, sin embargo, mis filtros sí que encarnan una especie de lista blanca (y lista negra) porque se basan en mensajes completos, incluidos los encabezados. Por lo tanto, en esa medida, "conocen" las direcciones de correo electrónico de remitentes de confianza e incluso las rutas por las que el correo llega desde ellos hasta mí. Y saben lo mismo sobre el correo basura, incluidos los nombres de los servidores, las versiones de los programas de correo y los protocolos.


Si pensara que podría mantener los niveles actuales de filtrado de spam, consideraría que este problema está resuelto. Pero no significa mucho poder filtrar la mayor parte del spam actual, porque el spam evoluciona. De hecho, la mayoría de las técnicas antispam hasta ahora han sido como pesticidas que no hacen nada más que crear una nueva cepa de insectos resistentes.

Tengo más esperanzas en los filtros bayesianos, porque evolucionan con el spam. Así, cuando los spammers empiezan a usar "c0ck" en lugar de "cock" para evadir los filtros de spam simplistas basados en palabras individuales, los filtros bayesianos lo detectan automáticamente. De hecho, "c0ck" es una prueba mucho más contundente que "cock", y los filtros bayesianos saben exactamente cuánto más.

Aun así, cualquiera que proponga un plan para filtrar el spam debe poder responder a la pregunta: si los spammers supieran exactamente lo que estás haciendo, ¿qué tan bien podrían burlarte? Por ejemplo, creo que si el filtrado de spam basado en sumas de comprobación se convierte en un obstáculo serio, los spammers simplemente recurrirán a técnicas de bibliotecas improvisadas para generar los cuerpos de los mensajes.

Para vencer a los filtros bayesianos, no bastaría con que los spammers hicieran que sus mensajes fueran únicos o dejaran de usar palabras malsonantes individuales. Tendrían que hacer que sus mensajes fueran indistinguibles de tu correo ordinario. Y creo que esto los limitaría severamente. El spam es principalmente un discurso de ventas, así que a menos que tu correo ordinario sea todo discurso de ventas, el spam tendrá inevitablemente un carácter diferente. Y los spammers también tendrían, por supuesto, que cambiar (y seguir cambiando) toda su infraestructura, porque de lo contrario los encabezados se verían tan mal para los filtros bayesianos como siempre, sin importar lo que hicieran con el cuerpo del mensaje. No sé lo suficiente sobre la infraestructura que usan los spammers como para saber lo difícil que sería hacer que los encabezados parecieran inocentes, pero supongo que sería incluso más difícil que hacer que el mensaje parezca inocente.

Suponiendo que puedan solucionar el problema de los encabezados, el spam del futuro probablemente se verá así:

 Hey there. Thought you should check out the following: http://www.27meg.com/foo

porque ese es el máximo argumento de venta que el filtrado basado en contenido le dejará al spammer. (De hecho, será difícil incluso pasar esto por los filtros, porque si todo lo demás en el correo electrónico es neutral, la probabilidad de spam dependerá de la URL, y será necesario un cierto esfuerzo para que parezca neutral).

Los spammers van desde empresas que gestionan las llamadas listas de suscripción voluntaria y que ni siquiera intentan ocultar su identidad, hasta tipos que secuestran servidores de correo para enviar spam que promociona sitios pornográficos. Si utilizamos filtros para reducir sus opciones a correos como el que se muestra arriba, eso debería dejar a los spammers en el extremo "legítimo" del espectro fuera del negocio; se sienten obligados por diversas leyes estatales a incluir texto estándar sobre por qué su spam no es spam y cómo cancelar su "suscripción", y ese tipo de texto es fácil de reconocer.

(Solía pensar que era ingenuo creer que leyes más estrictas reducirían el spam. Ahora creo que, si bien es posible que leyes más estrictas no reduzcan la cantidad de spam que envían los spammers, ciertamente pueden ayudar a los filtros a reducir la cantidad de spam que los destinatarios realmente ven).

En todos los aspectos, si se restringen los discursos de venta que pueden hacer los spammers, inevitablemente se tenderá a sacarlos del negocio. Es importante recordar esa palabra, " negocio" . Los spammers son hombres de negocios. Envían spam porque funciona. Funciona porque, aunque la tasa de respuesta es abominablemente baja (en el mejor de los casos, 15 por millón, frente a las 3000 por millón de un envío por catálogo), el coste, para ellos, es prácticamente nulo. El coste es enorme para los destinatarios, alrededor de 5 semanas-hombre por cada millón de destinatarios que dedican un segundo a eliminar el spam, pero el spammer no tiene que pagar eso.

Sin embargo, enviar spam le cuesta algo al spammer. [2] Por lo tanto, cuanto menor sea la tasa de respuesta (ya sea mediante filtrado o utilizando filtros para obligar a los spammers a diluir sus propuestas), menos empresas considerarán que vale la pena enviar spam.

La razón por la que los spammers utilizan este tipo de discursos de venta es para aumentar las tasas de respuesta. Es posible que esto sea incluso más repugnante que meterse en la mente de un spammer, pero echemos un vistazo rápido a la mente de alguien que responde a un spam. Esta persona es o sorprendentemente crédula o está en una profunda negación sobre sus intereses sexuales. En cualquier caso, por repulsivo o idiota que nos parezca el spam, para ellos es excitante. Los spammers no dirían estas cosas si no sonaran excitantes. Y "pensé que deberías ver lo siguiente" no va a tener ni la mitad de atractivo en el receptor del spam que el tipo de cosas que los spammers dicen ahora. Resultado: si no puede contener discursos de venta excitantes, el spam se vuelve menos eficaz como vehículo de marketing y menos empresas quieren usarlo.

Esa es la gran victoria al final. Empecé a escribir software de filtrado de spam porque no quería tener que mirar más el material. Pero si nos volvemos lo suficientemente buenos en el filtrado de spam, dejará de funcionar y los spammers dejarán de enviarlo.


De todos los enfoques para combatir el spam, desde el software hasta las leyes, creo que el filtrado bayesiano será el más eficaz. Pero también creo que cuantos más tipos de esfuerzos antispam emprendamos, mejor, porque cualquier medida que limite a los spammers tenderá a facilitar el filtrado. E incluso en el mundo del filtrado basado en contenido, creo que será bueno que se utilicen muchos tipos diferentes de software simultáneamente. Cuantos más filtros diferentes haya, más difícil será para los spammers ajustar el spam para que los supere.

Apéndice: Ejemplos de filtrado

A continuación se muestra un ejemplo de un correo no deseado que llegó mientras estaba escribiendo este artículo. Las quince palabras más interesantes de este correo no deseado son:

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

Las palabras son una mezcla de elementos de los encabezados y del cuerpo del mensaje, lo que es típico del spam. También es típico del spam que cada una de estas palabras tenga una probabilidad de spam, en mi base de datos, de 0,99. De hecho, hay más de quince palabras con probabilidades de 0,99, y estas son solo las primeras quince que he visto.

Lamentablemente, esto convierte a este correo electrónico en un ejemplo aburrido del uso de la regla de Bayes. Para ver una variedad interesante de probabilidades, tenemos que analizar este correo basura, que en realidad es bastante atípico.

Las quince palabras más interesantes de este spam, con sus probabilidades, son:

 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

Esta vez, la evidencia es una mezcla de buena y mala. Una palabra como "más corta" es casi tan evidencia de inocencia como una palabra como "señora" o "promoción" lo es de culpabilidad. Pero aun así, el argumento a favor de la culpabilidad es más fuerte. Si se combinan estos números según la regla de Bayes, la probabilidad resultante es 0,9027.

Obviamente, "Señora" proviene de mensajes de spam que comienzan con "Estimado señor o señora". No son muy comunes, pero la palabra "señora" nunca aparece en mi correo electrónico legítimo, y todo es cuestión de proporción.

"República" tiene una puntuación alta porque aparece a menudo en los correos electrónicos fraudulentos nigerianos y también aparece una o dos veces en los mensajes de spam que hacen referencia a Corea y Sudáfrica. Se podría decir que es una casualidad que ayude a identificar este tipo de correo basura, pero he descubierto al examinar las probabilidades de correo basura que hay muchos de estos accidentes y que tienen una extraña tendencia a llevar las cosas en la dirección correcta en lugar de en la incorrecta. En este caso, no es una coincidencia que la palabra "República" aparezca en los correos electrónicos fraudulentos nigerianos y en este correo basura. Existe toda una clase de propuestas comerciales dudosas que involucran a países menos desarrollados y, a su vez, es más probable que estos tengan nombres que especifiquen explícitamente (porque no lo son) que son repúblicas.[3]

Por otra parte, "enter" es un error genuino. Ocurre principalmente en instrucciones de cancelación de suscripción, pero aquí se utiliza de una manera completamente inocente. Afortunadamente, el enfoque estadístico es bastante sólido y puede tolerar muchos errores antes de que los resultados comiencen a distorsionarse.

A modo de comparación, he aquí un ejemplo de ese raro caso: un correo no deseado que logra pasar los filtros. ¿Por qué? Porque por pura casualidad resulta que está cargado de palabras que aparecen en mi correo electrónico 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. En primer lugar, este correo probablemente no pasaría los filtros de alguien que no se especializara en lenguajes de programación y tuviera un buen amigo llamado Morris. Para el usuario promedio, las cinco primeras palabras 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 (ver más abajo) podría detectar este: "rentable", "tarifa de instalación", "devolución de dinero"; son términos bastante incriminatorios. Y, por supuesto, si seguían enviándome spam (a mí o a una red de la que formaba parte), "Hostex" en sí mismo sería reconocido como un término spam.

Por último, os dejo un correo electrónico 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 que aparecen aquí indican que el mensaje es inocente. Hay dos palabras que huelen mal, "color" (a los spammers les encantan las fuentes de colores) y "California" (que aparece en los testimonios y también en los menús de los formularios), pero no son suficientes para compensar palabras obviamente inocentes como "continuación" y "ejemplo".

Es interesante que la clasificación "describe" sea tan completamente inocente. No ha ocurrido en ninguno de los 4000 mensajes spam que he recibido. Los datos resultan estar llenos de sorpresas de ese tipo. Una de las cosas que se aprende cuando se analizan los mensajes spam es el reducido subconjunto del lenguaje en el que operan los spammers. Es ese hecho, junto con el vocabulario igualmente característico del correo de cualquier usuario individual, lo que hace que el filtrado bayesiano sea una buena apuesta.

Apéndice: Más ideas

Una idea que aún no he probado es filtrar en función de pares de palabras, o incluso de triples, en lugar de palabras individuales. Esto debería dar 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 0,96. Si basaras las probabilidades en pares de palabras, terminarías con "ofertas especiales" y "ofertas valiosas" con probabilidades de 0,99 y, por ejemplo, "ofertas de aproximación" (como en "estas ofertas de aproximación") con una probabilidad de 0,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 vuelve más difícil de detectar. (Curiosamente, un filtro basado en pares de palabras sería en realidad un generador de texto de encadenamiento de Markov que funciona al revés).

Las características específicas del spam (por ejemplo, no ver la dirección del destinatario en el campo para:) tienen, por supuesto, valor para reconocer el spam. Se pueden tener en cuenta en este algoritmo tratándolas como palabras virtuales. Probablemente haré esto en futuras versiones, al menos para un puñado de los indicadores de spam más atroces. Los filtros de spam que reconocen características tienen razón en muchos detalles; lo que les falta es una disciplina general para combinar evidencia.

Reconocer las características que no son spam puede ser más importante que reconocer las características que sí lo son. Los falsos positivos son tan preocupantes que exigen medidas extraordinarias. Probablemente, en futuras versiones, añadiré un segundo nivel de pruebas diseñado específicamente para evitar los falsos positivos. Si un correo activa este segundo nivel de filtros, se aceptará incluso si su probabilidad de ser spam supera el umbral.

No espero que este segundo nivel de filtrado sea bayesiano. Inevitablemente, no sólo será ad hoc, sino que se basará en conjeturas, porque la cantidad de falsos positivos no tenderá a ser lo suficientemente grande como para detectar patrones. (De todos modos, es igual de bueno que un sistema de respaldo no dependa de la misma tecnología que el sistema principal).

Otra cosa que podría intentar en el futuro es centrar más la atención en partes específicas del correo electrónico. Por ejemplo, aproximadamente el 95% del spam actual incluye la URL de un sitio que quieren que visites. (El 5% restante quiere que llames a un número de teléfono, respondas por correo electrónico o a una dirección de correo de EE. UU. o, en algunos casos, que compres una determinada acción). En estos casos, la URL es prácticamente suficiente por sí sola para determinar si el correo electrónico es spam.

Los nombres de dominio se diferencian del resto del texto de un correo electrónico (que no esté en alemán) en que suelen estar compuestos por varias palabras pegadas entre sí. Aunque en general es un proceso computacionalmente costoso, puede que valga la pena intentar descomponerlos. Si un filtro nunca ha visto el token "xxxporn" antes, tendrá una probabilidad individual de spam de 0,4, mientras que "xxx" y "porn" individualmente tienen probabilidades (en mi corpus) de 0,9889 y 0,99 respectivamente, y una probabilidad combinada de 0,9998.

Espero que la descomposición de los nombres de dominio adquiera mayor importancia a medida que los spammers se vean obligados a dejar de utilizar palabras incriminatorias en el texto de sus mensajes (una URL con una dirección IP es, por supuesto, una señal extremadamente incriminatoria, excepto en el correo de unos pocos administradores de sistemas).

Sería una buena idea tener una lista de direcciones URL que se mantengan de forma cooperativa y que sean promocionadas por los spammers. Necesitaríamos una métrica de confianza del tipo estudiado por Raph Levien para evitar envíos maliciosos o incompetentes, pero si tuviéramos algo así, sería un impulso para cualquier software de filtrado. También sería una base conveniente para los boicots.

Otra forma de comprobar las URL dudosas sería enviar un rastreador para que examinara el sitio antes de que el usuario viera el correo electrónico que lo menciona. Se podría utilizar un filtro bayesiano para calificar el sitio tal como se haría con un correo electrónico, y lo que se encuentre en el sitio podría incluirse en el cálculo de la probabilidad de que el correo electrónico sea spam. Una URL que conduzca a una redirección sería, por supuesto, especialmente sospechosa.

Un proyecto cooperativo que creo que sería una buena idea sería acumular un corpus gigante de spam. Un corpus grande y limpio es la clave para que el filtrado bayesiano funcione bien. Los filtros bayesianos podrían utilizar el corpus como entrada, pero un corpus de este tipo también sería útil para otros tipos de filtros, porque podría utilizarse para probarlos.

La creación de un corpus de este tipo plantea algunos problemas técnicos. Necesitaríamos métricas de confianza para evitar envíos maliciosos o incompetentes, por supuesto. También necesitaríamos formas de borrar información personal (no solo direcciones de destinatario y de copia, sino también, por ejemplo, los argumentos para cancelar la suscripción a las URL, que a menudo codifican la dirección de destinatario) de los correos incluidos en el corpus. Si alguien quiere emprender este proyecto, sería algo bueno para el mundo.

Apéndice: Definición de spam

Creo que hay un consenso general sobre qué es el spam, pero sería útil tener una definición explícita. Tendremos que hacerlo si queremos establecer un corpus central de spam, o incluso para comparar las tasas de filtrado de spam de manera significativa.

Para empezar, el spam no es un correo electrónico comercial no solicitado. Si alguien de mi barrio se enterara de que estoy buscando una vieja Raleigh de tres velocidades en buen estado y me enviara un correo electrónico ofreciéndome vender una, estaría encantado, y sin embargo ese correo electrónico sería comercial y no solicitado. La característica que define al spam (de hecho, su razón de ser ) no es que no sea solicitado, sino que esté automatizado.

También es meramente incidental que el spam sea generalmente comercial. Si alguien empezara a enviar correos electrónicos masivos para apoyar alguna causa política, por ejemplo, sería tan spam como un correo electrónico que promocionara un sitio pornográfico.

Propongo que definamos el spam como correo electrónico automatizado no solicitado . Por lo tanto, esta definición incluye algunos correos electrónicos que muchas definiciones legales de spam no incluyen. Las definiciones legales de spam, influidas presumiblemente 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 de una empresa, por ejemplo, no implica que haya solicitado que le envíen correos electrónicos de forma continua. Si hago un pedido en una tienda en línea y luego me envían un flujo de spam, sigue siendo spam.

Las empresas que envían spam suelen ofrecerle una forma de "darse de baja" o pedirle que vaya a su sitio y cambie las "preferencias de su cuenta" si desea dejar de recibir spam. Esto no es suficiente para evitar que el correo electrónico deje de ser spam. No optar por no recibir no es lo mismo que optar por recibirlo. A menos que el destinatario marque explícitamente una casilla claramente etiquetada (cuya opción predeterminada era "no") solicitando recibir el correo electrónico, entonces se trata de spam.

En algunas relaciones comerciales, se solicita de manera implícita ciertos tipos de correo. Cuando se hace un pedido en línea, creo que se solicita de manera implícita un recibo y una notificación cuando se envía el pedido. No me molesta que Verisign me envíe un correo electrónico advirtiéndome de que un nombre de dominio está a punto de caducar (al menos, si es el registrador real del mismo). Pero cuando Verisign me envía un correo electrónico ofreciéndome una Guía GRATUITA para crear mi sitio web de comercio electrónico, eso es spam.

Notas:

[1] Los ejemplos de este artículo se han traducido a Common Lisp para, aunque parezca increíble, lograr una mayor accesibilidad. La aplicación que se describe aquí es una que escribimos para probar un nuevo dialecto de Lisp llamado Arc que aún no se ha publicado.

[2] Actualmente, la tarifa más baja parece ser de unos 200 dólares por enviar un millón de spam. Es muy barato, 1/50 de centavo por spam. Pero filtrar el 95% del spam, por ejemplo, aumentaría el costo de los spammers para llegar a una audiencia determinada en un factor de 20. Pocos pueden tener márgenes lo suficientemente grandes como para absorber eso.

[3] Como regla general, cuantos más calificativos hay antes del nombre de un país, más corruptos son sus gobernantes. Un país llamado República Democrática Popular Socialista de X es probablemente el último lugar del mundo en el que querrías vivir.

Gracias a Sarah Harlin por leer borradores de este documento; a Daniel Giffin (que también está escribiendo el intérprete de producción de Arc) por varias buenas ideas sobre el filtrado y por crear nuestra infraestructura de correo; a Robert Morris, Trevor Blackwell y Erann Gat por muchas discusiones sobre spam; a Raph Levien por sus consejos sobre métricas de confianza; y a Chip Coldwell y Sam Steingold por sus consejos sobre estadísticas.

Encontrarás este ensayo y otros 14 en [

Hackers y pintores

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

Más información: