Loading...

UN PLAN PARA EL SPAM

Original

Agosto 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. Se describe un algoritmo mejorado en Better Bayesian Filtering.)

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 eludir cualquier otra barrera que les pongas. Al menos hasta ahora. Pero tienen que entregar su mensaje, sea cual 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 contratara a alguien para leer su correo y desechar el spam, tendría poca dificultad en hacerlo. ¿Cuánto tenemos que hacer, aparte de la IA, para automatizar este proceso?

Creo que podremos resolver el problema con algoritmos bastante sencillos. 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 las palabras individuales. Utilizando un filtro bayesiano ligeramente modificado (como se describe a continuación), ahora perdemos menos de 5 de cada 1000 spams, sin falsos positivos.

El enfoque estadístico no suele ser el primero que la gente intenta 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, el descaro de estos tipos al intentar enviarme un correo que comienza con "Estimado amigo" o tiene una línea de asunto todo en mayúsculas y termina con ocho signos de exclamación. Puedo filtrar eso con aproximadamente una línea de código.

Y así lo haces, y al principio funciona. Unas pocas reglas sencillas harán una gran mella en el spam que recibes. Simplemente buscar la palabra "clic" atrapará el 79,7% de los correos electrónicos de 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 uno por ciento de spams se volvía 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 del acné que conlleva el riesgo de muerte para el paciente.

Cuanto más spam reciba un usuario, menos probable será 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 atrapan.

No sé por qué evité probar el enfoque estadístico durante tanto tiempo. Creo que fue porque me enganché a intentar identificar las características del spam yo mismo, como si estuviera jugando a una especie de juego competitivo con los spammers. (Los no hackers a menudo no se dan cuenta de esto, pero la mayoría de los hackers son muy competitivos).

Cuando probé el análisis estadístico, descubrí de inmediato que era mucho más inteligente de lo que había sido yo. Descubrió, por supuesto, que términos como "virtumundo" y "adolescentes" son 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 un indicador de spam tan bueno como cualquier término pornográfico.


Aquí hay un esbozo de cómo hago el filtrado estadístico. Comienzo con un corpus de spam y uno de correo no spam. En este momento, cada uno tiene aproximadamente 4000 mensajes. 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, guiones, apóstrofos y 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, sin siquiera considerarlos como separadores de tokens.

Cuento el número de veces que cada token (ignorando el caso, actualmente) aparece en cada corpus. En esta etapa termino con dos tablas hash grandes, una para cada corpus, que asignan tokens a número 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 un 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 los falsos positivos, y por prueba y error he descubierto que una buena manera de hacerlo es duplicar todos los números en good. Esto ayuda a distinguir entre las palabras que ocasionalmente aparecen en el correo electrónico legítimo y las palabras que casi nunca lo hacen. Solo considero las palabras que aparecen más de cinco veces en total (en realidad, debido a la duplicación, que aparecen tres veces en el 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 en el otro. Nuevamente por prueba y error elegí .01 y .99. Puede haber margen para ajustar esto, pero a medida que crezca el corpus, este ajuste se producirá automáticamente de todos modos.

Los observadores especialmente atentos notarán que, si bien considero que cada corpus es un solo flujo de texto largo a efectos de contar las ocurrencias, uso 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 protegerse contra los falsos positivos.

Cuando llega un correo electrónico nuevo, se escanea en tokens, y los quince tokens más interesantes, donde interesante se mide por lo lejos que están sus probabilidades 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, calculas la probabilidad combinada así:

(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, una vez más por ensayo 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 la aplicación de este algoritmo 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 ponga 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 desmoralizador. Norbert Wiener dijo que si compites con esclavos te conviertes en un esclavo, y hay algo igualmente degradante en competir con los spammers. Para reconocer las características individuales del spam, tienes que tratar de meterte en la mente del spammer, y francamente quiero pasar el menor tiempo 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 lo que es peor, tampoco lo sabe el desarrollador del filtro. ¿Cuántos puntos debería obtener un correo electrónico por tener la palabra "sexo" en él? Una probabilidad, por supuesto, puede estar equivocada, pero hay poca ambigüedad sobre lo que significa o cómo se debe combinar la evidencia para calcularla. Según mi corpus, "sexo" indica una probabilidad de .97 de que el correo electrónico que lo contiene sea un spam, mientras que "sexy" indica una probabilidad de .99. Y la Regla de Bayes, igualmente inequívoca, dice que un correo electrónico que contenga ambas palabras tendría, en ausencia (poco probable) de cualquier otra evidencia, un 99.97% de probabilidad de ser un spam.

Debido a que está midiendo probabilidades, el enfoque bayesiano considera toda la evidencia en el correo electrónico, tanto buena como mala. Las palabras que ocurren de manera desproporcionadamente rara en el spam (como "aunque" o "esta noche" o "aparentemente") contribuyen tanto a disminuir la probabilidad como las malas palabras como "darse de baja" y "optar" a aumentarla. Así que un correo electrónico de lo contrario inocente que casualmente incluya la palabra "sexo" no va a ser etiquetado como spam.

Idealmente, por supuesto, las probabilidades deberían calcularse individualmente para cada usuario. Recibo mucho correo electrónico que contiene la palabra "Lisp", y (hasta ahora) ningún spam que lo haga. Así que una palabra como esa es efectivamente una especie de contraseña para enviar correo a mí. En mi software anterior de filtrado de spam, el usuario podía configurar una lista de esas palabras y el correo que las contenía se pasaría automáticamente a través de los filtros. En mi lista puse palabras como "Lisp" y también mi código postal, para que (de lo contrario más bien con olor a spam) los recibos de pedidos en línea pudieran pasar. Pensé que era muy ingenioso, pero descubrí que el filtro bayesiano hacía lo mismo por mí, e incluso descubrió un montón de palabras que no se me habían ocurrido.

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 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. Esencialmente, cada usuario debería tener dos botones de eliminar, eliminar normal y eliminar como spam. Todo lo que se elimina como spam se incorpora al corpus de spam, y todo lo demás se incorpora 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 a través de los filtros. Si gran parte del cerebro del filtro está en las bases de datos individuales, entonces simplemente ajustar los spams para que pasen a través de los filtros iniciales no garantizará nada sobre qué tan bien pasarán a través de los filtros mucho más entrenados y variables de cada usuario.

El filtrado de spam basado en el 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 construir dicha lista blanca es mantener una lista de cada dirección a la que el usuario haya enviado alguna vez correo. Si un lector de correo tiene un botón de eliminar como spam, también podrías agregar la dirección del remitente de cada correo que el usuario haya eliminado como basura normal.

Soy un defensor 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 de personas que nunca antes habías escuchado, y alguien que te envía un correo por primera vez está limitado por la convención en lo que puede decirte. Alguien que ya conoces podría enviarte un correo electrónico hablando de sexo, pero alguien que te envía un correo por primera vez no es probable que lo haga. 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 del 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 del remitente, por lo que no puedes arriesgarte a tener falsos positivos filtrando el correo de direcciones desconocidas de manera especialmente estricta.

En cierto sentido, sin embargo, mis filtros sí incorporan una especie de lista blanca (y lista negra) porque se basan en mensajes completos, incluidas las cabeceras. Así que en cierta 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 conocen lo mismo sobre el spam, incluidos los nombres de los servidores, las versiones de los programas de correo y los protocolos.


Si pensara que puedo 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 resistente de bichos.

Tengo más esperanzas en los filtros bayesianos, porque evolucionan con el spam. Así que a medida que los spammers comiencen a usar "c0ck" en lugar de "cock" para evadir los filtros de spam 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 con precisión cuánto más.

Aún 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 evitarte? 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 cambiarán a técnicas de "mad-lib" para generar los cuerpos de los mensajes.

Para vencer a los filtros bayesianos, no bastaría con que los spammers hicieran únicos sus correos electrónicos o dejaran de usar palabras malsonantes individuales. Tendrían que hacer que sus correos sean indistinguibles de tu correo normal. Y esto, creo, los limitaría severamente. El spam es en su mayoría ofertas de ventas, por lo que a menos que tu correo normal sean todas ofertas de ventas, los spams inevitablemente tendrán un carácter diferente. Y los spammers también, por supuesto, 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 como para saber qué tan difícil sería hacer que los encabezados parezcan inocentes, pero mi suposición es que sería aún 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 vea algo así:

Hola. Deberías echar un vistazo a lo siguiente: http://www.27meg.com/foo

porque eso es aproximadamente tanto como el filtrado de contenido le dejará al spammer espacio para hacer una oferta de ventas. (De hecho, será difícil incluso hacer que esto pase los filtros, porque si todo lo demás en el correo electrónico es neutral, la probabilidad de spam se basará en la URL, y se requerirá cierto esfuerzo para hacer que parezca neutral).

Los spammers van desde empresas que ejecutan listas llamadas "opt-in" que ni siquiera intentan ocultar sus identidades, hasta tipos que secuestran servidores de correo para enviar spams promocionando sitios de pornografía. Si usamos filtros para reducir sus opciones a correos como el anterior, eso debería sacar del negocio a los spammers del "extremo legítimo" del espectro; se sienten obligados por varias leyes estatales a incluir texto estándar sobre 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 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 las ofertas de ventas que los spammers pueden hacer, inevitablemente tenderás a sacarlos del negocio. Esa palabra negocio es una importante a recordar. Los spammers son hombres de negocios. Envían spam porque funciona. Funciona porque, aunque la tasa de respuesta es abominablemente baja (a lo sumo 15 por millón, frente a 3000 por millón para un 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 gastan un segundo en eliminar el spam, pero el spammer no tiene que pagar eso.

Enviar spam sí le cuesta algo al spammer, sin embargo. [2] Así que cuanto más podamos bajar la tasa de respuesta, ya sea mediante filtros o forzando a los spammers a diluir sus ofertas, menos empresas encontrarán que vale la pena enviar spam.

La razón por la que los spammers usan los tipos de ofertas de ventas que usan es para aumentar las tasas de respuesta. Esto es posiblemente aún 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 asombrosamente crédula o profundamente negada sobre sus intereses sexuales. En cualquier caso, por repulsivo o idiota que parezca el spam para nosotros, es emocionante para ellos. Los spammers no dirían estas cosas si no sonaran emocionantes. Y "deberías echar un vistazo a lo siguiente" simplemente no va a tener ni de cerca el atractivo para el destinatario del spam que los tipos de cosas que los spammers dicen ahora. Resultado: si no puede contener ofertas de ventas emocionantes, el spam se vuelve menos efectivo como vehículo de marketing, y menos empresas quieren usarlo.

Esa es la gran victoria al final. Comencé a escribir software de filtrado de spam porque no quería tener que mirar esa basura más. Pero si nos volvemos lo suficientemente buenos en filtrar el spam, dejará de funcionar, y los spammers realmente 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 cuantos más tipos diferentes de esfuerzos antispam emprendamos, mejor, porque cualquier medida que restrinja a los spammers tenderá a hacer que el filtrado sea más fácil. E incluso dentro del mundo del filtrado basado en contenido, creo que será algo bueno si hay muchos tipos diferentes de software que se usan simultáneamente. Cuantos más filtros diferentes haya, más difícil será para los spammers ajustar los spams para que los pasen.

Apéndice: Ejemplos de Filtrado

Aquí hay un ejemplo de un 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 típico del spam 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 solo las primeras quince vistas.

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 este spam realmente 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 corto" es casi tanta evidencia de inocencia como una palabra como "señora" o "promoción" 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 de .9027.

"Señora" es obviamente de los spams 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 se trata de la proporción.

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

Por otro lado, "entrar" es un error genuino. Aparece principalmente en las instrucciones de cancelación de suscripción, pero aquí se usa de una manera completamente inocente. Afortunadamente, el enfoque estadístico es bastante robusto y puede tolerar una gran cantidad de errores antes de que los resultados comiencen a desviarse.

Para comparar, aquí se encuentra un ejemplo de esa rara ave, un spam que pasa a través de 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í. 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, todas las cinco principales 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 a continuación) bien podría atrapar a este: "rentable", "tarifa de configuración", "reembolso" -- cosas bastante incriminatorias. Y por supuesto, si siguieran enviándome spam (o a una red de la que yo formara parte), el propio "Hostex" sería reconocido como un término de spam.

Finalmente, aquí se encuentra 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 que huelen mal, "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 contrarrestar palabras obviamente inocentes como "continuación" y "ejemplo".

Es interesante que "describir" se califique como tan completamente inocente. No ha aparecido en ni uno solo de mis 4000 spams. Los datos resultan estar llenos de sorpresas de este tipo. Una de las cosas que aprendes cuando analizas los textos de spam es lo estrecho que 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 de tríadas, 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 .96. Si basaras las probabilidades en pares de palabras, terminarías con "ofertas especiales" y "ofertas valiosas" con probabilidades de .99 y, digamos, "enfoque de ofertas" (como en "este enfoque ofrece") con una probabilidad de .1 o menos.

La razón por la que no he hecho esto 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 efecto un generador de texto de Markov en funcionamiento inverso).

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. Pueden considerarse en este algoritmo tratándolas como palabras virtuales. Probablemente haré esto en versiones futuras, al menos para un puñado de los indicadores de spam más flagrantes.

Reconocer las características de los correos electrónicos no spam puede ser más importante que reconocer las características del 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 los 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 mejor que un sistema de respaldo no se base en la misma tecnología que el sistema principal).

Otra cosa que puedo intentar en el futuro es prestar más atención a partes específicas del correo electrónico. Por ejemplo, aproximadamente el 95% del spam actual incluye la URL de un sitio web al 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 unos pocos casos que compres una determinada acción). La URL es en tales casos 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 en un correo electrónico (que no es en alemán) en que a menudo consisten en varias palabras pegadas. 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, un signo extremadamente incriminatorio, excepto en el correo de algunos administradores de sistemas).

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 mirar el sitio web antes de que el usuario mirara el correo electrónico que lo menciona. Podrías usar un filtro bayesiano para calificar el sitio web al igual que lo harías con un correo electrónico, y lo que se encontrara en el sitio web podría incluirse en el cálculo de la probabilidad de que el correo electrónico sea un spam. Una URL que condujera a un redireccionamiento 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 realmente el corpus como entrada. Pero tal corpus también sería útil para otros tipos de filtros, porque se podría usar para probarlos.

La creación de dicho 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 la información personal (no solo las direcciones de correo electrónico y los CC, sino también, por ejemplo, los argumentos de las URL de cancelación de suscripción, que a menudo codifican la dirección de correo electrónico) 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 aproximado sobre lo que 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 comparar las tasas de filtrado de spam de manera significativa.

Para empezar, el spam no es correo electrónico comercial no solicitado. Si alguien de mi vecindario se enterara de que estoy buscando una antigua Raleigh de tres velocidades en buen estado y me enviara un correo electrónico ofreciéndome venderme una, me encantaría, y sin embargo este correo electrónico sería tanto comercial como no solicitado. La característica definitoria del spam (de hecho, su raison d'etre) no es que no se haya solicitado, sino que se haya automatizado.

También es meramente incidental que el spam suele ser comercial. Si alguien comenzara a enviar correos electrónicos masivos para apoyar alguna causa política, por ejemplo, sería tan spam como el correo electrónico que promueve un sitio web de pornografía.

Propongo que definamos el spam como correo electrónico no solicitado y automatizado. Esta definición incluye así 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 un correo electrónico continuo de ellos. Si hago un pedido en una tienda en línea y luego me envían una serie de spam, sigue siendo spam.

Las empresas que envían spam a menudo le dan una forma de "darse de baja" o le piden que vaya a su sitio web y cambie sus "preferencias de cuenta" si quiere dejar de recibir spam. Esto no es suficiente para detener el correo electrónico que se considera spam. No darse de baja no es lo mismo que suscribirse. A menos que el destinatario haya marcado explícitamente una casilla claramente etiquetada (cuyo valor predeterminado fuera no) solicitando recibir el correo electrónico, entonces se trata de spam.

En algunas relaciones comerciales, se solicita implícitamente ciertos tipos de correo electrónico. Cuando haces un pedido en línea, creo que implícitamente solicitas un recibo y una notificación cuando se envíe el pedido. No me importa cuando Verisign me envía un correo electrónico avisándome de que un nombre de dominio está a punto de expirar (al menos, si son el registrador real del mismo). Pero cuando Verisign me envía un correo electrónico ofreciéndome una GUÍA GRATUITA para Construir mi Sitio Web de Comercio Electrónico, eso es spam.

Notas:

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

[2] Actualmente la tasa más baja parece ser de aproximadamente $200 para enviar un millón de spam. Eso 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 calificadores haya antes del nombre de un país, más corrupto será el gobierno. Un país llamado La República Democrática Popular Socialista de X probablemente sea el último lugar del mundo donde querrías vivir.

Gracias a Sarah Harlin por leer borradores de este; Daniel Giffin (quien también está escribiendo el intérprete de producción 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 spam; 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: