Loading...

UN PLAN PARA EL SPAM

Original

August 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. Un algoritmo mejorado se describe en Mejor filtrado bayesiano.)

Creo que es posible detener el spam, y que los filtros basados en contenido son la forma de hacerlo. El talón de Aquiles de los spammers es su mensaje. Pueden eludir cualquier otra barrera que establezcas. Lo han hecho hasta ahora, al menos. Pero tienen que entregar su mensaje, sea lo que sea. Si podemos escribir software que reconozca sus mensajes, no hay forma de que puedan evitarlo.


Para el destinatario, el spam es fácilmente reconocible. Si contrataste a alguien para que leyera tu correo y descartara el spam, no tendría problemas para hacerlo. ¿Cuánto tenemos que hacer, sin llegar a la IA, para automatizar este proceso?

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

El enfoque estadístico no suele ser el primero que la gente prueba cuando escribe filtros de spam. El primer instinto de la mayoría de los hackers es intentar escribir software que reconozca las propiedades individuales del spam. Miras los spams y piensas, la osadía de estos tipos de intentar enviarme correo que comienza con "Estimado amigo" o tiene una línea de asunto que está toda en mayúsculas y termina con ocho signos de exclamación. Puedo filtrar esa basura con una línea de código.

Y así lo haces, y al principio funciona. Unas pocas reglas simples eliminarán una gran parte de tu spam entrante. Simplemente buscar la palabra "click" capturará el 79.7% de los correos electrónicos en mi corpus de spam, con solo un 1.2% de falsos positivos.

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

Los falsos positivos son correos electrónicos inocentes que se identifican erróneamente como spam. Para la mayoría de los usuarios, perder correo electrónico legítimo es un orden de magnitud peor que recibir spam, por lo que un filtro que produce 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 note un correo inocente en su carpeta de spam. Y curiosamente, cuanto mejores sean tus filtros de spam, más peligrosos se vuelven los falsos positivos, porque cuando los filtros son realmente buenos, los usuarios serán más propensos a ignorar todo lo que capturen.

No sé por qué evité probar el enfoque estadístico durante tanto tiempo. Creo que fue porque me volví adicto a intentar identificar las características del spam yo mismo, como si estuviera jugando algún tipo de juego competitivo con los spammers. (Los no hackers no se dan cuenta a menudo 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 había sido. Descubrió, por supuesto, que términos como "virtumundo" y "adolescentes" eran buenos indicadores de spam. Pero también descubrió que "por" 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.


Aquí tienes un esquema de cómo hago el filtrado estadístico. Empiezo con un corpus de spam y uno de correo no spam. En este momento, cada uno tiene unos 4000 mensajes en él. Escaneo todo el texto, incluidos los encabezados y el html y javascript incrustados, de cada mensaje en cada corpus. Actualmente considero que los caracteres alfanuméricos, los guiones, las apóstrofes 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 aquí). Ignoro los tokens que son todos dígitos, y también ignoro los comentarios html, ni siquiera los considero como separadores de tokens.

Cuento el número de veces que cada token (ignorando la mayúscula, actualmente) aparece en cada corpus. En esta etapa, termino con dos tablas hash grandes, una para cada corpus, que asignan tokens al número de apariciones.

A continuación, creo una tercera tabla hash, esta vez asignando a cada token 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 (< (+ 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 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 prueba y error he encontrado que una buena manera de hacerlo es duplicar todos los números en good. Esto ayuda a distinguir entre palabras que ocurren ocasionalmente en correos electrónicos legítimos y palabras que casi nunca lo hacen. Solo considero palabras que ocurren más de cinco veces en total (en realidad, debido a la duplicación, ocurrir tres veces en el correo no spam sería suficiente). Y luego está la cuestión de qué probabilidad asignar a las palabras que ocurren en un corpus pero no en el otro. De nuevo por prueba y error elegí .01 y .99. Puede haber margen para ajustar aquí, pero a medida que el corpus crece, dicho ajuste se producirá automáticamente de todos modos.

Los especialmente observadores notarán que si bien considero que cada corpus es una sola secuencia larga de texto a efectos de contar ocurrencias, utilizo el número de correos electrónicos en cada uno, en lugar de su longitud combinada, como divisor al calcular las probabilidades de spam. Esto agrega otro ligero sesgo para proteger contra falsos positivos.

Cuando llega un nuevo correo, se escanea en tokens, y los quince tokens más interesantes, donde interesante se mide por qué tan lejos está su probabilidad de spam de un .5 neutral, se utilizan para calcular la probabilidad de que el correo sea spam. Si probs es una lista de las quince probabilidades individuales, 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 aparece en la tabla hash de probabilidad de palabras. He encontrado, de nuevo por prueba y error, que .4 es un buen número para usar. 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 aplicado a 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 importaría mucho dónde pusiera este umbral, porque pocas probabilidades terminan en el medio del rango.


Una gran ventaja del enfoque estadístico es que no tienes que leer tantos spams. En los últimos seis meses, he leído literalmente miles de spams, y es realmente un poco desmoralizante. Norbert Wiener dijo que si compites con esclavos te conviertes en esclavo, y hay algo similarmente 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 lo menos posible dentro de las mentes de los spammers.

Pero la verdadera ventaja del enfoque bayesiano, por supuesto, es que sabes lo que estás midiendo. Los filtros de reconocimiento de características como SpamAssassin asignan una "puntuación" de spam 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 peor aún, tampoco lo sabe el desarrollador del filtro. ¿Cuántos puntos debe obtener un correo electrónico por tener la palabra "sexo" en él? Una probabilidad puede, por supuesto, estar equivocada, pero hay poca ambigüedad sobre lo que significa, o cómo se debe combinar la evidencia para calcularla. Basado en mi corpus, "sexo" indica una probabilidad de .97 de que el correo electrónico que lo contiene sea spam, mientras que "sexy" indica una probabilidad de .99. Y la regla de Bayes, igualmente ambigua, dice que un correo electrónico que contiene ambas palabras tendría, en ausencia (improbable) de cualquier otra evidencia, un 99.97% de posibilidades de ser spam.

Debido a que mide probabilidades, el enfoque bayesiano considera toda la evidencia en el correo electrónico, tanto buena como mala. Las palabras que ocurren desproporcionadamente raramente en el spam (como "aunque" o "esta noche" o "aparentemente") contribuyen tanto a disminuir la probabilidad como las palabras malas como "cancelar suscripción" y "optar por participar" a aumentarla. Por lo tanto, un correo electrónico que de otro modo sería inocente que incluye la palabra "sexo" no se etiquetará como spam.

Idealmente, por supuesto, las probabilidades deben calcularse individualmente para cada usuario. Recibo muchos correos electrónicos que contienen la palabra "Lisp", y (hasta ahora) ningún spam que lo haga. Entonces, una palabra como esa es efectivamente una especie de contraseña para enviarme correo. En mi software de filtrado de spam anterior, el usuario podía configurar una lista de esas palabras y el correo que las contenía pasaba automáticamente los filtros. En mi lista puse palabras como "Lisp" y también mi código postal, para que los recibos (que de otro modo son bastante parecidos al spam) de pedidos en línea pasaran. Pensé que estaba siendo muy inteligente, pero descubrí que el filtro bayesiano hacía lo mismo por mí, y además descubrió muchas palabras en las que no había pensado.

Cuando dije al principio que nuestros filtros dejan pasar menos de 5 spams por cada 1000 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 en función del correo spam y no spam que recibe. Esencialmente, cada usuario debería tener dos botones de eliminar, eliminar normal y eliminar 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.

Podrías comenzar a los usuarios con un filtro inicial, pero en última instancia, cada usuario debería tener sus propias probabilidades por palabra basadas en el correo real que recibe. Esto (a) hace que los filtros sean más efectivos, (b) permite que cada usuario decida su propia definición precisa de spam, y (c) quizás lo mejor de todo, hace que sea difícil para los spammers ajustar los correos para que pasen los filtros. Si gran parte del cerebro del filtro está en las bases de datos individuales, entonces simplemente ajustar los spams para que pasen los filtros iniciales no garantizará nada sobre qué tan bien pasarán los filtros individuales de los usuarios, que son variables y mucho más entrenados.

El filtrado de spam basado en contenido a menudo se combina con una lista blanca, una lista de remitentes cuyo correo se puede aceptar sin filtrar. 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 tiene un botón de eliminar como spam, también puedes agregar la dirección de origen de cada correo electrónico que el usuario ha eliminado como basura normal.

Soy un defensor de las listas blancas, pero más como una forma de ahorrar computación 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 correo por primera vez está limitado por la convención en lo que puede decirte. Alguien que ya conoces puede enviarte un correo electrónico hablando de sexo, pero alguien que te envía correo por primera vez no sería probable que lo hiciera. 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 origen 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 origen, por lo que no puedes arriesgarte a falsos positivos filtrando el correo de direcciones desconocidas con especial rigor.

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


Si pensara que podría mantener las tasas 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 más que crear una nueva cepa de insectos resistente.

Soy más optimista con respecto a los filtros Bayesianos, porque evolucionan con el spam. Así que a medida que los spammers comienzan a usar "c0ck" en lugar de "cock" para evadir los filtros de spam simples basados en palabras individuales, los filtros Bayesianos lo notan automáticamente. De hecho, "c0ck" es una evidencia mucho más condenatoria que "cock", y los filtros Bayesianos saben exactamente cuánto más.

Aún así, cualquiera que proponga un plan para filtrar spam tiene que poder responder a la pregunta: si los spammers supieran exactamente lo que estás haciendo, ¿qué tan bien podrían pasar por encima de ti? Por ejemplo, creo que si el filtrado de spam basado en checksum se convierte en un obstáculo serio, los spammers simplemente cambiarán a técnicas de mad-lib para generar cuerpos de mensajes.

Para vencer a los filtros Bayesianos, no sería suficiente para los spammers hacer que sus correos electrónicos sean únicos o dejar de usar palabras obscenas individuales. Tendrían que hacer que sus correos sean indistinguibles de su correo ordinario. Y creo que esto los restringiría severamente. El spam es principalmente publicidad, por lo que a menos que su correo regular sea todo publicidad, los spams inevitablemente tendrán un carácter diferente. Y los spammers también tendrían 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 utilizan los spammers para saber qué tan difícil sería hacer que los encabezados parezcan inocentes, pero supongo que sería incluso más difícil que hacer que el mensaje parezca inocente.

Suponiendo que pudieran resolver 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 eso es casi tanta publicidad como el filtrado basado en contenido dejará espacio al spammer para hacer. (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 se necesitará algo de esfuerzo para que parezca neutral).

Los spammers van desde empresas que ejecutan las llamadas listas de suscripción voluntaria que ni siquiera intentan ocultar sus identidades, hasta tipos que secuestran servidores de correo para enviar spams que promocionan sitios pornográficos. Si usamos el filtrado para reducir sus opciones a correos como el que se muestra arriba, eso debería poner a los spammers en el extremo "legítimo" del espectro fuera del negocio; se sienten obligados por varias leyes estatales a incluir información 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 las leyes más estrictas pueden no disminuir la cantidad de spam que los spammers envían, ciertamente pueden ayudar a los filtros a disminuir la cantidad de spam que los destinatarios realmente ven).

A lo largo del espectro, si restringes la publicidad que los spammers pueden hacer, inevitablemente tenderás a ponerlos fuera del negocio. Esa palabra negocio es importante de recordar. Los spammers son empresarios. Envían spam porque funciona. Funciona porque aunque la tasa de respuesta es abominablemente baja (como máximo 15 por millón, frente a 3000 por millón para un correo de catálogo), el costo, para ellos, es prácticamente nulo. El costo 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.

Enviar spam sí le cuesta algo al spammer. [2] Entonces, cuanto más bajo podamos obtener la tasa de respuesta, ya sea mediante el filtrado o mediante el uso de filtros para obligar a los spammers a diluir sus mensajes, menos empresas considerarán que vale la pena enviar spam.

La razón por la que los spammers utilizan el tipo de publicidad 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 echemos un vistazo rápido a la mente de alguien que responde a un spam. Esta persona es o increíblemente crédula o está profundamente en negación sobre sus intereses sexuales. En cualquier caso, por repulsivo o idiota que nos parezca el spam, es emocionante para ellos. Los spammers no dirían estas cosas si no sonaran emocionantes. Y "pensé que deberías echar un vistazo a lo siguiente" simplemente no tendrá el mismo atractivo para el destinatario del spam que el tipo de cosas que dicen los spammers ahora. Resultado: si no puede contener publicidad emocionante, el spam se vuelve menos efectivo 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 esa basura más. Pero si somos lo suficientemente buenos filtrando el 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 efectivo. Pero también creo que cuanto más diferentes tipos de esfuerzos antispam emprendamos, mejor, porque cualquier medida que restrinja a los spammers tenderá a facilitar el filtrado. E incluso dentro del mundo del filtrado basado en contenido, creo que será bueno si hay muchos tipos diferentes de software que se utilizan simultáneamente. Cuanto más diferentes filtros haya, más difícil será para los spammers ajustar los spams para que los atraviesen.

Apéndice: Ejemplos de filtrado

Aquí es un ejemplo de spam que llegó mientras escribía este artículo. Las quince palabras más interesantes de 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 de los encabezados y del cuerpo del mensaje, lo cual 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 .99. De hecho, hay más de quince palabras con probabilidades de .99, y estas son solo las primeras quince que se ven.

Desafortunadamente, eso hace que este correo electrónico sea un ejemplo aburrido del uso de la regla de Bayes. Para ver una variedad interesante de probabilidades, tenemos que mirar esto spam en realidad 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 "shortest" es casi tanta evidencia de inocencia como una palabra como "madam" o "promotion" es de culpabilidad. Pero aún así, el caso de culpabilidad es más fuerte. Si combinas estos números de acuerdo con la regla de Bayes, la probabilidad resultante es .9027.

"Madam" es obviamente de spams que comienzan "Estimado señor o señora". No son muy comunes, pero la palabra "madam" nunca aparece en mi correo electrónico legítimo, y todo se trata de la proporción.

"Republic" obtiene una puntuación alta porque a menudo aparece en correos electrónicos de estafas nigerianas, y también aparece una o dos veces en spams que se refieren a Corea y Sudáfrica. Tú podrías decir que es un accidente que así ayude a identificar este spam. Pero he descubierto al examinar las probabilidades de spam que hay muchos de estos accidentes, y tienen una tendencia extraña a empujar las cosas en la dirección correcta en lugar de en la incorrecta. En este caso, no es del todo una coincidencia que la palabra "Republic" aparezca en correos electrónicos de estafas nigerianas y este spam. Hay toda una clase de dudosas propuestas comerciales que involucran países menos desarrollados y estos, a su vez, tienen más probabilidades de tener nombres que especifiquen explícitamente (porque no lo son) que son repúblicas.[3]

Por otro lado, "enter" es un error genuino. Aparece principalmente en las instrucciones para darse de baja, pero aquí se utiliza de una manera completamente inocente. Afortunadamente, el enfoque estadístico es bastante robusto y puede tolerar bastantes errores antes de que los resultados empiecen a verse afectados.

Para comparar, aquí es un ejemplo de esa rara ave, un spam que pasa los filtros. ¿Por qué? Porque por pura casualidad resulta estar 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 aquí. Primero, este correo probablemente no pasaría los filtros de alguien que no se especializa en lenguajes de programación y tiene un buen amigo llamado Morris. Para el usuario promedio, las cinco palabras principales aquí serían neutrales y no contribuirían a la probabilidad de spam.

Segundo, creo que filtrar en función de pares de palabras (ver más abajo) bien podría atrapar este: "costo efectivo", "cuota de configuración", "dinero de vuelta" - bastante incriminatorio cosas. Y, por supuesto, si continuaran enviándome spam (o a una red de la que yo fuera parte), "Hostex" en sí mismo sería reconocido como un término de spam.

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

Es interesante que "describir" se clasifique como tan completamente inocente. No ha aparecido en ninguno de mis 4000 spams. Los datos resultan estar llenos de tales sorpresas. Una de las cosas que aprendes cuando analizas textos de spam es cuán estrecho es el 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 triples, en lugar de palabras individuales. Esto debería producir una estimación mucho más precisa de la probabilidad. Por ejemplo, en mi base de datos actual, la palabra "ofrece" 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 de enfoque" (como en "este enfoque ofrece") con una probabilidad de .1 o menos.

La razón por la que no he hecho esto es que filtrar en función de palabras individuales ya funciona tan bien. Pero sí significa que hay espacio 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 efecto un generador de texto de encadenamiento de Markov que se ejecuta en reversa).

Las características específicas del spam (por ejemplo, no ver la dirección del destinatario en el campo para: ) por supuesto tienen valor para reconocer el spam. Se pueden considerar en este algoritmo tratándolos 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 spam que reconocen características tienen razón en muchos detalles; lo que les falta es una disciplina general para combinar evidencia.

Reconocer características no spam puede ser más importante que reconocer características spam. Los falsos positivos son una preocupación tan grande que exigen medidas extraordinarias. Probablemente en versiones futuras agregue un segundo nivel de pruebas diseñado específicamente para evitar falsos positivos. Si un correo electrónico activa este segundo nivel de filtros, se aceptará incluso si su probabilidad de spam está por encima del umbral.

No espero que este segundo nivel de filtrado sea bayesiano. Inevitablemente será no solo ad hoc, sino basado en conjeturas, porque el número de falsos positivos no tenderá a ser lo suficientemente grande como para notar patrones. (De todos modos, es bueno que un sistema de respaldo no dependa de la misma tecnología que el sistema principal).

Otra cosa que puedo intentar en el futuro es centrar la atención adicional en partes específicas del correo electrónico. Por ejemplo, alrededor del 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 postal de EE. UU., o en algunos casos que compres una determinada acción). La URL en tales casos es prácticamente suficiente por sí sola para determinar si el correo electrónico es spam.

Los nombres de dominio difieren del resto del texto en un correo electrónico (no alemán) en que a menudo consisten en varias palabras unidas. Aunque computacionalmente costoso en el caso general, podría valer la pena intentar descomponerlos. Si un filtro nunca ha visto el token "xxxporn" antes, 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 la descomposición de los nombres de dominio se vuelva más importante a medida que los spammers se vean obligados gradualmente 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 extremadamente incriminatoria, excepto en el correo de algunos administradores del sistema).

Podría ser una buena idea tener una lista mantenida de forma cooperativa de URL promocionadas por 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í, proporcionaría un impulso a cualquier software de filtrado. También sería una base conveniente para los boicots.

Otra forma de probar URL dudosas sería enviar un rastreador para que mire el sitio antes de que el usuario mire el correo electrónico que lo menciona. Podrías usar un filtro bayesiano para calificar el sitio de la misma manera que lo harías con un correo electrónico, y cualquier cosa que se encontrara en el sitio podría incluirse en el cálculo de la probabilidad de que el correo electrónico sea spam. Una URL que condujera a una redirección sería, por supuesto, especialmente sospechosa.

Un proyecto cooperativo que creo que realmente 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 usar el corpus como entrada. Pero tal corpus sería útil para otros tipos de filtros también, porque podría usarse para probarlos.

La creación de tal corpus 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 CC, 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 en el corpus. Si alguien quiere asumir 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 hacer esto 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 correo electrónico comercial no solicitado. Si alguien en mi vecindario se enterara de que estaba buscando una vieja Raleigh de tres velocidades en buen estado, y me enviara un correo electrónico ofreciéndome venderme una, estaría encantado, y sin embargo este correo electrónico sería comercial y no solicitado. La característica definitoria del spam (de hecho, su raison d'etre) no es que no sea solicitado, sino que es automatizado.

También es simplemente incidental que el spam sea generalmente comercial. Si alguien comenzara a enviar correo electrónico masivo para apoyar alguna causa política, por ejemplo, sería tanto spam como el correo electrónico que promociona un sitio pornográfico.

Propongo que definamos el spam como correo electrónico automatizado no solicitado. Esta definición incluye, por lo tanto, algunos correos electrónicos que muchas definiciones legales de spam no incluyen. Las definiciones legales de spam, influenciadas 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 a una empresa, por ejemplo, no implica que hayas solicitado correos electrónicos continuos de ellos. Si pido algo en una tienda en línea, y luego me envían un flujo de spam, sigue siendo spam.

Las empresas que envían spam a menudo te dan una forma de "cancelar la suscripción", o te piden que visites su sitio y cambies tus "preferencias de cuenta" si quieres dejar de recibir spam. Esto no es suficiente para evitar que el correo sea spam. No optar por no participar no es lo mismo que optar por participar. A menos que el destinatario haya marcado explícitamente una casilla claramente etiquetada (cuyo valor predeterminado era no) pidiendo recibir el correo electrónico, entonces es spam.

En algunas relaciones comerciales, se solicita implícitamente ciertos tipos de correo. Cuando se ordena en línea, creo que se solicita implícitamente un recibo y notificación cuando el pedido se envía. No me importa cuando Verisign me envía correo electrónico advirtiéndome que un nombre de dominio está a punto de expirar (al menos, si ellos son el registrador real para él). Pero cuando Verisign me envía correo electrónico ofreciendo una GUÍA GRATUITA para Construir mi sitio web de comercio electrónico, eso es correo no deseado.

Notas:

[1] Los ejemplos en este artículo se traducen a Common Lisp para, créanlo o no, una mayor accesibilidad. La aplicación que se describe aquí es una que escribimos para probar un nuevo dialecto Lisp llamado Arc que aún no se ha lanzado.

[2] Actualmente, la tarifa más baja parece ser de alrededor de $ 200 para enviar un millón de correos no deseados. Eso es muy barato, 1/50 de centavo por correo no deseado. Pero filtrar el 95% del correo no deseado, 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 calificadores haya antes del nombre de un país, más corruptos son los 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 los borradores de esto; Daniel Giffin (quien también está escribiendo el intérprete de producción de Arc) por varias buenas ideas sobre filtrado y por crear nuestra infraestructura de correo; Robert Morris, Trevor Blackwell y Erann Gat por muchas discusiones sobre correo no deseado; Raph Levien por consejos sobre métricas de confianza; y Chip Coldwell y Sam Steingold por consejos sobre estadísticas.

Encontrarás este ensayo y otros 14 en [

Hackers & Painters

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

Más información: