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 basado en la 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. Hasta ahora, al menos. Pero tienen que entregar su mensaje, sea cual sea. Si podemos escribir software que reconozca sus mensajes, no hay forma de que puedan eludir eso.


Para el destinatario, el spam es fácilmente reconocible. Si contrataras a alguien para leer tu correo y descartar el spam, tendría poco problema en hacerlo. ¿Cuánto tenemos que hacer, a falta de IA, para automatizar este proceso?

Creo que podremos resolver el problema con algoritmos bastante simples. De hecho, he encontrado que puedes filtrar el spam actual de manera aceptable utilizando nada más que una combinación bayesiana de las probabilidades de spam de palabras individuales. Usando un filtro bayesiano ligeramente ajustado (como se describe a continuación), ahora perdemos menos de 5 por cada 1000 spams, con 0 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 propiedades individuales del spam. Miras los spams y piensas, la osadía de estos tipos al intentar enviarme un correo que comienza con "Estimado Amigo" o tiene un asunto que está en mayúsculas y termina en ocho signos de exclamación. Puedo filtrar esas cosas con aproximadamente 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 "clic" atrapará el 79.7% de los correos en mi corpus de spam, con solo un 1.2% de falsos positivos.

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

Los falsos positivos son correos inocentes que se identifican erróneamente como spam. Para la mayoría de los usuarios, perder un correo legítimo es un orden de magnitud peor que recibir spam, por lo que un filtro que produce falsos positivos es como un tratamiento para el acné que conlleva un riesgo de muerte para el paciente.

Cuanto más spam recibe un usuario, menos probable será que note un correo inocente sentado en su carpeta de spam. Y curiosamente, cuanto mejor se vuelven 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é intentar el enfoque estadístico durante tanto tiempo. Creo que fue porque me volví adicto a intentar identificar características del spam yo mismo, como si estuviera jugando algún tipo de juego competitivo con los spammers. (Los no hackers no suelen darse cuenta de esto, pero la mayoría de los hackers son muy competitivos.) Cuando finalmente intenté el análisis estadístico, descubrí de inmediato 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í 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 alrededor de 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óstrofes y signos de dólar son parte de los tokens, y todo lo demás es un separador de tokens. (Probablemente hay margen de mejora aquí.) Ignoro los tokens que son solo dígitos, y también ignoro los comentarios html, ni siquiera considerándolos como separadores de tokens.

Cuento el número de veces que cada token (ignorando mayúsculas y minúsculas, actualmente) ocurre en cada corpus. En esta etapa, termino con dos grandes tablas hash, una para cada corpus, mapeando tokens al número de ocurrencias.

A continuación, creo una tercera tabla hash, esta vez mapeando cada token a la probabilidad de que un correo 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.

Lo expliqué como código para mostrar un par de detalles importantes. Quiero sesgar las probabilidades ligeramente para evitar falsos positivos, y mediante prueba y error he encontrado que una buena forma de hacerlo es duplicar todos los números en good. Esto ayuda a distinguir entre palabras que ocasionalmente ocurren en correos legítimos y palabras que casi nunca lo hacen. Solo considero palabras que ocurren más de cinco veces en total (de hecho, debido a la duplicación, ocurrir tres veces en correo no spam sería suficiente). Y luego está la cuestión de qué probabilidad asignar a palabras que ocurren en un corpus pero no en el otro. Nuevamente, mediante prueba y error elegí .01 y .99. Puede haber margen para ajustar aquí, pero a medida que el corpus crece, tal ajuste sucederá automáticamente de todos modos.

Los observadores especialmente atentos notarán que, aunque considero que cada corpus es un solo flujo largo de texto a efectos de contar ocurrencias, utilizo el número de correos en cada uno, en lugar de su longitud combinada, como el divisor al calcular las probabilidades de spam. Esto añade otro ligero sesgo para proteger contra falsos positivos.

Cuando llega nuevo correo, se escanea en tokens, y los quince tokens más interesantes, donde interesante se mide por cuán 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, 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 encontrado, nuevamente mediante 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 aplicados 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 un poco desmoralizante. Norbert Wiener dijo que si compites con esclavos te conviertes en un esclavo, y hay algo igualmente degradante en competir con spammers. Para reconocer características individuales del spam tienes que intentar 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 que reconocen características como SpamAssassin asignan un "puntaje" de spam al correo electrónico. El enfoque bayesiano asigna una probabilidad real. El problema con un "puntaje" es que nadie sabe lo que significa. El usuario no sabe lo que significa, pero peor aún, el desarrollador del filtro tampoco. ¿Cuántos puntos debería obtener un correo electrónico por tener la palabra "sexo" en él? Una probabilidad puede, por supuesto, ser errónea, 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 que lo contiene sea spam, mientras que "sexy" indica una probabilidad de .99. Y la Regla de Bayes, igualmente inequívoca, dice que un correo que contenga ambas palabras tendría, en la (poco probable) ausencia de cualquier otra evidencia, un 99.97% de probabilidad de ser spam.

Debido a que mide probabilidades, el enfoque bayesiano considera toda la evidencia en el correo, 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 malas palabras como "cancelar suscripción" y "optar por" a aumentarla. Así que un correo inocente que incluye la palabra "sexo" no será etiquetado como spam.

Idealmente, por supuesto, las probabilidades deberían calcularse individualmente para cada usuario. Recibo mucho correo 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 tales palabras y el correo que las contenía pasaría 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 sonaron bastante spam) de pedidos en línea pudieran pasar. Pensé que era muy ingenioso, pero descubrí que el filtro bayesiano hacía lo mismo por mí, y además descubría muchas palabras que no había pensado.

Cuando dije al principio que nuestros filtros dejan pasar menos de 5 spams por 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 basado en el spam y el correo no spam que recibe. Esencialmente, cada usuario debería tener dos botones de eliminar, eliminar ordinario y eliminar como spam. Cualquier cosa eliminada 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 semilla, 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, dificulta que los spammers ajusten los correos para pasar los filtros. Si gran parte del cerebro del filtro está en las bases de datos individuales, entonces simplemente ajustar los spams para pasar los filtros semilla no garantizará nada sobre qué tan bien pasarán los filtros de los usuarios individuales, 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 puede ser aceptado sin filtrado. Una forma fácil de construir tal lista blanca es mantener una lista de cada dirección a la que el usuario ha enviado correo. Si un lector de correo tiene un botón de eliminar como spam, entonces también podrías agregar la dirección de cada correo electrónico que el usuario ha eliminado como basura ordinaria.

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 harían que el filtrado fuera más fácil, porque solo tendrías que filtrar correos de personas de las que nunca has oído hablar, y alguien que te envía correo por primera vez está limitado por convención en lo que puede decirte. Alguien que ya conoces podría enviarte un correo 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, así que no puedes arriesgar falsos positivos filtrando correos de direcciones desconocidas de manera especialmente estricta.

En cierto sentido, sin embargo, mis filtros sí incorporan una especie de lista blanca (y negra) porque se basan en mensajes enteros, incluidos los encabezados. Así que en ese sentido "saben" 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, versiones de los mailers y protocolos.


Si pensara que podría mantener las tasas actuales de filtrado de spam, consideraría este problema resuelto. Pero no significa mucho poder filtrar la mayoría del spam actual, porque 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 insectos.

Soy más optimista sobre 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 filtros de spam simples basados en palabras individuales, los filtros bayesianos lo notan automáticamente. De hecho, "c0ck" es 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 el filtrado de spam tiene que poder responder a la pregunta: si los spammers supieran exactamente lo que estás haciendo, ¿qué tan bien podrían eludirte? Por ejemplo, creo que si el filtrado de spam basado en sumas de verificación 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 que los spammers hicieran que sus correos electrónicos fueran únicos o que dejaran de usar palabras traviesas individuales. Tendrían que hacer que sus correos fueran indistinguibles de tu correo ordinario. Y esto creo que los restringiría severamente. El spam es principalmente propuestas de venta, así que a menos que tu correo regular sea todo propuestas de venta, 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 se vean inocentes, pero mi suposición es que sería aún más difícil que hacer que el mensaje se vea inocente.

Suponiendo que pudieran resolver el problema de los encabezados, el spam del futuro probablemente se verá algo así:

Hola. Pensé que deberías revisar lo siguiente: http://www.27meg.com/foo

porque eso es aproximadamente tanto como la propuesta de venta que el filtrado basado en contenido dejará al spammer. (De hecho, será difícil incluso pasar esto por los filtros, porque si todo lo demás en el correo es neutral, la probabilidad de spam dependerá de la url, y tomará un esfuerzo hacer que eso se vea neutral).

Los spammers van desde empresas que ejecutan listas de "opt-in" que ni siquiera intentan ocultar sus identidades, hasta tipos que secuestran servidores de correo para enviar spams promoviendo sitios pornográficos. Si usamos el filtrado para reducir sus opciones a correos como el anterior, eso debería prácticamente sacar a los spammers del extremo "legítimo" del espectro; se sienten obligados por varias leyes estatales a incluir un 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, aunque 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 de todo el espectro, si restringes las propuestas de venta 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 (en el mejor de los casos 15 por millón, frente a 3000 por millón para un envío de catálogo), el costo, para ellos, es prácticamente nada. El costo es enorme para los destinatarios, alrededor de 5 semanas-hombre por cada millón de destinatarios que pasan un segundo para eliminar el spam, pero el spammer no tiene que pagar eso.

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

La razón por la que los spammers utilizan los tipos de propuestas de venta que hacen es para aumentar las tasas de respuesta. Esto es posiblemente incluso más repugnante que meterse en la mente de un spammer, pero echemos un vistazo rápido dentro de la mente de alguien que responde a un spam. Esta persona es o asombrosamente crédula o está profundamente en negación sobre sus intereses sexuales. En cualquier caso, repulsivo o idiota como el spam nos parece a nosotros, es emocionante para ellos. Los spammers no dirían estas cosas si no sonaran emocionantes. Y "pensé que deberías revisar lo siguiente" simplemente no tendrá casi el mismo atractivo para el destinatario de spam que los tipos de cosas que los spammers dicen ahora. Resultado: si no puede contener propuestas de venta 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 esas cosas más. Pero si nos volvemos lo suficientemente buenos en filtrar spam, dejará de funcionar, y los spammers realmente dejarán de enviarlo.


De todos los enfoques para combatir el spam, desde software hasta leyes, creo que el filtrado bayesiano será el más efectivo. Pero también creo que cuantas más diferentes clases 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á algo bueno si hay muchos tipos diferentes de software siendo utilizados simultáneamente. Cuantos más filtros diferentes haya, más difícil será para los spammers ajustar los spams para que pasen a través de ellos.

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 en este spam son:

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

Las palabras son una mezcla de cosas 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 vistas.

Desafortunadamente, eso convierte este correo electrónico en un ejemplo aburrido del uso de la Regla de Bayes. Para ver una variedad interesante de probabilidades, tenemos que mirar esto que es un spam en realidad bastante atípico.

Las quince palabras más interesantes en 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" lo 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" proviene obviamente de spams que comienzan con "Estimado Señor o Señora". No son muy comunes, pero la palabra "madam" nunca ocurre en mi correo legítimo, y se trata de la proporción.

"Republic" tiene una puntuación alta porque a menudo aparece en correos electrónicos de estafa nigeriana, y también ocurre 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 encontrado al examinar las probabilidades de spam que hay muchos de estos accidentes, y tienen una tendencia inquietante 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 "Republic" ocurra en correos electrónicos de estafa nigeriana y este spam. Hay toda una clase de propuestas comerciales dudosas que involucran países menos desarrollados, y estas a su vez son más propensas a tener nombres que especifican explícitamente (porque no lo son) que son repúblicas.[3]

Por otro lado, "enter" es un error genuino. Ocurre principalmente en 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 bastante cantidad de errores antes de que los resultados comiencen a verse afectados.

Para comparación, aquí hay un ejemplo de esa rara ave, un spam que pasa los filtros. ¿Por qué? Porque por pura casualidad está cargado de palabras que ocurren en mi correo real:


perl 0.01 python 0.01 tcl 0.01 scripting 0.01 morris 0.01 graham 0.01491078 guarantee 0.9762507 cgi 0.9734398 paul 0.027040077 quite 0.030676773 pop3
0.042199217 various 0.06080265 prices 0.9359873 managed 0.06451222 difficult 0.071706355

Hay un par de buenas noticias aquí. 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, todas las cinco palabras principales aquí serían neutrales y no contribuirían a la probabilidad de spam.

En segundo lugar, creo que el filtrado basado en pares de palabras (ver más abajo) podría atrapar este: "costo efectivo", "tarifa de configuración", "devolución de dinero" -- cosas bastante incriminatorias. Y, por supuesto, si continuaran enviándome spam (o a una red de la que formara parte), "Hostex" en sí mismo sería reconocido como un término de spam.

Finalmente, aquí hay un correo inocente. Sus quince palabras más interesantes son las siguientes:


continuation 0.01 describe 0.01 continuations 0.01 example 0.033600237 programming 0.05214485 i'm 0.055427782 examples 0.07972858 color 0.9189189
localhost 0.09883721 hi 0.116539136 california 0.84421706 same 0.15981844 spot 0.1654587 us-ascii 0.16804294 what 0.19212411

La mayoría de las palabras aquí indican que el correo es inocente. Hay dos palabras que huelen mal, "color" (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 "continuation" y "example".

Es interesante que "describe" califique como tan completamente inocente. No ha ocurrido en ninguno de mis 4000 spams. Los datos resultan estar llenos de tales sorpresas. Una de las cosas que aprendes al analizar 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 proporcionar una estimación de probabilidad mucho más aguda. 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" teniendo probabilidades de .99 y, digamos, "ofertas de enfoque" (como en "este enfoque ofrece") teniendo 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 tan 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 encadenamiento de Markov funcionando en reversa).

Características específicas del spam (por ejemplo, no ver la dirección del destinatario en el campo para:) tienen, por supuesto, valor en el reconocimiento de 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. Los filtros de spam que reconocen características son correctos en muchos detalles; lo que les falta es una disciplina general para combinar evidencia.

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

No espero que este segundo nivel de filtrado sea bayesiano. Inevitablemente será no 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. (Es igualmente bueno, de todos modos, si un sistema de respaldo no depende de la misma tecnología que el sistema primario).

Otra cosa que podría intentar en el futuro es centrar la atención extra 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 de correo de EE. UU., o en algunos casos compres una cierta acción). La url en tales casos es prácticamente suficiente por sí sola para determinar si el correo 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 descomponer nombres de dominio se vuelva más importante a medida que los spammers se vean gradualmente obligados a dejar de usar palabras incriminatorias en el texto de sus mensajes. (Una url con una dirección ip es, por supuesto, una señal extremadamente incriminatoria, excepto en el correo de algunos sysadmins).

Podría ser una buena idea tener una lista mantenida cooperativamente de urls promovidas por spammers. Necesitaríamos una métrica de confianza del tipo estudiado por Raph Levien para prevenir 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 boicots.

Otra forma de probar urls dudosas sería enviar un rastreador para mirar el sitio antes de que el usuario mirara el correo electrónico que lo menciona. Podrías usar un filtro bayesiano para calificar el sitio de la misma manera que calificarías un correo electrónico, y lo que se encontrara en el sitio podría incluirse en el cálculo de la probabilidad de que el correo fuera 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 enorme corpus de spam. Un corpus grande y limpio es la clave para hacer 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 podría usarse para probarlos.

Crear tal corpus plantea algunos problemas técnicos. Necesitaríamos métricas de confianza para prevenir envíos maliciosos o incompetentes, por supuesto. También necesitaríamos formas de borrar información personal (no solo direcciones a, y cc, sino también, por ejemplo, los argumentos para urls de cancelación de suscripción, que a menudo codifican la dirección a) de los correos en el corpus. Si alguien quiere asumir este proyecto, sería algo bueno para el mundo.

Apéndice: Definiendo Spam

Creo que hay un consenso aproximado sobre lo que es el spam, pero sería útil tener una definición explícita. Necesitaremos 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 escuchara que estoy buscando un viejo Raleigh de tres velocidades en buen estado, y me enviara un correo electrónico ofreciéndome vender uno, estaría encantado, y sin embargo este correo sería tanto comercial como no solicitado. La característica definitoria del spam (de hecho, su razón de ser) no es que sea no solicitado, sino que es automatizado.

Es meramente incidental, también, que el spam sea generalmente comercial. Si alguien comenzara a enviar correos masivos para apoyar alguna causa política, por ejemplo, sería tanto spam como el correo que promueve un sitio pornográfico.

Propongo que definamos el spam como correo electrónico automatizado no solicitado. Esta definición incluye así algunos correos que muchas definiciones legales de spam no incluyen. Las definiciones legales de spam, influenciadas presumiblemente por cabilderos, 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 hayas solicitado correo electrónico continuo de ellos. Si pido algo de 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 te dan una forma de "cancelar la suscripción", o te piden que vayas a su sitio y cambies tus "preferencias de cuenta" si quieres dejar de recibir spam. Esto no es suficiente para detener el correo de ser spam. No optar por no recibir no es lo mismo que optar por recibir. A menos que el destinatario haya marcado explícitamente una casilla claramente etiquetada (cuyo valor predeterminado era no) pidiendo recibir el correo, entonces es spam.

En algunas relaciones comerciales, efectivamente solicitas implícitamente ciertos tipos de correo. Cuando pides en línea, creo que solicitas implícitamente un recibo y notificación cuando el pedido se envía. No me importa cuando Verisign me envía un correo advirtiendo que un nombre de dominio está a punto de expirar (al menos, si son el registrador real para ello). Pero cuando Verisign me envía un correo electrónico ofreciendo una GUÍA GRATIS para construir mi sitio web de comercio electrónico, eso es spam.

Notas:

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

[2] Actualmente, la tasa más baja parece ser de aproximadamente $200 para enviar un millón de spams. 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 alcanzar una audiencia dada en un factor de 20. Pocos pueden tener márgenes lo suficientemente grandes como para absorber eso.

[3] Como regla general, cuantas más calificaciones haya antes del nombre de un país, más corruptos son los gobernantes. Un país llamado La República Democrática del Pueblo Socialista de X es probablemente el último lugar en el mundo donde querrías vivir.

Gracias a Sarah Harlin por leer borradores de esto; a 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; a Robert Morris, Trevor Blackwell y Erann Gat por muchas discusiones sobre spam; a Raph Levien por consejos sobre métricas de confianza; y a Chip Coldwell y Sam Steingold por consejos sobre estadísticas.

Encontrarás este ensayo y 14 más en [

Hackers & Painters

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