Loading...

UN PLAN CONTRE LE SPAM

Original

Août 2002

(Cet article décrit les techniques de filtrage anti-spam utilisées dans le lecteur de courrier web anti-spam que nous avons construit pour exercer Arc. Un algorithme amélioré est décrit dans Better Bayesian Filtering.)

Je pense qu'il est possible d'arrêter le spam, et que les filtres basés sur le contenu sont la façon de le faire. Le talon d'Achille des spammeurs est leur message. Ils peuvent contourner n'importe quelle autre barrière que vous mettez en place. Ils l'ont fait jusqu'à présent, du moins. Mais ils doivent livrer leur message, quel qu'il soit. Si nous pouvons écrire un logiciel qui reconnaît leurs messages, il n'y a aucun moyen pour eux de s'en sortir.


Pour le destinataire, le spam est facilement reconnaissable. Si vous engagiez quelqu'un pour lire votre courrier et jeter le spam, il aurait peu de mal à le faire. Que devons-nous faire, en deçà de l'IA, pour automatiser ce processus ?

Je pense que nous pourrons résoudre le problème avec des algorithmes assez simples. En fait, j'ai constaté que l'on peut filtrer le spam actuel de manière acceptable en utilisant rien de plus qu'une combinaison bayésienne des probabilités de spam des mots individuels. En utilisant un filtre bayésien légèrement modifié (comme décrit ci-dessous), nous manquons maintenant moins de 5 spams sur 1000, sans faux positifs.

L'approche statistique n'est généralement pas la première que les gens essaient lorsqu'ils écrivent des filtres anti-spam. La première réaction de la plupart des hackers est d'essayer d'écrire un logiciel qui reconnaît les propriétés individuelles du spam. Vous regardez les spams et vous vous dites, l'audace de ces types d'essayer de m'envoyer un courrier qui commence par "Cher ami" ou a une ligne d'objet tout en majuscules et se termine par huit points d'exclamation. Je peux filtrer tout ça avec à peu près une ligne de code.

Et c'est ce que vous faites, et au début, ça fonctionne. Quelques règles simples vont faire une grosse entaille dans votre spam entrant. Simplement rechercher le mot "cliquez" permettra de capturer 79,7% des e-mails de mon corpus de spam, avec seulement 1,2% de faux positifs.

J'ai passé environ six mois à écrire un logiciel qui recherchait les caractéristiques individuelles du spam avant d'essayer l'approche statistique. Ce que j'ai constaté, c'est que reconnaître les derniers pour cent de spams devenait très difficile, et qu'en rendant les filtres plus stricts, j'obtenais plus de faux positifs.

Les faux positifs sont des e-mails innocents qui sont identifiés par erreur comme du spam. Pour la plupart des utilisateurs, manquer un e-mail légitime est un ordre de grandeur pire que de recevoir du spam, donc un filtre qui produit des faux positifs est comme une cure contre l'acné qui comporte un risque de mort pour le patient.

Plus un utilisateur reçoit de spam, moins il est susceptible de remarquer un e-mail innocent dans son dossier de spam. Et étrangement, plus vos filtres anti-spam sont efficaces, plus les faux positifs deviennent dangereux, car lorsque les filtres sont vraiment bons, les utilisateurs seront plus susceptibles d'ignorer tout ce qu'ils attrapent.

Je ne sais pas pourquoi j'ai évité d'essayer l'approche statistique pendant si longtemps. Je pense que c'est parce que je me suis accroché à essayer d'identifier moi-même les caractéristiques du spam, comme si je jouais à une sorte de jeu compétitif avec les spammeurs. (Les non-hackers ne réalisent pas souvent cela, mais la plupart des hackers sont très compétitifs.) Quand j'ai essayé l'analyse statistique, j'ai immédiatement constaté qu'elle était beaucoup plus intelligente que ce que j'avais fait. Bien sûr, elle a découvert que des termes comme "virtumundo" et "teens" étaient de bons indicateurs de spam. Mais elle a aussi découvert que "per" et "FL" et "ff0000" sont de bons indicateurs de spam. En fait, "ff0000" (html pour rouge vif) s'avère être un aussi bon indicateur de spam que n'importe quel terme pornographique.


Voici un aperçu de la façon dont je fais le filtrage statistique. Je commence avec un corpus de spam et un de courriers non spam. À l'heure actuelle, chacun en compte environ 4000 messages. Je scanne le texte complet, y compris les en-têtes et le HTML et JavaScript intégrés, de chaque message de chaque corpus. Je considère actuellement les caractères alphanumériques, les tirets, les apostrophes et les signes dollar comme faisant partie des jetons, et tout le reste comme un séparateur de jetons. (Il y a probablement de la place pour l'amélioration ici.) J'ignore les jetons qui sont tous des chiffres, et j'ignore également les commentaires HTML, ne les considérant même pas comme des séparateurs de jetons.

Je compte le nombre de fois où chaque jeton (en ignorant la casse, actuellement) apparaît dans chaque corpus. À cette étape, je me retrouve avec deux grandes tables de hachage, une pour chaque corpus, qui mappes les jetons au nombre d'occurrences.

Ensuite, je crée une troisième table de hachage, cette fois en mappant chaque jeton à la probabilité qu'un e-mail le contenant soit un spam, que je calcule comme suit [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)))))))))

où word est le jeton dont nous calculons la probabilité, good et bad sont les tables de hachage que j'ai créées à la première étape, et ngood et nbad sont le nombre de messages non spam et spam respectivement.

J'ai expliqué cela sous forme de code pour montrer quelques détails importants. Je veux légèrement biaiser les probabilités pour éviter les faux positifs, et par essai et erreur, j'ai trouvé qu'une bonne façon de le faire est de doubler tous les nombres dans good. Cela aide à distinguer les mots qui apparaissent occasionnellement dans les e-mails légitimes et les mots qui n'apparaissent presque jamais. Je ne prends en compte que les mots qui apparaissent plus de cinq fois au total (en fait, à cause du doublement, apparaître trois fois dans le courrier non spam serait suffisant). Et puis il y a la question de quelle probabilité attribuer aux mots qui apparaissent dans un corpus mais pas dans l'autre. Là encore, par essai et erreur, j'ai choisi .01 et .99. Il peut y avoir de la place pour un réglage, mais à mesure que le corpus grandit, ce réglage se fera automatiquement de toute façon.

Les observateurs particulièrement attentifs remarqueront que bien que je considère chaque corpus comme un seul long flux de texte aux fins du comptage des occurrences, j'utilise le nombre d'e-mails dans chacun, plutôt que leur longueur combinée, comme diviseur dans le calcul des probabilités de spam. Cela ajoute un autre léger biais pour se protéger contre les faux positifs.

Lorsqu'un nouveau courrier arrive, il est scanné en jetons, et les quinze jetons les plus intéressants, où intéressant est mesuré par la distance de leur probabilité de spam par rapport à une valeur neutre de .5, sont utilisés pour calculer la probabilité que le courrier soit un spam. Si probs est une liste des quinze probabilités individuelles, vous calculez la probabilité combinée ainsi :

(let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs)))))

Une question qui se pose dans la pratique est quelle probabilité attribuer à un mot que vous n'avez jamais vu, c'est-à-dire qui ne figure pas dans la table de hachage des probabilités des mots. J'ai constaté, encore une fois par essai et erreur, que .4 est un bon chiffre à utiliser. Si vous n'avez jamais vu un mot auparavant, il est probablement assez innocent ; les mots de spam ont tendance à être trop familiers.

Il y a des exemples de l'application de cet algorithme à des e-mails réels dans une annexe à la fin.

Je traite le courrier comme du spam si l'algorithme ci-dessus lui attribue une probabilité de plus de .9 d'être du spam. Mais dans la pratique, cela n'aurait pas beaucoup d'importance où je placerais ce seuil, car peu de probabilités finissent au milieu de la fourchette.


Un grand avantage de l'approche statistique est que vous n'avez pas à lire autant de spams. Au cours des six derniers mois, j'ai littéralement lu des milliers de spams, et c'est vraiment un peu démoralisant. Norbert Wiener a dit que si vous vous faites concurrence avec des esclaves, vous devenez un esclave, et il y a quelque chose de similairement dégradant à se faire concurrence avec des spammeurs. Pour reconnaître les caractéristiques individuelles du spam, vous devez essayer de vous mettre dans la peau du spammeur, et franchement, je veux passer le moins de temps possible dans l'esprit des spammeurs.

Mais le véritable avantage de l'approche bayésienne, bien sûr, est que vous savez ce que vous mesurez. Les filtres de reconnaissance de caractéristiques comme SpamAssassin attribuent un "score" de spam aux e-mails. L'approche bayésienne attribue une probabilité réelle. Le problème avec un "score" est que personne ne sait ce que cela signifie. L'utilisateur ne sait pas ce que cela signifie, mais pire encore, le développeur du filtre non plus. Combien de points un e-mail devrait-il obtenir pour avoir le mot "sexe" dedans ? Une probabilité peut bien sûr être erronée, mais il y a peu d'ambiguïté sur ce qu'elle signifie, ou sur la façon dont les preuves doivent être combinées pour la calculer. D'après mon corpus, "sexe" indique une probabilité de .97 que l'e-mail contenant ce mot soit un spam, tandis que "sexy" indique une probabilité de .99. Et la règle de Bayes, tout aussi sans ambiguïté, dit qu'un e-mail contenant les deux mots aurait, en l'absence (peu probable) de toute autre preuve, 99,97% de chances d'être un spam.

Parce qu'elle mesure des probabilités, l'approche bayésienne prend en compte toutes les preuves contenues dans l'e-mail, tant les bonnes que les mauvaises. Les mots qui apparaissent de manière disproportionnée rarement dans le spam (comme "bien que" ou "ce soir" ou "apparemment") contribuent autant à diminuer la probabilité que les mauvais mots comme "se désabonner" et "opt-in" à l'augmenter. Donc un e-mail par ailleurs innocent qui se trouve à inclure le mot "sexe" ne sera pas marqué comme spam.

Idéalement, bien sûr, les probabilités devraient être calculées individuellement pour chaque utilisateur. Je reçois beaucoup d'e-mails contenant le mot "Lisp", et (jusqu'à présent) pas de spam qui le contient. Donc un mot comme celui-là est en quelque sorte un mot de passe pour m'envoyer du courrier. Dans mon ancien logiciel de filtrage anti-spam, l'utilisateur pouvait établir une liste de tels mots et le courrier les contenant passerait automatiquement à travers les filtres. Sur ma liste, j'ai mis des mots comme "Lisp" et aussi mon code postal, afin que (par ailleurs plutôt spammeux) les reçus de commandes en ligne puissent passer. Je me croyais très malin, mais j'ai constaté que le filtre bayésien faisait la même chose pour moi, et a même découvert beaucoup de mots auxquels je n'avais pas pensé.

Quand j'ai dit au début que nos filtres laissent passer moins de 5 spams pour 1000 avec 0 faux positifs, je parle de filtrer mon courrier en me basant sur un corpus de mon courrier. Mais ces chiffres ne sont pas trompeurs, car c'est l'approche que je préconise : filtrer le courrier de chaque utilisateur en fonction du courrier spam et non spam qu'il reçoit. Essentiellement, chaque utilisateur devrait avoir deux boutons de suppression, la suppression ordinaire et la suppression comme spam. Tout ce qui est supprimé comme spam va dans le corpus de spam, et tout le reste va dans le corpus de non-spam.

Vous pourriez commencer les utilisateurs avec un filtre de départ, mais en fin de compte, chaque utilisateur devrait avoir ses propres probabilités par mot basées sur le courrier réel qu'il reçoit. Cela (a) rend les filtres plus efficaces, (b) permet à chaque utilisateur de définir sa propre définition précise du spam, et (c) ce qui est peut-être le mieux, rend difficile pour les spammeurs d'ajuster leurs messages pour passer à travers les filtres. Si une grande partie du "cerveau" du filtre se trouve dans les bases de données individuelles, alors le simple fait d'ajuster les spams pour passer à travers les filtres de départ ne garantira rien sur la façon dont ils passeront à travers les filtres beaucoup plus entraînés et variables de chaque utilisateur.

Le filtrage anti-spam basé sur le contenu est souvent combiné à une liste blanche, une liste d'expéditeurs dont le courrier peut être accepté sans filtrage. Une façon simple de construire une telle liste blanche est de tenir une liste de chaque adresse à laquelle l'utilisateur a déjà envoyé du courrier. Si un lecteur de courrier a un bouton "supprimer comme spam", vous pourriez également ajouter l'adresse d'expédition de chaque e-mail que l'utilisateur a supprimé comme simple poubelle.

Je suis un partisan des listes blanches, mais plus comme un moyen d'économiser des calculs que comme un moyen d'améliorer le filtrage. Je pensais autrefois que les listes blanches faciliteraient le filtrage, car vous n'auriez qu'à filtrer le courrier des personnes dont vous n'aviez jamais entendu parler, et quelqu'un vous envoyant un courrier pour la première fois est contraint par la convention dans ce qu'il peut vous dire. Quelqu'un que vous connaissez déjà pourrait vous envoyer un e-mail parlant de sexe, mais quelqu'un vous envoyant un courrier pour la première fois ne le ferait probablement pas. Le problème est que les gens peuvent avoir plus d'une adresse e-mail, donc une nouvelle adresse d'expédition ne garantit pas que l'expéditeur vous écrit pour la première fois. Il n'est pas rare qu'un vieil ami (surtout s'il est un hacker) vous envoie soudainement un e-mail avec une nouvelle adresse d'expédition, donc vous ne pouvez pas vous permettre de faux positifs en filtrant le courrier des adresses inconnues de manière particulièrement stricte.

Dans un sens, cependant, mes filtres incarnent eux-mêmes une sorte de liste blanche (et de liste noire) car ils sont basés sur des messages entiers, y compris les en-têtes. Donc dans cette mesure, ils "connaissent" les adresses e-mail des expéditeurs de confiance et même les routes par lesquelles le courrier arrive jusqu'à moi. Et ils connaissent la même chose sur le spam, y compris les noms de serveurs, les versions de messagerie et les protocoles.


Si je pensais pouvoir maintenir les taux actuels de filtrage du spam, je considérerais ce problème comme résolu. Mais cela ne veut pas dire grand-chose de pouvoir filtrer la plupart des spams d'aujourd'hui, car le spam évolue. En effet, la plupart des techniques anti-spam jusqu'à présent ont été comme des pesticides qui ne font rien d'autre que créer une nouvelle souche résistante de parasites.

Je suis plus optimiste quant aux filtres bayésiens, car ils évoluent avec le spam. Donc, à mesure que les spammeurs commencent à utiliser "c0ck" au lieu de "cock" pour éviter les filtres anti-spam simplistes basés sur des mots individuels, les filtres bayésiens le remarquent automatiquement. En effet, "c0ck" est une preuve bien plus accablante que "cock", et les filtres bayésiens savent précisément à quel point elle l'est davantage.

Fin du contenu.

Malgré tout, quiconque propose un plan de filtrage anti-spam doit pouvoir répondre à la question : si les spammeurs savaient exactement ce que vous faites, à quel point pourraient-ils vous contourner ? Par exemple, je pense que si le filtrage anti-spam basé sur les sommes de contrôle devient un obstacle sérieux, les spammeurs vont simplement passer aux techniques de "mad-lib" pour générer les corps de message.

Pour battre les filtres bayésiens, il ne suffirait pas aux spammeurs de rendre leurs e-mails uniques ou d'arrêter d'utiliser des mots grossiers individuels. Ils devraient rendre leurs e-mails indiscernables de vos e-mails ordinaires. Et cela, je pense, les contraindrait sévèrement. Le spam est principalement composé de pitches de vente, donc à moins que votre courrier habituel ne soit composé uniquement de pitches de vente, les spams auront inévitablement un caractère différent. Et les spammeurs devraient bien sûr aussi changer (et continuer à changer) toute leur infrastructure, car sinon les en-têtes auraient l'air tout aussi mauvais pour les filtres bayésiens, quoi qu'ils fassent au corps du message. Je n'en sais pas assez sur l'infrastructure utilisée par les spammeurs pour savoir à quel point il serait difficile de faire paraître les en-têtes innocents, mais je suppose que ce serait encore plus difficile que de faire paraître le message innocent.

En supposant qu'ils puissent résoudre le problème des en-têtes, le spam du futur ressemblera probablement à ceci :

Salut. Vous devriez jeter un coup d'œil à ce qui suit : http://www.27meg.com/foo

car c'est à peu près autant de pitch de vente que le filtrage basé sur le contenu laissera aux spammeurs la possibilité d'en faire. (En effet, il sera même difficile de faire passer cela à travers les filtres, car si tout le reste dans l'e-mail est neutre, la probabilité de spam reposera sur l'URL, et il faudra faire des efforts pour la rendre neutre.)

Les spammeurs vont des entreprises qui gèrent des listes soi-disant "opt-in" et qui n'essaient même pas de dissimuler leurs identités, aux gars qui piratent des serveurs de messagerie pour envoyer des spams faisant la promotion de sites pornographiques. Si nous utilisons le filtrage pour réduire leurs options à des e-mails comme celui ci-dessus, cela devrait pratiquement mettre hors d'activité les spammeurs de l'extrémité "légitime" du spectre ; ils se sentent obligés par diverses lois étatiques d'inclure des clauses types sur la raison pour laquelle leur spam n'en est pas un, et sur la façon d'annuler votre "abonnement", et ce genre de texte est facile à reconnaître.

(J'ai longtemps pensé qu'il était naïf de croire que des lois plus strictes diminueraient le spam. Maintenant, je pense que si des lois plus strictes peuvent ne pas diminuer la quantité de spam que les spammeurs envoient, elles peuvent certainement aider les filtres à diminuer la quantité de spam que les destinataires voient réellement.)

Tout au long du spectre, si vous restreignez les pitches de vente que les spammeurs peuvent faire, vous aurez inévitablement tendance à les mettre hors d'activité. Ce mot activité est un mot important à se rappeler. Les spammeurs sont des hommes d'affaires. Ils envoient du spam parce que ça fonctionne. Ça fonctionne parce que bien que le taux de réponse soit abominablement bas (15 pour un million au mieux, contre 3000 pour un million pour un catalogue), le coût, pour eux, est pratiquement nul. Le coût est énorme pour les destinataires, environ 5 semaines-homme pour chaque million de destinataires qui passent une seconde à supprimer le spam, mais le spammeur n'a pas à payer cela.

Envoyer du spam coûte quelque chose au spammeur, cependant. [2] Donc plus nous pourrons faire baisser le taux de réponse - que ce soit par le filtrage ou en utilisant des filtres pour forcer les spammeurs à diluer leurs pitches - moins les entreprises trouveront intéressant d'envoyer du spam.

La raison pour laquelle les spammeurs utilisent les types de pitches de vente qu'ils utilisent est d'augmenter les taux de réponse. C'est peut-être encore plus dégoûtant que de se mettre dans la peau d'un spammeur, mais examinons rapidement l'esprit de quelqu'un qui répond à un spam. Cette personne est soit étonnamment crédule, soit profondément dans le déni de ses intérêts sexuels. Dans les deux cas, aussi répugnant ou idiot que le spam puisse nous sembler, il est excitant pour eux. Les spammeurs ne diraient pas ces choses s'ils n'avaient pas l'air excitant. Et "vous devriez jeter un coup d'œil à ce qui suit" n'aura pas du tout le même attrait pour le destinataire du spam que les choses que les spammeurs disent actuellement. Résultat : s'il ne peut pas contenir d'excitantes pitches de vente, le spam devient moins efficace en tant que moyen de marketing, et moins d'entreprises veulent l'utiliser.

C'est la grande victoire à la fin. J'ai commencé à écrire des logiciels de filtrage anti-spam parce que je ne voulais plus avoir à regarder cette saloperie. Mais si nous devenons assez bons pour filtrer le spam, ça ne fonctionnera plus, et les spammeurs arrêteront vraiment de l'envoyer.


De toutes les approches pour lutter contre le spam, des logiciels aux lois, je pense que le filtrage bayésien sera le plus efficace. Mais je pense aussi que plus nous entreprendrons de différents types d'efforts anti-spam, mieux ce sera, car toute mesure qui contraint les spammeurs aura tendance à faciliter le filtrage. Et même dans le monde du filtrage basé sur le contenu, je pense qu'il sera bénéfique qu'il y ait de nombreux types de logiciels utilisés simultanément. Plus il y aura de filtres différents, plus il sera difficile pour les spammeurs de les contourner.

Annexe : Exemples de filtrage

Voici un exemple de spam reçu pendant que j'écrivais cet article. Les quinze mots les plus intéressants de ce spam sont :

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

Les mots sont un mélange de choses provenant des en-têtes et du corps du message, ce qui est typique du spam. Tout aussi typique du spam est que chacun de ces mots a une probabilité de spam, dans ma base de données, de 0,99. En fait, il y a plus de quinze mots avec des probabilités de 0,99, et ce ne sont que les quinze premiers observés.

Malheureusement, cela fait de cet e-mail un exemple ennuyeux de l'utilisation de la règle de Bayes. Pour voir une variété intéressante de probabilités, il faut regarder celui-ci spam assez atypique.

Les quinze mots les plus intéressants de ce spam, avec leurs probabilités, sont :

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

Cette fois, les preuves sont un mélange de bon et de mauvais. Un mot comme "le plus court" est presque autant une preuve d'innocence qu'un mot comme "madame" ou "promotion" est une preuve de culpabilité. Mais le cas de culpabilité reste plus fort. Si vous combinez ces chiffres selon la règle de Bayes, la probabilité résultante est de 0,9027.

"Madame" provient évidemment de spams commençant par "Cher Monsieur ou Madame". Ils ne sont pas très courants, mais le mot "madame" n'apparaît jamais dans mon courrier électronique légitime, et c'est tout une question de ratio.

"République" obtient un score élevé car il apparaît souvent dans les courriels de la fraude nigériane, et apparaît également une fois ou deux dans les spams faisant référence à la Corée et à l'Afrique du Sud. Vous pourriez dire que c'est un accident s'il aide ainsi à identifier ce spam. Mais j'ai constaté, en examinant les probabilités de spam, qu'il y a beaucoup de ces accidents, et qu'ils ont une tendance étrange à pousser les choses dans la bonne direction plutôt que dans la mauvaise. Dans ce cas, ce n'est pas tout à fait une coïncidence que le mot "République" apparaisse dans les courriels de la fraude nigériane et dans ce spam. Il existe toute une catégorie de propositions d'affaires douteuses impliquant des pays moins développés, et ceux-ci sont à leur tour plus susceptibles d'avoir des noms qui spécifient explicitement (parce qu'ils ne le sont pas) qu'ils sont des républiques.[3]

D'un autre côté, "entrer" est une véritable erreur. Il apparaît principalement dans les instructions de désabonnement, mais est ici utilisé de manière complètement innocente. Heureusement, l'approche statistique est assez robuste et peut tolérer beaucoup d'erreurs avant que les résultats ne commencent à être perturbés.

Pour comparaison, ici se trouve un exemple de ce rare oiseau, un spam qui passe à travers les filtres. Pourquoi ? Parce que par pur hasard, il se trouve être rempli de mots qui apparaissent dans mon courrier électronique réel :


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

Il y a quelques bonnes nouvelles ici. Tout d'abord, ce courrier ne passerait probablement pas les filtres de quelqu'un qui ne se spécialiserait pas dans les langages de programmation et n'aurait pas un bon ami appelé Morris. Pour l'utilisateur moyen, les cinq premiers mots ici seraient neutres et ne contribueraient pas à la probabilité de spam.

Deuxièmement, je pense que le filtrage basé sur les paires de mots (voir ci-dessous) pourrait bien attraper celui-ci : "rentable", "frais d'installation", "remboursement" -- des choses assez compromettantes. Et bien sûr, s'ils continuaient à m'envoyer des spams (ou à un réseau dont je faisais partie), "Hostex" lui-même serait reconnu comme un terme de spam.

Enfin, ici se trouve un courriel innocent. Ses quinze mots les plus intéressants sont les suivants :


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 plupart des mots ici indiquent que le courrier est innocent. Il y a deux mots qui sentent mauvais, "couleur" (les spammeurs adorent les polices colorées) et "Californie" (qui apparaît dans les témoignages et aussi dans les menus des formulaires), mais ils ne suffisent pas à contrebalancer des mots manifestement innocents comme "continuation" et "exemple".

Il est intéressant de constater que "décrire" est considéré comme tellement innocent. Il n'est apparu dans aucun de mes 4000 spams. Les données s'avèrent pleines de ces surprises. L'une des choses que l'on apprend lorsqu'on analyse les textes de spam, c'est à quel point le langage des spammeurs est un sous-ensemble étroit de la langue. C'est ce fait, ainsi que le vocabulaire tout aussi caractéristique du courrier de chaque utilisateur, qui fait que le filtrage bayésien est une bonne option.

Annexe : Autres idées

Une idée que je n'ai pas encore essayée est de filtrer en fonction des paires de mots, voire des triplets, plutôt que des mots individuels. Cela devrait donner une estimation beaucoup plus précise de la probabilité. Par exemple, dans ma base de données actuelle, le mot "offres" a une probabilité de 0,96. Si vous basez les probabilités sur les paires de mots, vous obtiendriez des probabilités de 0,99 pour "offres spéciales" et "offres intéressantes", et une probabilité de 0,1 ou moins pour "approche offres" (comme dans "cette approche offre").

La raison pour laquelle je n'ai pas encore fait cela est que le filtrage basé sur les mots individuels fonctionne déjà très bien. Mais cela signifie qu'il y a de la place pour resserrer les filtres si les spams deviennent plus difficiles à détecter. (Curieusement, un filtre basé sur les paires de mots serait en fait un générateur de texte par chaîne de Markov fonctionnant à l'envers.)

Les caractéristiques spécifiques des spams (par exemple, ne pas voir l'adresse du destinataire dans le champ "À :") ont bien sûr de la valeur pour reconnaître les spams. Elles peuvent être prises en compte dans cet algorithme en les traitant comme des mots virtuels. Je les intégrerai probablement dans les versions futures, au moins pour une poignée des indicateurs de spam les plus flagrants.

La reconnaissance des caractéristiques non spam peut être plus importante que la reconnaissance des caractéristiques spam. Les faux positifs sont une telle préoccupation qu'ils exigent des mesures extraordinaires. Je vais probablement ajouter, dans les versions futures, un deuxième niveau de tests conçu spécifiquement pour éviter les faux positifs. Si un courrier déclenche ce deuxième niveau de filtres, il sera accepté même si sa probabilité de spam est supérieure au seuil.

Je ne m'attends pas à ce que ce deuxième niveau de filtrage soit bayésien. Il sera inévitablement non seulement ad hoc, mais basé sur des hypothèses, car le nombre de faux positifs ne sera pas suffisamment important pour remarquer des tendances. (De toute façon, il est préférable qu'un système de sauvegarde ne s'appuie pas sur la même technologie que le système principal.)

Une autre chose que je pourrais essayer à l'avenir est de concentrer une attention supplémentaire sur des parties spécifiques du courriel. Par exemple, environ 95% des spams actuels incluent l'URL d'un site qu'ils veulent que vous visitiez. (Les 5% restants veulent que vous appeliez un numéro de téléphone, que vous répondiez par courriel ou à une adresse postale américaine, ou dans quelques cas que vous achetiez une certaine action.) L'URL est dans ces cas pratiquement suffisante à elle seule pour déterminer si le courriel est un spam.

Les noms de domaine diffèrent du reste du texte dans un e-mail (non allemand) en ce qu'ils se composent souvent de plusieurs mots collés ensemble. Bien que coûteux en calcul dans le cas général, il pourrait valoir la peine d'essayer de les décomposer. Si un filtre n'a jamais vu le jeton "xxxporn" auparavant, il aura une probabilité individuelle de spam de 0,4, alors que "xxx" et "porn" individuellement ont des probabilités (dans mon corpus) de 0,9889 et 0,99 respectivement, et une probabilité combinée de 0,9998.

Je m'attends à ce que la décomposition des noms de domaine devienne plus importante à mesure que les spammeurs sont progressivement forcés d'arrêter d'utiliser des mots incriminants dans le texte de leurs messages. (Une URL avec une adresse IP est bien sûr un signe extrêmement incriminant, sauf dans le courrier de quelques administrateurs système.)

Il pourrait être judicieux d'avoir une liste maintenue de manière coopérative des URL promues par les spammeurs. Nous aurions besoin d'une métrique de confiance du type étudiée par Raph Levien pour empêcher les soumissions malveillantes ou incompétentes, mais si nous avions une telle chose, elle fournirait un coup de pouce à tout logiciel de filtrage. Ce serait également une base pratique pour les boycotts.

Une autre façon de tester les URL douteuses serait d'envoyer un robot d'exploration pour examiner le site avant que l'utilisateur ne regarde l'e-mail le mentionnant. Vous pourriez utiliser un filtre bayésien pour évaluer le site tout comme vous le feriez pour un e-mail, et tout ce qui serait trouvé sur le site pourrait être inclus dans le calcul de la probabilité que l'e-mail soit un spam. Une URL qui conduirait à une redirection serait bien sûr particulièrement suspecte.

Un projet coopératif que je pense vraiment être une bonne idée serait d'accumuler un corpus géant de spam. Un grand corpus propre est la clé pour faire bien fonctionner le filtrage bayésien. Les filtres bayésiens pourraient en fait utiliser le corpus comme entrée. Mais un tel corpus serait également utile pour d'autres types de filtres, car il pourrait être utilisé pour les tester.

La création d'un tel corpus pose quelques problèmes techniques. Nous aurions besoin de métriques de confiance pour empêcher les soumissions malveillantes ou incompétentes, bien sûr. Nous aurions également besoin de moyens d'effacer les informations personnelles (non seulement les adresses de destination et les copies carbone, mais aussi par exemple les arguments des URL de désabonnement, qui codent souvent l'adresse de destination) des courriels du corpus. Si quelqu'un veut se lancer dans ce projet, ce serait une bonne chose pour le monde.

Annexe : Définir le spam

Je pense qu'il y a un consensus approximatif sur ce qu'est le spam, mais il serait utile d'avoir une définition explicite. Nous devrons le faire si nous voulons établir un corpus central de spam ou même comparer de manière significative les taux de filtrage du spam.

Pour commencer, le spam n'est pas un courrier électronique commercial non sollicité. Si quelqu'un dans mon quartier apprenait que je cherchais un ancien vélo Raleigh trois vitesses en bon état et m'envoyait un e-mail pour m'en proposer un, j'en serais ravi, et pourtant cet e-mail serait à la fois commercial et non sollicité. La caractéristique définissante du spam (en fait, sa raison d'être) n'est pas qu'il soit non sollicité, mais qu'il soit automatisé.

Il est également accessoire que le spam soit généralement commercial. Si quelqu'un commençait à envoyer des e-mails de masse pour soutenir une cause politique, par exemple, ce serait tout autant du spam que des e-mails faisant la promotion d'un site pornographique.

Je propose que nous définissions le spam comme un courrier électronique non sollicité et automatisé. Cette définition inclut donc certains e-mails que de nombreuses définitions légales du spam n'incluent pas. Les définitions légales du spam, influencées probablement par des lobbyistes, ont tendance à exclure le courrier envoyé par des entreprises qui ont une "relation existante" avec le destinataire. Mais le fait d'acheter quelque chose à une entreprise, par exemple, n'implique pas que vous ayez sollicité un courrier électronique continu de leur part. Si je commande quelque chose dans une boutique en ligne et qu'ils m'envoient ensuite un flot de spam, c'est toujours du spam.

Les entreprises qui envoient du spam vous donnent souvent un moyen de "vous désabonner" ou vous demandent d'aller sur leur site et de modifier vos "préférences de compte" si vous voulez arrêter de recevoir du spam. Cela ne suffit pas à arrêter le courrier d'être du spam. Ne pas se désabonner n'est pas la même chose que s'abonner. À moins que le destinataire n'ait explicitement coché une case clairement étiquetée (dont la valeur par défaut était non) demandant à recevoir le courrier, il s'agit de spam.

Dans certaines relations d'affaires, vous sollicitez implicitement certains types de courrier. Lorsque vous commandez en ligne, je pense que vous sollicitez implicitement un reçu et une notification lorsque la commande est expédiée. Je ne m'oppose pas lorsque Verisign m'envoie un courrier m'avertissant qu'un nom de domaine est sur le point d'expirer (du moins, s'ils sont le véritable registraire pour celui-ci). Mais lorsque Verisign m'envoie un e-mail m'offrant un GUIDE GRATUIT pour construire mon site Web de commerce électronique, c'est du spam.

Notes :

[1] Les exemples de cet article sont traduits en Common Lisp pour, croyez-le ou non, une plus grande accessibilité. L'application décrite ici est l'une que nous avons écrite afin de tester un nouveau dialecte Lisp appelé Arc qui n'est pas encore publié.

[2] Actuellement, le taux le plus bas semble être d'environ 200 $ pour envoyer un million de spams. C'est très peu, 1/50e de centime par spam. Mais le filtrage de 95% du spam, par exemple, augmenterait le coût pour les spammeurs d'atteindre un public donné d'un facteur 20. Peu peuvent avoir des marges suffisamment importantes pour absorber cela.

[3] En règle générale, plus il y a de qualificatifs avant le nom d'un pays, plus les dirigeants sont corrompus. Un pays appelé la République démocratique populaire socialiste de X est probablement le dernier endroit au monde où vous voudriez vivre.

Merci à Sarah Harlin pour avoir lu les brouillons de cet article ; à Daniel Giffin (qui écrit également l'interpréteur Arc de production) pour plusieurs bonnes idées sur le filtrage et pour avoir créé notre infrastructure de courrier ; à Robert Morris, Trevor Blackwell et Erann Gat pour de nombreuses discussions sur le spam ; à Raph Levien pour ses conseils sur les métriques de confiance ; et à Chip Coldwell et Sam Steingold pour leurs conseils sur les statistiques.

Vous trouverez cet essai et 14 autres dans Hackers & Painters.

Plus d'informations :