UN PLAN CONTRE LE SPAM
OriginalAugust 2002
(Cet article décrit les techniques de filtrage de spam utilisées dans le lecteur de mail basé sur le web que nous avons construit pour tester 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 solution. Le talon d'Achille des spammeurs est leur message. Ils peuvent contourner n'importe quelle autre barrière que vous mettez en place. Du moins, c'est ce qu'ils ont fait jusqu'à présent. 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 qu'ils puissent 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 guère de mal à le faire. Que devons-nous faire, en dehors de l'IA, pour automatiser ce processus ?
Je pense que nous serons capables de résoudre le problème avec des algorithmes assez simples. En fait, j'ai découvert que vous pouvez filtrer le spam d'aujourd'hui 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 pour 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 hackers est d'essayer d'écrire un logiciel qui reconnaît les propriétés individuelles du spam. Vous regardez des spams et vous pensez, le culot de ces gars à essayer de m'envoyer un mail qui commence par "Cher ami" ou qui a un objet entièrement en majuscules et se termine par huit points d'exclamation. Je peux filtrer ce genre de choses avec environ une ligne de code.
Et donc vous le faites, et au début ça fonctionne. Quelques règles simples vont réduire considérablement votre spam entrant. Il suffit de chercher le mot "cliquez" pour attraper 79,7 % des e-mails dans mon corpus de spam, avec seulement 1,2 % de faux positifs.
J'ai passé environ six mois à écrire un logiciel qui cherchait des caractéristiques individuelles du spam avant d'essayer l'approche statistique. Ce que j'ai trouvé, c'est que reconnaître ces derniers pour cent 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 par erreur comme des spams. Pour la plupart des utilisateurs, manquer un e-mail légitime est d'un ordre de grandeur pire que de recevoir du spam, donc un filtre qui produit des faux positifs est comme un traitement 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 se trouvant dans son dossier de spam. Et étrangement, plus vos filtres anti-spam s'améliorent, 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 si longtemps. Je pense que c'était parce que je suis devenu accro à l'identification des caractéristiques du spam moi-même, comme si je jouais à un 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 découvert qu'elle était beaucoup plus astucieuse que moi. Elle a découvert, bien sûr, que des termes comme "virtumundo" et "teens" étaient de bons indicateurs de spam. Mais elle a également 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 aussi bon un 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 mail non-spam. Pour le moment, chacun a environ 4000 messages. Je scanne tout le texte, y compris les en-têtes et le html et javascript intégrés, de chaque message dans chaque corpus. Je considère actuellement les caractères alphanumériques, les tirets, les apostrophes et les signes dollar comme faisant partie des tokens, et tout le reste comme un séparateur de token. (Il y a probablement de la place pour l'amélioration ici.) J'ignore les tokens qui sont tous des chiffres, et j'ignore également les commentaires html, ne les considérant même pas comme des séparateurs de token.
Je compte le nombre de fois que chaque token (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, mappant les tokens au nombre d'occurrences.
Ensuite, je crée une troisième table de hachage, cette fois mappant chaque token à la probabilité qu'un e-mail contenant ce token 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 token dont nous calculons la probabilité, good et bad sont les tables de hachage que j'ai créées à l'étape précédente, 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 légèrement biaiser les probabilités pour éviter les faux positifs, et par essais et erreurs, j'ai trouvé qu'un bon moyen de le faire est de doubler tous les nombres dans good. Cela aide à distinguer entre les mots qui apparaissent occasionnellement dans des e-mails 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, à cause du doublement, apparaître trois fois dans des mails non-spam suffirait). Et ensuite, 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 .01 et .99. Il peut y avoir de la place pour un réglage ici, 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 long flux de texte unique 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 protéger contre les faux positifs.
Lorsque de nouveaux mails arrivent, ils sont scannés en tokens, et les quinze tokens les plus intéressants, où l'intérêt est mesuré par la distance de leur probabilité de spam par rapport à un .5 neutre, sont utilisés pour calculer la probabilité que le mail 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 en pratique est 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 des mots. J'ai trouvé, encore une fois par essais et erreurs, que .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 existe des exemples de cet algorithme appliqué à des e-mails réels dans une annexe à la fin.
Je considère un mail comme spam si l'algorithme ci-dessus lui attribue une probabilité de plus de .9 d'être un spam. Mais en pratique, cela 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 littéralement lu 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 des spammeurs. Pour reconnaître les caractéristiques individuelles du spam, vous devez essayer de vous mettre 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, 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 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 que cela signifie, ou comment les preuves doivent être combinées pour le calculer. Basé sur 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, également sans ambiguïté, dit qu'un e-mail contenant les deux mots aurait, en l'absence (improbable) de toute autre preuve, 99,97 % de chances d'être un spam.
Parce qu'il mesure des probabilités, l'approche bayésienne considère toutes les preuves dans l'e-mail, bonnes et 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ésinscrire" et "optez pour" à l'augmenter. Ainsi, un e-mail autrement innocent qui inclut 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 ça est effectivement une sorte de mot de passe pour m'envoyer des mails. Dans mon ancien logiciel de filtrage de spam, l'utilisateur pouvait établir une liste de tels mots et les mails les contenant passaient automatiquement les filtres. Sur ma liste, j'ai mis des mots comme "Lisp" et aussi mon code postal, afin que les reçus (qui sonnent autrement assez spammy) des commandes en ligne passent. Je pensais que j'étais très intelligent, mais j'ai découvert 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 laissaient passer moins de 5 spams pour 1000 avec 0 faux positifs, je parle de filtrage de mon courrier basé 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 basé sur le spam et le mail non-spam qu'il reçoit. Essentiellement, chaque utilisateur devrait avoir deux boutons de suppression, suppression ordinaire et suppression en tant que spam. Tout ce qui est supprimé comme spam va dans le corpus de spam, et tout le reste va dans le corpus 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 mail 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 mieux encore, rend difficile pour les spammeurs de régler les mails pour passer à travers les filtres. Si une grande partie du cerveau du filtre se trouve dans les bases de données individuelles, alors simplement régler 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 des utilisateurs individuels.
Le filtrage de spam basé sur le contenu est souvent combiné avec une liste blanche, une liste d'expéditeurs dont le mail peut être accepté sans filtrage. Une façon simple de construire une telle liste blanche est de garder une liste de chaque adresse à laquelle l'utilisateur a déjà envoyé un mail. Si un lecteur de mail a un bouton de suppression en tant que spam, vous pourriez également ajouter l'adresse de chaque e-mail que l'utilisateur a supprimé comme 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 faciliteraient le filtrage, car vous n'auriez qu'à filtrer les e-mails des personnes dont vous n'aviez jamais entendu parler, et quelqu'un qui vous envoie un mail pour la première fois est contraint par 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 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 d'expéditeur ne garantit pas que l'expéditeur vous écrit pour la première fois. Il n'est pas inhabituel qu'un vieil ami (surtout s'il est hacker) vous envoie soudainement un e-mail avec une nouvelle adresse d'expéditeur, donc vous ne pouvez pas risquer de faux positifs en filtrant les mails d'adresses inconnues de manière particulièrement stricte.
Dans un sens, cependant, mes filtres incarnent eux-mêmes une sorte de liste blanche (et noire) parce qu'ils sont basés sur des messages entiers, y compris les en-têtes. Donc, à cet égard, ils "savent" les adresses e-mail des expéditeurs de confiance et même les routes par lesquelles le mail parvient à moi. Et ils savent la même chose sur le spam, y compris les noms de serveurs, les versions de mailers et les protocoles.
Si je pensais que je pouvais maintenir les taux actuels de filtrage de spam, je considérerais ce problème comme résolu. Mais cela ne signifie pas 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 de créer une nouvelle souche résistante de bugs.
Je suis plus optimiste quant aux filtres bayésiens, car ils évoluent avec le spam. Ainsi, à mesure que les spammeurs commencent à utiliser "c0ck" au lieu de "cock" pour échapper à des filtres anti-spam simplistes basés sur des mots individuels, les filtres bayésiens le remarquent automatiquement. En effet, "c0ck" est une preuve beaucoup plus accablante que "cock", et les filtres bayésiens savent précisément combien cela l'est.
Pourtant, quiconque propose un plan de filtrage de spam doit être capable de répondre à la question : si les spammeurs savaient exactement ce que vous faisiez, à quel point pourraient-ils vous contourner ? Par exemple, je pense que si le filtrage de spam basé sur les sommes de contrôle devient un obstacle sérieux, les spammeurs passeront simplement à des techniques de mad-lib pour générer des 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 individuels inappropriés. Ils devraient rendre leurs mails indiscernables de votre mail ordinaire. Et cela, je pense, les contraindra sévèrement. Le spam est principalement des arguments de vente, donc à moins que votre mail régulier ne soit que des arguments 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 sembleraient aussi mauvais pour les filtres bayésiens que jamais, peu importe ce qu'ils faisaient au corps du message. Je ne sais pas assez sur l'infrastructure que les spammeurs utilisent pour savoir à quel point il serait difficile de rendre les en-têtes innocents, mais je parie que ce serait encore plus difficile que de rendre le message innocent.
En supposant qu'ils puissent résoudre le problème des en-têtes, le spam du futur ressemblera probablement à quelque chose comme ceci :
Salut. Je pensais que vous devriez consulter ce qui suit : http://www.27meg.com/foo
car c'est à peu près autant d'argument de vente que le filtrage basé sur le contenu laissera au spammeur. (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 dépendra de l'url, et il faudra un certain effort pour rendre cela neutre.)
Les spammeurs vont des entreprises qui gèrent des listes dites opt-in qui n'essaient même pas de dissimuler leur identité, aux gars qui détournent des serveurs de mail pour envoyer des spams promouvant des sites pornographiques. Si nous utilisons le filtrage pour réduire leurs options à des mails comme celui ci-dessus, cela devrait pratiquement mettre les spammeurs à l'extrémité "légitime" du spectre hors d'affaires ; ils se sentent obligés par diverses lois d'État d'inclure des mentions sur pourquoi leur spam n'est pas du spam, et comment annuler votre "abonnement", et ce genre 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 bien que des lois plus strictes ne diminuent peut-être pas 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 arguments de vente que les spammeurs peuvent faire, vous aurez inévitablement tendance à les mettre hors d'affaires. Ce mot affaires est un mot important à retenir. Les spammeurs sont des hommes d'affaires. Ils envoient du spam parce que cela fonctionne. Cela fonctionne parce que, bien que le taux de réponse soit abominablement bas (au mieux 15 pour un million, contre 3000 pour un 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 cela.
Envoyer du spam coûte cependant quelque chose au spammeur. [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 arguments - moins d'entreprises trouveront cela rentable d'envoyer du spam.
La raison pour laquelle les spammeurs utilisent les types de arguments de vente qu'ils font est d'augmenter les taux de réponse. C'est peut-être même plus dégoûtant que de se mettre dans l'esprit d'un spammeur, mais jetons un coup d'œil rapide dans l'esprit de quelqu'un qui répond à un spam. Cette personne est soit incroyablement crédule, soit profondément dans le déni concernant 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 si elles ne semblaient pas excitantes. Et "je pensais que vous devriez consulter ce qui suit" n'aura tout simplement pas le même attrait pour le destinataire de spam que les types de choses que les spammeurs disent maintenant. Résultat : si cela ne peut pas contenir d'arguments de vente excitants, le spam devient moins efficace en tant que véhicule marketing, et moins d'entreprises veulent l'utiliser.
C'est le grand gain à la fin. J'ai commencé à écrire un logiciel de filtrage de spam parce que je ne voulais plus avoir à regarder ces choses. Mais si nous devenons suffisamment bons pour filtrer le spam, cela cessera de fonctionner, et les spammeurs arrêteront réellement de l'envoyer.
De toutes les approches pour lutter contre le spam, des logiciels aux lois, je crois que le filtrage bayésien sera le plus efficace. Mais je pense aussi que plus nous entreprenons de différents types d'efforts anti-spam, mieux c'est, car toute mesure qui contraint les spammeurs tendra à faciliter le filtrage. Et même au sein du monde du filtrage basé sur le contenu, je pense qu'il sera bon qu'il y ait de nombreux types de logiciels 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 passer à travers eux.
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 dans 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. Également typique du spam est que chacun de ces mots a une probabilité de spam, dans ma base de données, de .99. En fait, il y a plus de quinze mots avec des probabilités de .99, et ce sont juste les quinze premiers vus.
Malheureusement, cela rend 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 ce spam qui est en fait assez atypique.
Les quinze mots les plus intéressants dans 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 "shortest" est presque autant une preuve d'innocence qu'un mot comme "madam" ou "promotion" l'est de culpabilité. Mais la preuve de culpabilité est tout de même plus forte. Si vous combinez ces chiffres selon la règle de Bayes, la probabilité résultante est de .9027.
"Madam" provient évidemment de spams commençant par "Cher Monsieur ou Madame." Ils ne sont pas très courants, mais le mot "madam" n'apparaît jamais dans mes e-mails légitimes, et tout est une question de ratio.
"Republic" obtient un score élevé car il apparaît souvent dans des e-mails d'escroquerie nigérians, et apparaît également une ou deux fois dans des 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 trouvé en examinant les probabilités de spam qu'il y a beaucoup de ces accidents, et ils ont une tendance troublante à 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 des 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, et celles-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 un véritable échec. Il apparaît principalement dans des instructions de désinscription, mais ici il est utilisé de manière complètement innocente. Heureusement, l'approche statistique est assez robuste et peut tolérer pas mal d'échecs avant que les résultats commencent à être faussés.
Pour comparaison, ici est un exemple de cet oiseau rare, un spam qui passe à travers les filtres. Pourquoi ? Parce que par pur hasard, il se trouve 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 quelques bonnes nouvelles ici. Tout d'abord, cet e-mail ne passerait probablement pas à travers les filtres de quelqu'un qui ne s'est pas spécialisé dans les langages de programmation et n'a pas un bon ami appelé Morris. Pour l'utilisateur moyen, tous 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", "garantie de remboursement" - des choses plutôt accablantes. 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 se trouve 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 mail est innocent. Il y a deux mots malodorants, "color" (les spammeurs adorent les polices colorées) et "California" (qui apparaît dans des témoignages et aussi dans des menus dans des formulaires), mais ils ne sont pas suffisants pour l'emporter sur des mots manifestement innocents comme "continuation" et "example".
Il est intéressant que "describe" soit noté comme si innocent. Il n'est pas apparu dans un seul de mes 4000 spams. Les données s'avèrent pleines de telles surprises. L'une des choses que vous apprenez en analysant les textes de spam est à quel point un sous-ensemble du langage dans lequel les spammeurs opèrent est étroit. C'est ce fait, associé à l'également caractéristique vocabulaire du mail de chaque utilisateur individuel, qui rend le 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 des paires de mots, voire des triples, plutôt qu'en fonction 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 "offres" a une probabilité de .96. Si vous basiez les probabilités sur des paires de mots, vous finiriez avec "offres spéciales" et "offres précieuses" ayant des probabilités de .99 et, disons, "approche offres" (comme dans "cette approche offre") ayant une probabilité de .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îne de Markov fonctionnant à l'envers.)
Des caractéristiques spécifiques du spam (par exemple, ne pas voir l'adresse du destinataire dans le champ à :) ont bien sûr de la valeur pour reconnaître le spam. Elles peuvent être considérées dans cet algorithme en les traitant comme des mots virtuels. Je vais probablement faire cela dans les futures versions, au moins pour une poignée des indicateurs de spam les plus flagrants. Les filtres de spam de reconnaissance de 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 de spam. Les faux positifs sont une telle préoccupation qu'ils exigent des mesures extraordinaires. Je vais probablement dans les futures versions ajouter un second niveau de test conçu spécifiquement pour éviter les faux positifs. Si un mail déclenche ce second niveau de filtres, il sera accepté même si sa probabilité de spam est au-dessus du seuil.
Je ne m'attends pas à ce que ce second 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 ne tendra pas à être suffisamment grand pour remarquer des motifs. (C'est tout aussi bien, 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 pourrais essayer à l'avenir est de porter une attention particulière à des parties spécifiques de l'e-mail. 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, répondiez par e-mail ou à une adresse postale américaine, ou dans quelques cas, achetiez une certaine action.) L'url est dans de tels cas pratiquement suffisante en elle-même 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 consistent souvent en plusieurs mots collés ensemble. Bien que coûteux en calcul dans le cas général, cela pourrait valoir la peine d'essayer de les décomposer. Si un filtre n'a jamais vu le token "xxxporn" auparavant, il aura une probabilité de spam individuelle de .4, tandis que "xxx" et "porn" ont respectivement des probabilités (dans mon corpus) de .9889 et .99, et une probabilité combinée de .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 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 mail de quelques sysadmins.)
Il pourrait être judicieux d'avoir une liste maintenue de manière coopérative d'urls promues par des spammeurs. Nous aurions besoin d'une métrique de confiance du type étudié par Raph Levien pour prévenir les soumissions malveillantes ou incompétentes, mais si nous avions une telle chose, cela fournirait un coup de pouce à tout logiciel de filtrage. Cela constituerait également une base pratique pour des boycotts.
Une autre façon de tester des urls douteuses serait d'envoyer un crawler 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 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 menait à 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 énorme corpus de spam. Un grand corpus propre est la clé pour faire fonctionner le filtrage bayésien efficacement. 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.
Créer un tel corpus pose certains problèmes techniques. Nous aurions besoin de métriques de confiance pour prévenir les soumissions malveillantes ou incompétentes, bien sûr. Nous aurions également besoin de moyens pour effacer les informations personnelles (pas seulement les adresses à et ccs, mais aussi par exemple les arguments des urls de désinscription, qui codent souvent l'adresse à) des mails dans le corpus. Si quelqu'un veut prendre en charge 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 pour comparer significativement les taux de filtrage de spam.
Pour commencer, le spam n'est pas un e-mail commercial non sollicité. Si quelqu'un dans mon quartier entendait que je cherchais un vieux Raleigh à trois vitesses en bon état, et m'envoyait un e-mail pour m'en proposer un, je 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 promouvant un site pornographique.
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 n'incluent pas. Les définitions légales du spam, influencées probablement par des lobbyistes, tendent à exclure les mails envoyés par des entreprises ayant une "relation existante" avec le destinataire. Mais acheter quelque chose à une entreprise, par exemple, n'implique pas que vous ayez sollicité des e-mails continus de leur part. Si je commande quelque chose dans un magasin en ligne, et qu'ils m'envoient ensuite un flux de spam, c'est toujours du spam.
Les entreprises envoyant du spam vous donnent souvent un moyen de "se désinscrire", 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 à empêcher le mail d'être du spam. Ne pas se désinscrire n'est pas la même chose que de s'inscrire. À moins que le destinataire n'ait explicitement coché une case clairement étiquetée (dont le défaut était non) demandant à recevoir l'e-mail, alors c'est du spam.
Dans certaines relations commerciales, vous sollicitez implicitement certains types de mails. 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 mail m'avertissant qu'un nom de domaine est sur le point d'expirer (du moins, s'ils sont le vrai registraire pour cela). Mais lorsque Verisign m'envoie un e-mail offrant un GUIDE GRATUIT pour construire mon site web de commerce électronique, c'est du spam.
Notes :
[1] Les exemples dans 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 pour tester un nouveau dialecte de 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 cent par spam. Mais filtrer 95 % du spam, par exemple, augmenterait le coût pour les spammeurs d'atteindre un public donné par un facteur de 20. Peu peuvent avoir des marges suffisamment grandes 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.
Remerciements à Sarah Harlin pour avoir lu des brouillons de ceci ; 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 mail ; 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