UN PLAN CONTRE LE SPAM
OriginalAoût 2002
(Cet article décrit les techniques de filtrage du spam utilisées dans le lecteur de courrier électronique Web anti-spam que nous avons construit pour exercer Arc. Un algorithme amélioré est décrit dans Meilleur filtrage bayésien.)
Je pense qu'il est possible d'arrêter le spam, et que les filtres basés sur le contenu sont la voie à suivre. Le talon d'Achille des spammeurs est leur message. Ils peuvent contourner toute 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 contourner cela.
Pour le destinataire, le spam est facilement reconnaissable. Si vous engagiez quelqu'un pour lire votre courrier et jeter le spam, il n'aurait aucun mal à le faire. Combien devons-nous faire, à court d'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 vous pouvez filtrer le spam actuel de manière acceptable en utilisant rien de plus qu'une combinaison bayésienne des probabilités de spam de 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, avec 0 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. Le premier instinct de la plupart des pirates est d'essayer d'écrire un logiciel qui reconnaît les propriétés individuelles du spam. Vous regardez les spams et vous pensez, l'audace de ces types d'essayer de m'envoyer du courrier qui commence par "Cher ami" ou qui a un sujet qui est tout en majuscules et se termine par huit points d'exclamation. Je peux filtrer ce genre de choses avec environ une ligne de code.
Et vous le faites, et au début ça marche. Quelques règles simples vont vous faire gagner beaucoup de temps sur le spam entrant. Le simple fait de rechercher le mot "cliquer" va 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 des caractéristiques de spam individuelles avant d'essayer l'approche statistique. Ce que j'ai constaté, c'est que reconnaître ces derniers pourcentages de spams devenait très difficile, et qu'à mesure que je rendais les filtres plus stricts, j'obtenais plus de faux positifs.
Les faux positifs sont des e-mails innocents qui sont identifiés à tort comme des spams. 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 un remède 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 bizarrement, plus vos filtres anti-spam sont bons, 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 j'étais devenu accro à essayer d'identifier moi-même les caractéristiques du spam, comme si je jouais à une sorte de jeu de compétition avec les spammeurs. (Les non-hackers ne s'en rendent pas souvent compte, mais la plupart des hackers sont très compétitifs.) Lorsque j'ai essayé l'analyse statistique, j'ai immédiatement constaté qu'elle était beaucoup plus intelligente que je ne l'avais été. Elle a découvert, bien sûr, que des termes comme "virtumundo" et "adolescents" étaient de bons indicateurs de spam. Mais elle a aussi découvert que "par" et "FL" et "ff0000" sont de bons indicateurs de spam. En fait, "ff0000" (html pour rouge vif) s'avère être un indicateur de spam aussi bon 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 courrier non spam. À l'heure actuelle, chacun d'eux contient environ 4000 messages. Je scanne l'intégralité du texte, y compris les en-têtes et le code html et javascript intégré, 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 place à l'amélioration ici.) J'ignore les jetons qui sont tous des chiffres, et j'ignore également les commentaires html, sans même les considérer comme des séparateurs de jetons.
Je compte le nombre de fois que chaque jeton (en ignorant la casse, actuellement) apparaît dans chaque corpus. À ce stade, je me retrouve avec deux grandes tables de hachage, une pour chaque corpus, qui associe les jetons au nombre d'occurrences.
Ensuite, je crée une troisième table de hachage, cette fois en associant 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 on calcule la probabilité, good et bad sont les tables de hachage que j'ai créées à la première étape, et ngood et nbad sont respectivement le nombre de messages non spam et spam.
J'ai expliqué cela comme du code pour montrer quelques détails importants. Je veux biaiser légèrement les probabilités pour éviter les faux positifs, et par essais et erreurs, j'ai constaté qu'une bonne façon de le faire est de doubler tous les nombres dans good. Cela permet de distinguer les mots qui apparaissent parfois dans les e-mails légitimes et les mots qui ne le font presque jamais. Je ne considère que les mots qui apparaissent plus de cinq fois au total (en fait, à cause de la duplication, apparaître trois fois dans les e-mails non spam suffirait). Et puis il y a la question de savoir quelle probabilité attribuer aux mots qui apparaissent dans un corpus mais pas dans l'autre. Encore une fois, par essais et erreurs, j'ai choisi 0,01 et 0,99. Il y a peut-être place à l'ajustement ici, mais à mesure que le corpus grandit, cet ajustement se fera automatiquement de toute façon.
Les plus observateurs remarqueront que si je considère chaque corpus comme un seul long flux de texte pour le 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 léger biais supplémentaire pour se protéger contre les faux positifs.
Lorsque de nouveaux courriers arrivent, ils sont scannés en jetons, et les quinze jetons les plus intéressants, où intéressant est mesuré par la distance de leur probabilité de spam à un point neutre de 0,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 le combiné probabilité ainsi :
(let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs)))))
Une question qui se pose dans la pratique est de savoir quelle probabilité attribuer à un mot que vous n'avez jamais vu, c'est-à-dire un mot qui n'apparaît pas dans la table de hachage des probabilités de mots. J'ai constaté, encore une fois par essais et erreurs, que 0,4 est un bon nombre à 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 un courrier comme du spam si l'algorithme ci-dessus lui donne une probabilité supérieure à 0,9 d'être un spam. Mais dans la pratique, il n'aurait pas beaucoup d'importance où je place ce seuil, car peu de probabilités se retrouvent au milieu de la plage.
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 lu littéralement des milliers de spams, et c'est vraiment un peu démoralisant. Norbert Wiener a dit que si vous rivalisez avec des esclaves, vous devenez un esclave, et il y a quelque chose de similaire de dégradant à rivaliser avec les spammeurs. Pour reconnaître les caractéristiques individuelles du spam, vous devez essayer de vous mettre dans la tête du spammeur, et franchement, je veux passer le moins de temps possible dans la tête 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 à un e-mail. L'approche bayésienne attribue une probabilité réelle. Le problème avec un "score" est que personne ne sait ce qu'il signifie. L'utilisateur ne sait pas ce qu'il signifie, mais pire encore, le développeur du filtre non plus. Combien de points un e-mail doit-il obtenir pour avoir le mot "sexe" ? 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. Sur la base de mon corpus, "sexe" indique une probabilité de 0,97 que l'e-mail contenant le mot soit un spam, tandis que "sexy" indique une probabilité de 0,99. Et la règle de Bayes, tout aussi non ambiguë, dit qu'un e-mail contenant les deux mots aurait, en l'absence (improbable) de toute autre preuve, une chance de 99,97 % d'être un spam.
Parce qu'elle mesure les probabilités, l'approche bayésienne prend en compte toutes les preuves dans l'e-mail, bonnes et mauvaises. Les mots qui apparaissent de manière disproportionnée rarement dans le spam (comme "cependant" ou "ce soir" ou "apparemment") contribuent autant à la diminution de la probabilité que les mots négatifs comme "désabonnement" et "opt-in" à l'augmenter. Ainsi, un e-mail par ailleurs innocent qui contient le mot "sexe" ne sera pas étiqueté 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) aucun spam qui le fait. Donc, un mot comme celui-ci est en fait une sorte de mot de passe pour m'envoyer du courrier. Dans mon logiciel de filtrage du spam précédent, l'utilisateur pouvait créer une liste de ces mots et les courriers les contenant passeraient automatiquement les filtres. Sur ma liste, j'ai mis des mots comme "Lisp" et aussi mon code postal, afin que (par ailleurs plutôt spammeurs) les reçus des commandes en ligne passent. Je pensais être très intelligent, mais j'ai constaté que le filtre bayésien faisait la même chose pour moi, et de plus, il a découvert beaucoup de mots auxquels je n'avais pas pensé.
Lorsque j'ai dit au début que nos filtres laissent passer moins de 5 spams sur 1000 avec 0 faux positifs, je parle du filtrage de mon courrier sur la base d'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 spam et du non-spam qu'il reçoit. Essentiellement, chaque utilisateur devrait avoir deux boutons de suppression, suppression ordinaire et 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 pouvez commencer les utilisateurs avec un filtre de base, 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écider de sa propre définition précise du spam, et (c) peut-être le mieux de tous, rend difficile pour les spammeurs de mettre au point des courriers pour passer les filtres. Si une grande partie du cerveau du filtre se trouve dans les bases de données individuelles, alors le simple fait de mettre au point des spams pour passer les filtres de base ne garantira rien sur la façon dont ils passeront les filtres individuels des utilisateurs, qui sont variés et beaucoup plus entraînés.
Le filtrage du 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 toutes les adresses auxquelles l'utilisateur a déjà envoyé du courrier. Si un lecteur de courrier électronique a un bouton de suppression comme spam, vous pouvez également ajouter l'adresse de l'expéditeur de chaque e-mail que l'utilisateur a supprimé comme courrier indésirable ordinaire.
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 rendraient le filtrage plus facile, car il ne faudrait filtrer que les e-mails de personnes que vous n'avez jamais rencontrées, et quelqu'un qui vous envoie un e-mail pour la première fois est limité 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 qui vous envoie un e-mail pour la première fois ne serait pas susceptible de le faire. Le problème est que les gens peuvent avoir plus d'une adresse e-mail, donc une nouvelle adresse de l'expéditeur 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 pirate) vous envoie soudainement un e-mail avec une nouvelle adresse de l'expéditeur, donc vous ne pouvez pas risquer de faux positifs en filtrant les courriers provenant d'adresses inconnues de manière particulièrement stricte.
En un sens, cependant, mes filtres incarnent eux-mêmes une sorte de liste blanche (et de liste noire) parce qu'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 de leur part jusqu'à moi. Et ils connaissent la même chose pour 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 signifie pas grand-chose de pouvoir filtrer la plupart des spams actuels, car le spam évolue. En effet, la plupart techniques anti-spam jusqu'à présent ont été comme des pesticides qui ne font que créer une nouvelle souche de bugs résistants.
Je suis plus optimiste quant aux filtres bayésiens, car ils évoluent avec le spam. Ainsi, lorsque les spammeurs commencent à utiliser "c0ck" au lieu de "cock" pour échapper aux 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 damnante que "cock", et les filtres bayésiens savent précisément combien de fois de plus.
Néanmoins, toute personne qui propose un plan de filtrage du spam doit être en mesure de répondre à la question : si les spammeurs savaient exactement ce que vous faisiez, à quel point pourraient-ils vous passer ? Par exemple, je pense que si le filtrage du spam basé sur la somme de contrôle devient un obstacle sérieux, les spammeurs passeront simplement aux techniques de mad-lib pour générer des corps de messages.
Pour battre les filtres bayésiens, il ne suffirait pas pour les spammeurs de rendre leurs e-mails uniques ou d'arrêter d'utiliser des mots coquins individuels. Ils devraient rendre leurs courriers indiscernables de votre courrier ordinaire. Et je pense que cela les contraindrait fortement. Le spam est principalement constitué de propositions de vente, donc à moins que votre courrier régulier ne soit constitué de propositions de vente, les spams auront inévitablement un caractère différent. Et les spammeurs devraient également, bien sûr, changer (et continuer à changer) toute leur infrastructure, car sinon les en-têtes auraient l'air aussi mauvais pour les filtres bayésiens que jamais, 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 en sorte que les en-têtes aient l'air innocentes, mais je suppose que ce serait encore plus difficile que de faire en sorte que le message ait l'air innocent.
En supposant qu'ils puissent résoudre le problème des en-têtes, le spam du futur ressemblera probablement à ceci :
Salut. J'ai pensé que vous devriez jeter un coup d'œil à ce qui suit : http://www.27meg.com/foo
car c'est à peu près autant de proposition de vente que le filtrage basé sur le contenu laissera de la place au spammeur pour en faire. (En effet, il sera difficile même de faire passer cela les filtres, car si tout le reste dans l'e-mail est neutre, la probabilité de spam dépendra de l'URL, et il faudra un certain effort pour la faire paraître neutre.)
Les spammeurs vont des entreprises qui gèrent des listes dites opt-in qui ne tentent même pas de dissimuler leur identité, aux types qui détournent 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 courriers comme celui ci-dessus, cela devrait à peu près mettre les spammeurs sur le côté "légitime" du spectre hors du marché ; ils se sentent obligés par diverses lois étatiques d'inclure des mentions légales sur la raison pour laquelle leur spam n'est pas du spam, et sur la façon d'annuler votre "abonnement", et ce genre de texte est facile à reconnaître.
(Je pensais autrefois qu'il était naïf de croire que des lois plus strictes réduiraient le spam. Maintenant, je pense que si des lois plus strictes ne réduisent pas la quantité de spam que les spammeurs envoient, elles peuvent certainement aider les filtres à réduire la quantité de spam que les destinataires voient réellement.)
Tout au long du spectre, si vous restreignez les propositions de vente que les spammeurs peuvent faire, vous finirez inévitablement par les mettre hors du marché. Ce mot entreprise est important à retenir. Les spammeurs sont des hommes d'affaires. Ils envoient du spam parce que ça marche. Ça marche parce que même si le taux de réponse est abominablement bas (au mieux 15 pour un million, contre 3000 pour un million pour un mailing de catalogue), le coût, pour eux, est pratiquement nul. Le coût est énorme pour les destinataires, environ 5 semaines-hommes pour chaque million de destinataires qui passent une seconde à supprimer le spam, mais le spammeur n'a pas à payer cela.
L'envoi de spam coûte quelque chose au spammeur, cependant. [2] Donc, plus nous pouvons réduire le taux de réponse - que ce soit par le filtrage, ou en utilisant des filtres pour forcer les spammeurs à diluer leurs propositions de vente - moins d'entreprises trouveront que cela vaut la peine d'envoyer du spam.
La raison pour laquelle les spammeurs utilisent les types de propositions 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 tête d'un spammeur, mais jetons un coup d'œil rapide dans la tête de quelqu'un qui répond à un spam. Cette personne est soit étonnamment crédule, soit profondément en déni quant à ses intérêts sexuels. Dans les deux cas, aussi répugnant ou idiot que le spam nous paraisse, il est excitant pour eux. Les spammeurs ne diraient pas ces choses s'ils ne semblaient pas excitantes. Et "j'ai pensé que vous devriez jeter un coup d'œil à ce qui suit" n'aura tout simplement pas le même attrait pour le destinataire du spam que les types de choses que les spammeurs disent maintenant. Résultat : si elle ne peut pas contenir de propositions de vente excitantes, le spam devient moins efficace comme outil de marketing, et moins d'entreprises veulent l'utiliser.
C'est la grande victoire à la fin. J'ai commencé à écrire un logiciel de filtrage du spam parce que je ne voulais plus avoir à regarder ce genre de choses. Mais si nous devenons assez bons pour filtrer le spam, il cessera de fonctionner, et les spammeurs cesseront réellement de l'envoyer.
De toutes les approches pour lutter contre le spam, des logiciels aux lois, je pense que le filtrage bayésien sera la plus efficace. Mais je pense aussi que plus nous déployons d'efforts anti-spam différents, mieux c'est, car toute mesure qui contraint les spammeurs aura tendance à faciliter le filtrage. Et même au sein du monde du filtrage basé sur le contenu, je pense que ce sera une bonne chose s'il existe de nombreux types de logiciels différents utilisés simultanément. Plus il y a de filtres différents, plus il sera difficile pour les spammeurs de régler les spams pour les faire passer.
Annexe : Exemples de filtrage
Ici se trouve un exemple de spam qui est arrivé 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. Il est également typique du spam que chacun de ces mots ait 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 vus.
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, nous devons regarder ceci spam en fait 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, la preuve est un mélange de bon et de mauvais. Un mot comme « shortest » est presque autant une preuve d'innocence qu'un mot comme « madam » ou « promotion » est pour la culpabilité. Mais le cas de la culpabilité est toujours plus fort. Si vous combinez ces nombres selon la règle de Bayes, la probabilité résultante est de 0,9027.
« Madam » vient évidemment des spams qui commencent par « Cher Monsieur ou Madame ». Ils ne sont pas très courants, mais le mot « madam » ne se produit jamais dans mon e-mail légitime, et tout est question de ratio.
« Republic » obtient un score élevé car il apparaît souvent dans les e-mails d'escroquerie nigérians, et apparaît également une ou deux fois dans les spams faisant référence à la Corée et à l'Afrique du Sud. Vous pourriez dire que c'est un accident qu'il aide ainsi à identifier ce spam. Mais j'ai constaté lors de l'examen des probabilités de spam qu'il y a beaucoup de ces accidents, et 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 entièrement une coïncidence que le mot « Republic » apparaisse dans les e-mails d'escroquerie nigérians et ce spam. Il existe toute une classe de propositions commerciales douteuses impliquant des pays moins développés pays, 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é, « enter » est une véritable erreur. Il apparaît principalement dans les instructions de désabonnement, mais ici il est utilisé d'une manière complètement innocente. Heureusement, le approche statistique est assez robuste, et peut tolérer pas mal de ratés avant que les résultats ne commencent à être faussés.
Pour comparaison, ici est un exemple de cet oiseau rare, un spam qui passe les filtres. Pourquoi ? Parce que par pure chance, il se trouve qu'il est chargé de mots qui apparaissent dans mon e-mail 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 deux bonnes nouvelles ici. Premièrement, ce courrier ne passerait probablement pas les filtres de quelqu'un qui ne se spécialisait pas dans les langages de programmation et avoir 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 : « coût efficace », « frais d'installation », « remboursement » -- des choses assez incriminantes choses. Et bien sûr, s'ils continuaient à me spammer (ou un réseau dont je faisais partie), « Hostex » lui-même serait reconnu comme un terme de spam.
Enfin, ici est un e-mail 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, « color » (les spammeurs adorent les polices de caractères colorées) et « California » (qui apparaît dans les témoignages et également dans les menus des formulaires), mais ils ne suffisent pas à l'emporter sur des mots évidemment innocents comme « continuation » et « example ».
Il est intéressant de noter que « describe » est considéré comme si innocent. Il ne s'est produit dans aucun de mes 4 000 spams. Les données s'avèrent pleines de telles surprises. L'une des choses que vous apprenez lorsque vous analysez des textes de spam est à quel point les spammeurs opèrent dans 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 du filtrage bayésien un bon pari.
Annexe : Plus d'idées
Une idée que je n'ai pas encore essayée est de filtrer en fonction de paires de mots, voire de triplets, plutôt que de 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 « offers » a une probabilité de 0,96. Si vous basiez les probabilités sur des paires de mots, vous finiriez avec « special offers » et « valuable offers » ayant des probabilités de 0,99 et, disons, « approach offers » (comme dans « this approach offers ») ayant une probabilité de 0,1 ou moins.
La raison pour laquelle je n'ai pas fait cela est que le filtrage basé sur des mots individuels fonctionne déjà si bien. Mais cela signifie qu'il y a de la place pour resserrer les filtres si le spam devient plus difficile à détecter. (Curieusement, un filtre basé sur des paires de mots serait en effet un générateur de texte à chaînage de Markov fonctionnant à l'envers.)
Les caractéristiques spécifiques du spam (par exemple, ne pas voir l'adresse du destinataire dans le champ à : ) ont bien sûr une valeur pour reconnaître le spam. Elles peuvent être considérées dans cet algorithme en les traitant comme des mots virtuels. Je le ferai probablement dans les versions futures, au moins pour une poignée des indicateurs de spam les plus flagrants. Les filtres anti-spam qui reconnaissent les caractéristiques ont raison dans de nombreux détails ; ce qui leur manque, c'est une discipline globale pour combiner les preuves.
Reconnaître les caractéristiques non-spam peut être plus important que de reconnaître les 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 test 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 suppositions, car le nombre de faux positifs n'aura pas tendance à être suffisamment important pour remarquer des schémas. (C'est bien ainsi, de toute façon, si un système de secours ne repose pas sur la même technologie que le système principal.)
Une autre chose que je peux essayer à l'avenir est de concentrer une attention particulière sur des parties spécifiques de l'e-mail. Par exemple, environ 95 % du spam actuel inclut 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, répondiez par e-mail ou à une adresse postale, ou dans quelques cas, achetiez un certain stock.) L'URL est dans de tels cas pratiquement suffisante en soi pour déterminer si l'e-mail est un spam.
Les noms de domaine diffèrent du reste du texte dans un e-mail (non allemand) en ce qu'ils sont souvent constitués de plusieurs mots collés ensemble. Bien que coûteux en calcul dans le cas général, il pourrait être intéressant d'essayer de les décomposer. Si un filtre n'a jamais vu le jeton « xxxporn » auparavant, il aura une probabilité de spam individuelle de 0,4, tandis 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 contraints 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.)
Ce serait peut-être une bonne idée d'avoir une liste gérée 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 donnerait un coup de pouce à tout logiciel de filtrage. Ce serait également une base pratique pour les boycottages.
Une autre façon de tester des URL douteuses serait d'envoyer un robot d'exploration pour regarder le site avant que l'utilisateur ne regarde l'e-mail le mentionnant. Vous pourriez utiliser un filtre bayésien pour évaluer le site de la même manière que vous le feriez pour un e-mail, et tout ce qui a été trouvé sur le site pourrait être inclus dans le calcul de la probabilité de l' e-mail étant un spam. Une URL qui conduirait à une redirection serait bien sûr particulièrement suspecte.
Un projet coopératif que je pense vraiment serait une bonne idée serait d'accumuler un corpus géant de spam. Un corpus volumineux et propre est la clé pour faire fonctionner correctement 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 (pas seulement les adresses à : et les CC, mais aussi par exemple les arguments des URL de désabonnement, qui codent souvent l'adresse à :) des courriers dans le corpus. Si quelqu'un veut se charger de ce projet, ce serait une bonne chose pour le monde.
Annexe : Définition du spam
Je pense qu'il existe 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 les taux de filtrage du spam de manière significative.
Pour commencer, le spam n'est pas un e-mail commercial non sollicité. Si quelqu'un dans mon quartier apprenait que je cherchais un vieux Raleigh trois vitesses en bon état condition, et m'a envoyé un e-mail me proposant de me le vendre, j'en serais ravi, et pourtant cet e-mail serait à la fois commercial et non sollicité. La caractéristique déterminante du spam (en fait, sa raison d'être) n'est pas qu'il est non sollicité, mais qu'il est automatisé.
Il est également simplement 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 qu'un e-mail faisant la promotion d'un site porno.
Je propose de définir le spam comme un e-mail automatisé non sollicité. Cette définition inclut donc certains e-mails que de nombreuses définitions légales du spam ne comprennent pas. Les définitions légales du spam, influencées vraisemblablement par les lobbyistes, ont tendance à exclure les courriers envoyés par des entreprises qui ont une « relation existante » avec le destinataire. Mais acheter quelque chose à une entreprise, par exemple, n'implique pas que vous avez sollicité des e-mails continus de leur part. Si je commande quelque chose dans un 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 souhaitez arrêter de recevoir du spam. Cela ne suffit pas pour empêcher le courrier d'être du spam. Ne pas se désabonner n'est pas la même chose que de s'abonner. À moins que le destinataire n'ait explicitement coché une case clairement étiquetée (dont la valeur par défaut était non) demandant de recevoir l'e-mail, alors c'est du spam.
Dans certaines relations commerciales, vous sollicitez implicitement certains types de courriers. 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 me dérange pas lorsque Verisign m'envoie un courrier m'avertissant qu'un nom de domaine est sur le point d'expirer (au moins, s'ils sont le registraire réel pour cela). Mais lorsque Verisign m'envoie un e-mail proposant un GUIDE GRATUIT pour construire mon site Web de commerce électronique, c'est du spam.
Remarques :
[1] Les exemples de cet article sont traduits en Common Lisp pour, croyez-le ou non, une meilleure accessibilité. L'application décrite ici est une application 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 bon marché, 1/50e de centime par spam. Mais filtrer 95 % du spam, par exemple, augmenterait le coût des spammeurs pour 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é République démocratique populaire socialiste de X est probablement le dernier endroit au monde où vous voudriez vivre.
Merci à Sarah Harlin pour la lecture des 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 la création de notre infrastructure de messagerie ; Robert Morris, Trevor Blackwell et Erann Gat pour de nombreuses discussions sur le spam ; Raph Levien pour des conseils sur les métriques de confiance ; et Chip Coldwell et Sam Steingold pour des conseils sur les statistiques.
Vous trouverez cet essai et 14 autres dans [
Hackers & Painters
](http://www.amazon.com/gp/product/0596006624) .
Plus d'infos :