UN PLAN POUR 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 créé pour exercer Arc . Un algorithme amélioré est décrit dans Better Bayesian Filtering .)
Je pense qu'il est possible de stopper le spam et que les filtres basés sur le contenu sont le moyen d'y parvenir. Le talon d'Achille des spammeurs est leur message. Ils peuvent contourner toute autre barrière que vous avez mise en place. Ils y sont parvenus jusqu'à présent, du moins. Mais ils doivent délivrer leur message, quel qu'il soit. Si nous pouvons écrire un logiciel qui reconnaît leurs messages, ils n'auront aucun moyen de contourner cela.
Pour le destinataire, le spam est facilement reconnaissable. Si vous engagez quelqu'un pour lire votre courrier et supprimer le spam, il n'aura aucun mal à le faire. Que devons-nous faire, à part l'IA, pour automatiser ce processus ?
Je pense que nous serons en mesure de résoudre le problème avec des algorithmes assez simples. En fait, j'ai découvert que l'on peut filtrer les spams actuels 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 positif.
L'approche statistique n'est généralement pas la première que les gens utilisent lorsqu'ils écrivent des filtres anti-spam. Le premier réflexe 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, quel culot de ces types d'essayer de m'envoyer un courrier qui commence par « Cher ami » ou dont l'objet est tout en majuscules et se termine par huit points d'exclamation. Je peux filtrer ce genre de choses avec une seule ligne de code.
Et c'est ce que vous faites, et au début ça marche. Quelques règles simples vous permettront de réduire considérablement votre spam entrant. La simple recherche du mot « clic » permet de détecter 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 individuelles de spam avant d'essayer l'approche statistique. J'ai découvert qu'il était très difficile de reconnaître les derniers pour cent de spams et qu'à mesure que je rendais les filtres plus stricts, j'obtenais davantage de faux positifs.
Les faux positifs sont des e-mails innocents qui sont identifiés par erreur comme des spams. Pour la plupart des utilisateurs, rater un e-mail légitime est pire que recevoir du spam. Un filtre qui génère des faux positifs est donc comme un remède contre l'acné qui comporte un risque mortel pour le patient.
Plus un utilisateur reçoit de spam, moins il a de chances de remarquer un courrier innocent qui traîne dans son dossier spam. Et curieusement, plus vos filtres anti-spam s'améliorent, plus les faux positifs deviennent dangereux, car lorsque les filtres sont vraiment efficaces, les utilisateurs sont plus susceptibles d'ignorer tout ce qu'ils détectent.
Je ne sais pas pourquoi j'ai évité d'essayer l'approche statistique pendant si longtemps. Je pense que c'est parce que j'ai pris l'habitude d'essayer d'identifier moi-même les éléments de spam, comme si je jouais à une sorte de jeu compétitif 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 bien plus intelligente que moi. Elle a bien sûr découvert que des termes comme « virtumundo » et « teens » étaient de bons indicateurs de spam. Mais elle a également découvert que « per », « FL » et « ff0000 » sont de bons indicateurs de spam. En fait, « ff0000 » (en 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 manière dont je procède au filtrage statistique. Je commence avec un corpus de courrier indésirable et un autre de courrier non indésirable. À l'heure actuelle, chacun d'eux contient environ 4 000 messages. J'analyse l'intégralité du texte, y compris les en-têtes, le code HTML et le 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 symboles dollar comme faisant partie des jetons, et tout le reste comme un séparateur de jetons. (Il y a probablement matière à 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 token (en ignorant la casse, pour le moment) apparaît dans chaque corpus. À ce stade, je me retrouve avec deux grandes tables de hachage, une pour chaque corpus, qui mappent les tokens au nombre d'occurrences.
Ensuite, je crée une troisième table de hachage, en associant cette fois 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 (< (+ gb) 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 respectivement le nombre de messages non spam et spam.
J'ai expliqué cela sous forme de 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 découvert qu'une bonne façon de le faire est de doubler tous les nombres dans les bons. Cela permet de faire la distinction entre les mots qui apparaissent occasionnellement dans les courriers électroniques légitimes et les mots qui n'apparaissent presque jamais. Je ne considère que les mots qui apparaissent plus de cinq fois au total (en fait, en raison du doublement, apparaître trois fois dans les courriers non indésirables serait suffisant). Et puis il y a la question de la 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 peut y avoir une marge de réglage ici, mais à mesure que le corpus se développe, un tel réglage se produira automatiquement de toute façon.
Les plus observateurs remarqueront que, bien que je considère chaque corpus comme un seul long flux de texte aux fins de 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.
Lorsqu'un nouveau courrier arrive, il est analysé en jetons, et les quinze jetons les plus intéressants, où l'intérêt est mesuré par la distance entre leur probabilité de spam et une valeur neutre de 0,5, sont utilisés pour calculer la probabilité que le courrier soit du 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 en 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 découvert, 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 indésirables ont tendance à être trop familiers.
Vous trouverez des exemples de l'application de cet algorithme à des courriers électroniques réels dans une annexe à la fin.
Je considère un courrier comme du spam si l'algorithme ci-dessus lui donne une probabilité supérieure à 0,9 d'être du spam. Mais en pratique, le choix de ce seuil n'aurait pas beaucoup d'importance, car peu de probabilités se situent au milieu de la fourchette.
L'un des grands avantages de l'approche statistique est qu'il n'est pas nécessaire de lire autant de spams. Au cours des six derniers mois, j'ai lu littéralement des milliers de spams, et c'est vraiment démoralisant. Norbert Wiener a dit que si vous rivalisez avec des esclaves, vous devenez un esclave, et il y a quelque chose de tout aussi dégradant dans le fait de rivaliser avec les spammeurs. Pour reconnaître les caractéristiques individuelles d'un spam, vous devez essayer d'entrer dans l'esprit 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, c'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 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 s'il contient 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. D'après mon corpus, « sexe » indique une probabilité de 0,97 que l'e-mail qui le contient soit un spam, tandis que « sexy » indique une probabilité de 0,99. Et la règle de Bayes, tout aussi claire, 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 les probabilités, l'approche bayésienne prend en compte tous les éléments de preuve contenus dans l'e-mail, qu'ils soient bons ou mauvais. Les mots qui apparaissent de manière disproportionnée dans les spams (comme « bien que », « ce soir » ou « apparemment ») contribuent autant à réduire la probabilité que les mots grossiers comme « se désabonner » et « s'inscrire » à l'augmenter. Ainsi, un e-mail par ailleurs innocent qui contient le mot « sexe » ne sera pas considéré comme un spam.
Idéalement, bien sûr, les probabilités devraient être calculées individuellement pour chaque utilisateur. Je reçois beaucoup de courriers électroniques contenant le mot « Lisp », et (jusqu'à présent) aucun spam qui le fasse. Un mot comme celui-là est donc en fait une sorte de mot de passe pour m'envoyer du courrier. Dans mon ancien logiciel de filtrage du spam, l'utilisateur pouvait établir une liste de ces mots et le courrier les contenant passait automatiquement les filtres. Sur ma liste, j'ai mis des mots comme « Lisp » et aussi mon code postal, de sorte que les reçus (qui sonnent plutôt comme du spam) des commandes en ligne passent. Je pensais être très malin, mais j'ai découvert que le filtre bayésien faisait la même chose pour moi, et en plus, il a découvert beaucoup de mots auxquels je n'avais pas pensé.
Lorsque j'ai dit au début que nos filtres laissaient passer moins de 5 spams pour 1000 avec 0 faux positif, je parle de filtrer mon courrier en fonction 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 courrier indésirable et non indésirable qu'il reçoit. Essentiellement, chaque utilisateur devrait avoir deux boutons de suppression, la suppression ordinaire et la suppression en tant que spam. Tout ce qui est supprimé en tant que spam va dans le corpus de spam, et tout le reste va dans le corpus non indésirable.
Vous pouvez commencer par utiliser un filtre de départ, mais chaque utilisateur doit avoir ses propres probabilités par mot en fonction du courrier 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 mieux encore, rend difficile pour les spammeurs de régler les courriers pour qu'ils passent à travers les filtres. Si une grande partie du cerveau du filtre se trouve dans les bases de données individuelles, le simple réglage des spams pour qu'ils passent à travers les filtres de départ ne garantit rien quant à la façon dont ils passeront à travers les filtres différents et beaucoup plus entraînés des utilisateurs individuels.
Le filtrage du spam basé sur le contenu est souvent associé à une liste blanche, c'est-à-dire une liste d'expéditeurs dont le courrier peut être accepté sans filtrage. Une façon simple de créer une telle liste blanche consiste à conserver une liste de toutes les adresses auxquelles l'utilisateur a déjà envoyé du courrier. Si un lecteur de courrier dispose d'un bouton de suppression du courrier indésirable, vous pouvez également ajouter l'adresse de l'expéditeur de chaque courrier électronique que l'utilisateur a supprimé dans la corbeille ordinaire.
Je suis un partisan des listes blanches, mais plus comme moyen d'économiser du temps de calcul que comme moyen d'améliorer le filtrage. Je pensais que les listes blanches faciliteraient le filtrage, car vous n'auriez à filtrer que les e-mails provenant de personnes dont vous n'avez jamais entendu parler, et une personne qui vous envoie un e-mail pour la première fois est limitée par les conventions dans ce qu'elle peut vous dire. Une personne que vous connaissez déjà peut vous envoyer un e-mail parlant de sexe, mais une personne qui vous envoie un e-mail pour la première fois ne le fera probablement pas. Le problème est que les gens peuvent avoir plusieurs adresses e-mail, donc une nouvelle adresse d'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 informatique) vous envoie soudainement un e-mail avec une nouvelle adresse d'expéditeur, vous ne pouvez donc pas risquer de faux positifs en filtrant les e-mails provenant d'adresses inconnues de manière particulièrement stricte.
En un sens, 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. Ainsi, dans cette mesure, ils « connaissent » les adresses e-mail des expéditeurs de confiance et même les itinéraires par lesquels le courrier leur parvient. Et ils connaissent la même chose pour le spam, y compris les noms des serveurs, les versions des expéditeurs et les protocoles.
Si je pensais pouvoir maintenir le niveau actuel 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 fait, la plupart des techniques antispam jusqu'à présent ont été comme des pesticides qui ne font rien d'autre que de créer une nouvelle souche résistante de microbes.
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 accablante que « cock », et les filtres bayésiens savent précisément à quel point.
Cependant, quiconque propose un plan de filtrage du spam doit être capable de répondre à la question suivante : si les spammeurs savaient exactement ce que vous faites, comment pourraient-ils vous contourner ? 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 mad-lib pour générer les corps des messages.
Pour contourner les filtres bayésiens, il ne suffirait pas aux spammeurs de rendre leurs e-mails uniques ou de cesser d'utiliser des mots grossiers individuels. Ils devraient faire en sorte que leurs e-mails ne se distinguent pas de votre courrier ordinaire. Et cela les limiterait considérablement, je pense. Le spam est principalement constitué d'arguments de vente, donc à moins que votre courrier ordinaire ne soit composé que d'arguments de vente, les spams auront inévitablement un caractère différent. Et les spammeurs devraient aussi, bien sûr, changer (et continuer à changer) toute leur infrastructure, car sinon les en-têtes seraient aussi mauvais que jamais aux yeux des filtres bayésiens, peu importe ce qu'ils ont fait au corps du message. Je ne connais pas suffisamment 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 pense 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 :
Hey there. Thought you should check out the following: http://www.27meg.com/foo
car c'est à peu près tout ce que le filtrage basé sur le contenu laissera au spammeur pour faire. (En fait, il sera même difficile de faire passer ce message au-delà des filtres, car si tout le reste de l'e-mail est neutre, la probabilité de spam dépendra de l'URL, et il faudra un certain effort pour que cela paraisse neutre.)
Les spammeurs sont très divers : ils gèrent des listes d'envoi de courriers indésirables qui ne tentent même pas de dissimuler leur identité, et ils 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 courriers comme celui ci-dessus, cela devrait mettre les spammeurs « légitimes » hors d'état de nuire ; ils se sentent obligés par diverses lois d'État d'inclure des textes standard expliquant pourquoi leur spam n'est pas du spam et comment annuler votre « abonnement », et ce type de texte est facile à reconnaître.
(J'avais l'habitude de penser qu'il était naïf de croire que des lois plus strictes réduiraient le spam. Maintenant, je pense que même si des lois plus strictes ne peuvent pas réduire la quantité de spam envoyée par les spammeurs, 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 limitez les arguments de vente que les spammeurs peuvent faire, vous aurez inévitablement tendance à les mettre en faillite. Ce mot « business » est important à retenir. Les spammeurs sont des hommes d’affaires. Ils envoient du spam parce que ça marche. Cela marche parce que même si le taux de réponse est abominablement bas (au mieux 15 par million, contre 3000 par million pour un envoi de 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 ce coût.
L'envoi de spam coûte cependant quelque chose au spammeur. [2] Ainsi, plus le taux de réponse est bas, que ce soit en filtrant ou en utilisant des filtres pour forcer les spammeurs à diluer leurs arguments, moins les entreprises trouveront intéressant d'envoyer du spam.
Les spammeurs utilisent ce genre de discours de vente pour augmenter le taux de réponse. C'est peut-être encore plus dégoûtant que de pénétrer dans l'esprit d'un spammeur, mais jetons un rapide coup d'œil à l'intérieur de l'esprit de quelqu'un qui répond à un spam. Cette personne est soit incroyablement 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 nous semble, il est excitant pour elle. Les spammeurs ne diraient pas ces choses si elles n'avaient pas l'air excitantes. Et « Je pense que vous devriez jeter un œil à ce qui suit » n'aura tout simplement pas autant d'attrait auprès du destinataire du spam que le genre de choses que disent les spammeurs aujourd'hui. Résultat : s'il ne peut pas contenir de discours de vente excitants, le spam devient moins efficace en tant que véhicule marketing, et moins d'entreprises veulent l'utiliser.
C'est la grande victoire au final. J'ai commencé à écrire des logiciels de filtrage du spam parce que je ne voulais plus avoir à regarder ce genre de choses. Mais si nous devenons suffisamment bons pour filtrer le spam, cela cessera de fonctionner et les spammeurs arrêteront effectivement de l'envoyer.
De toutes les approches de lutte 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 antispam, mieux ce sera, car toute mesure visant à limiter les spammeurs aura tendance à faciliter le filtrage. Et même dans le monde du filtrage basé sur le contenu, je pense que ce sera une bonne chose que de nombreux types de logiciels différents soient utilisés simultanément. Plus il y aura de filtres différents, plus il sera difficile pour les spammeurs de régler les spams pour les faire passer.
Annexe : Exemples de filtrage
Voici 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 contenu provenant des en-têtes et du corps du message, ce qui est typique du spam. Ce qui est également typique du spam, c'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 ceux-ci 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 examiner ce 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, les preuves sont un mélange de bonnes et de mauvaises. Un mot comme « le plus court » est presque aussi probant en faveur de l'innocence qu'un mot comme « madame » ou « promotion » en faveur de la culpabilité. Mais les arguments en faveur de la culpabilité sont toujours plus forts. Si vous combinez ces chiffres selon la règle de Bayes, la probabilité résultante est de 0,9027.
« Madame » provient évidemment des spams commençant par « Cher Monsieur ou Madame ». Ils ne sont pas très courants, mais le mot « Madame » n'apparaît jamais dans mes e-mails légitimes, et tout est une question de ratio.
Le mot « République » obtient un score élevé car il apparaît souvent dans les e-mails frauduleux 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. On pourrait dire que c'est un accident qui permet d'identifier ce spam. Mais en examinant les probabilités de spam, j'ai découvert que ces accidents sont nombreux et qu'ils ont une étrange tendance à faire avancer les choses dans la bonne direction plutôt que dans la mauvaise. Dans ce cas, ce n'est pas entièrement une coïncidence si le mot « République » apparaît dans les e-mails frauduleux nigérians et dans ce spam. Il existe toute une catégorie de propositions commerciales douteuses impliquant des pays moins développés, et celles-ci sont à leur tour plus susceptibles d'avoir des noms qui spécifient explicitement (car ils ne le sont pas) qu'il s'agit de républiques.[3]
En revanche, « enter » est un véritable échec. Il se produit principalement dans les instructions de désabonnement, mais il est ici utilisé de manière tout à fait innocente. Heureusement, l'approche statistique est assez robuste et peut tolérer un grand nombre d'échecs avant que les résultats ne commencent à être faussés.
À titre de comparaison, voici un exemple de cet oiseau rare, un spam qui passe à travers les filtres. Pourquoi ? Parce que, par pur hasard, il contient des mots qui apparaissent dans mon véritable e-mail :
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. Tout d'abord, ce courrier ne passerait probablement pas à travers les filtres d'une personne qui ne serait pas spécialisée dans les langages de programmation et qui n'aurait pas un bon ami appelé Morris. Pour l'utilisateur moyen, les cinq premiers mots ici seraient tous neutres et ne contribueraient pas à la probabilité de spam.
Deuxièmement, je pense que le filtrage basé sur des paires de mots (voir ci-dessous) pourrait bien détecter ce type de message : « rentable », « frais d'installation », « remboursement » – des termes assez compromettants. Et bien sûr, s'ils continuaient à me spammer (ou à spammer un réseau dont je faisais partie), « Hostex » lui-même serait reconnu comme un terme de spam.
Enfin, voici 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 utilisés ici indiquent que le courrier est innocent. Il y a deux mots qui sentent mauvais, « couleur » (les spammeurs adorent les polices de caractères 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 le taux de « description » est si parfaitement innocent. Cela ne s'est produit dans aucun de mes 4000 spams. Les données se révèlent pleines de surprises. L'une des choses que l'on apprend en analysant les spams est le sous-ensemble restreint de langues dans lesquelles opèrent les spammeurs. C'est ce fait, associé au vocabulaire tout aussi caractéristique du courrier électronique de chaque utilisateur, qui fait du filtrage bayésien un bon choix.
Annexe : Autres idées
Une idée que je n'ai pas encore essayée est de filtrer en fonction des paires de mots, ou même 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 vous retrouverez avec « offres spéciales » et « offres intéressantes » ayant des probabilités de 0,99 et, par exemple, « offres d'approche » (comme dans « cette offre d'approche ») ayant une probabilité de 0,1 ou moins.
La raison pour laquelle je ne l'ai pas fait est que le filtrage basé sur des mots individuels fonctionne déjà très bien. Mais cela signifie qu'il est possible de renforcer les filtres si le spam devient plus difficile à détecter. (Curieusement, un filtre basé sur des paires de mots serait en fait un générateur de texte à chaînage de Markov fonctionnant à l'envers.)
Les fonctionnalités spécifiques au spam (par exemple, ne pas voir l'adresse du destinataire dans le champ à :) ont bien sûr une valeur dans la reconnaissance du spam. Elles peuvent être prises en compte dans cet algorithme en les traitant comme des mots virtuels. Je ferai probablement cela dans les prochaines versions, au moins pour une poignée des indicateurs de spam les plus flagrants. Les filtres anti-spam qui reconnaissent les fonctionnalités sont corrects sur de nombreux points ; ce qui leur manque, c'est une discipline globale pour combiner les preuves.
Il est peut-être plus important de reconnaître les fonctionnalités non-spam que celles qui sont spam. Les faux positifs sont tellement inquiétants qu'ils exigent des mesures extraordinaires. J'ajouterai probablement dans les prochaines versions 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 ponctuel, mais basé sur des suppositions, car le nombre de faux positifs ne sera généralement pas assez important pour détecter des tendances. (Il est tout aussi bien, de toute façon, qu'un système de secours ne repose 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 particulière sur certaines parties du courrier électronique. Par exemple, environ 95 % des spams actuels incluent l'URL d'un site qu'ils souhaitent vous faire visiter. (Les 5 % restants vous demandent d'appeler un numéro de téléphone, de répondre par e-mail ou à une adresse postale américaine, ou dans quelques cas d'acheter une certaine action.) Dans de tels cas, l'URL suffit pratiquement à elle seule à déterminer si le courrier électronique est un spam.
Les noms de domaine diffèrent du reste du texte d'un e-mail (non allemand) en ce qu'ils sont souvent constitués de plusieurs mots collés ensemble. Bien que cela soit coûteux en termes de calcul dans le cas général, il peut être utile 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 seront progressivement obligés d'arrêter d'utiliser des mots compromettants dans le texte de leurs messages. (Une URL avec une adresse IP est bien sûr un signe extrêmement compromettant, sauf dans le courrier de quelques administrateurs système.)
Il serait peut-être judicieux de disposer d'une liste d'URL gérée de manière coopérative et promue par des spammeurs. Nous aurions besoin d'une mesure de confiance du type de celle étudiée par Raph Levien pour empêcher les soumissions malveillantes ou incompétentes, mais si nous disposions d'une telle chose, cela donnerait 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 consulte l'e-mail le mentionnant. Vous pourriez utiliser un filtre bayésien pour évaluer le site comme vous le feriez pour un e-mail, et tout ce qui est trouvé sur le site pourrait être inclus dans le calcul de la probabilité que l'e-mail soit un spam. Une URL qui mène à une redirection serait bien sûr particulièrement suspecte.
Un projet coopératif qui serait vraiment une bonne idée serait d'accumuler un corpus géant de spam. Un corpus large et propre est la clé pour que le filtrage bayésien fonctionne bien. 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 bien sûr besoin de mesures de confiance pour empêcher les soumissions malveillantes ou incompétentes. Nous aurions également besoin de moyens pour effacer les informations personnelles (pas seulement les adresses de destinataire et les ccs, mais aussi par exemple les arguments pour les URL de désabonnement, qui codent souvent l'adresse de destinataire) des courriers du corpus. Si quelqu'un veut prendre en charge ce projet, ce serait une bonne chose pour le monde.
Annexe : Définition du spam
Je pense qu'il existe un consensus général sur ce qu'est le spam, mais il serait utile d'en avoir une définition explicite. Nous devrons le faire si nous voulons établir un corpus central du 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 de mon quartier apprenait que je cherchais un vieux Raleigh à trois vitesses en bon état et m'envoyait un courriel proposant de m'en vendre un, je serais ravi, et pourtant ce courriel 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 soit non sollicité, mais qu'il soit automatisé.
Il est également fortuit que le spam soit généralement de nature commerciale. Si quelqu'un envoyait des e-mails en masse pour soutenir une cause politique, par exemple, il s'agirait d'un spam tout aussi important que celui d'un e-mail faisant la promotion d'un site pornographique.
Je propose de définir le spam comme un courrier électronique automatisé non sollicité . Cette définition inclut donc certains courriers électroniques que de nombreuses définitions juridiques du spam n'incluent pas. Les définitions juridiques du spam, influencées vraisemblablement par les lobbyistes, tendent à exclure le courrier envoyé par des entreprises qui ont une « relation existante » avec le destinataire. Mais acheter quelque chose auprès d'une entreprise, par exemple, n'implique pas que vous ayez sollicité un courrier électronique continu de sa part. Si je commande quelque chose dans une boutique en ligne et qu'on m'envoie ensuite un flux de spam, cela reste du spam.
Les entreprises qui envoient des spams vous proposent souvent de vous « désabonner » ou vous demandent d'aller sur leur site et de modifier vos « préférences de compte » si vous ne voulez plus recevoir de spam. Cela ne suffit pas à empêcher que le courrier ne soit plus considéré comme du spam. Ne pas se désabonner n'est pas la même chose que s'inscrire. À moins que le destinataire n'ait coché explicitement une case clairement identifiée (dont la valeur par défaut était « non ») demandant à recevoir le courrier, il s'agit alors de spam.
Dans certaines relations commerciales, 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. Cela ne me dérange pas lorsque Verisign m'envoie un courrier m'avertissant qu'un nom de domaine est sur le point d'expirer (du moins, s'il s'agit du véritable registraire ). Mais lorsque Verisign m'envoie un courrier électronique proposant un guide GRATUIT pour créer 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 plus grande accessibilité. L'application décrite ici est celle que nous avons écrite afin de tester un nouveau dialecte Lisp appelé Arc qui n'est pas encore publié.
[2] Actuellement, le tarif le plus bas semble être d'environ 200 $ pour envoyer un million de spams. C'est très bon marché, 1/50e de cent par spam. Mais filtrer 95 % des spams, par exemple, multiplierait par 20 le coût des spammeurs pour atteindre une audience donnée. Rares sont ceux qui peuvent avoir des marges suffisamment importantes pour absorber cela.
[3] En règle générale, plus le nom d'un pays est précédé de qualificatifs, plus ses 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 avoir lu les brouillons de ce document ; à Daniel Giffin (qui écrit également l'interpréteur de production Arc) 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 mesures de confiance ; et à Chip Coldwell et Sam Steingold pour des conseils sur les statistiques.
Vous trouverez cet essai et 14 autres dans [
Hackers et peintres
](http://www.amazon.com/gp/product/0596006624) .
Plus d'infos :