Plan na Spam
Chcesz coś budować? Odwiedź Hacker News.
Sierpień 2002
(Ten artykuł opisuje techniki filtrowania spamu używane w czytniku poczty internetowej odpornym na spam, który zbudowaliśmy, aby ćwiczyć Arc. Ulepszony algorytm opisano w Lepsze filtrowanie bayesowskie.)
Myślę, że można powstrzymać spam i że filtry oparte na treści są do tego najlepszą drogą. Piętą achillesową spamerów jest ich wiadomość. Mogą oni obejść każdą inną barierę, którą postawisz. Do tej pory przynajmniej tak robili. Ale muszą dostarczyć swoją wiadomość, cokolwiek ona zawiera. Jeśli potrafimy napisać oprogramowanie, które rozpoznaje ich wiadomości, nie ma sposobu, aby mogli to obejść.
Dla odbiorcy spam jest łatwo rozpoznawalny. Gdybyś zatrudnił kogoś do czytania swojej poczty i wyrzucania spamu, miałby on niewiele problemów z wykonaniem tego zadania. Ile musimy zrobić, poza AI, aby zautomatyzować ten proces?
Myślę, że będziemy w stanie rozwiązać ten problem za pomocą dość prostych algorytmów. W rzeczywistości odkryłem, że można akceptowalnie dobrze filtrować obecny spam, używając niczego więcej niż bayesowskiej kombinacji prawdopodobieństw poszczególnych słów. Używając lekko dostosowanego (jak opisano poniżej) filtra bayesowskiego, obecnie przepuszczamy mniej niż 5 spamów na 1000, z 0 fałszywymi pozytywami.
Statystyczne podejście zazwyczaj nie jest pierwszym, którego ludzie próbują, pisząc filtry spamu. Pierwszą instynktowną reakcją większości hakerów jest próba napisania oprogramowania rozpoznającego indywidualne cechy spamu. Patrzysz na spamy i myślisz: cóż za bezczelność tych gości, że próbują wysyłać mi pocztę zaczynającą się od „Drogi Przyjacielu” lub z tematem napisany w całości wielkimi literami i zakończony ośmioma wykrzyknikami. Mogę odfiltrować takie rzeczy za pomocą około jednej linii kodu.
I tak robisz, i na początku to działa. Kilka prostych reguł pozwoli wyeliminować dużą część przychodzącego spamu. Samo szukanie słowa „kliknij” wyłapie 79,7% e-maili w moim korpusie spamu, z zaledwie 1,2% fałszywych pozytywów.
Spędziłem około sześciu miesięcy na pisaniu oprogramowania rozpoznającego indywidualne cechy spamu, zanim spróbowałem podejścia statystycznego. Odkryłem, że rozpoznanie tych ostatnich kilku procent spamu stało się bardzo trudne, a im bardziej zaostrzałem filtry, tym więcej miałem fałszywych pozytywów.
Fałszywe pozytywy to niewinne e-maile, które są błędnie identyfikowane jako spam. Dla większości użytkowników pominięcie legalnego e-maila jest o rząd wielkości gorsze niż otrzymanie spamu, więc filtr generujący fałszywe pozytywy jest jak lekarstwo na trądzik, które niesie ryzyko śmierci dla pacjenta.
Im więcej spamu otrzymuje użytkownik, tym mniej prawdopodobne jest, że zauważy jeden niewinny e-mail znajdujący się w jego folderze spamu. Co dziwne, im lepsze stają się filtry spamu, tym bardziej niebezpieczne stają się fałszywe pozytywy, ponieważ gdy filtry są naprawdę dobre, użytkownicy będą bardziej skłonni ignorować wszystko, co wyłapią.
Nie wiem, dlaczego tak długo unikałem podejścia statystycznego. Myślę, że wynikało to z mojego uzależnienia od samodzielnego identyfikowania cech spamu, jakbym grał w jakąś grę z spamerami. (Osoby niebędące hakerami często tego nie rozumieją, ale większość hakerów jest bardzo konkurencyjna.) Kiedy faktycznie spróbowałem analizy statystycznej, od razu odkryłem, że jest ona znacznie sprytniejsza ode mnie. Odkryła oczywiście, że terminy takie jak „virtumundo” i „teens” są dobrymi wskaźnikami spamu. Ale odkryła również, że „per” i „FL” i „ff0000” są dobrymi wskaźnikami spamu. W rzeczywistości „ff0000” (w HTMLu oznacza jaskrawą czerwień) okazuje się być tak dobrym wskaźnikiem spamu, jak każdy termin pornograficzny.
Oto szkic, jak wykonuję filtrowanie statystyczne. Zaczynam od jednego korpusu spamu i jednego korpusu nie-spamu. Obecnie każdy z nich zawiera około 4000 wiadomości. Skanuję cały tekst każdej wiadomości w każdym korpusie, w tym nagłówki i osadzony HTML i JavaScript. Obecnie uważam znaki alfanumeryczne, łączniki, apostrofy i znaki dolara za część tokenów, a wszystko inne za separatory tokenów. (Prawdopodobnie jest tu miejsce na poprawę.) Ignoruję tokeny składające się wyłącznie z cyfr, a także ignoruję komentarze HTML, nawet nie traktując ich jako separatorów tokenów.
Zliczam liczbę wystąpień każdego tokenu (ignorując wielkość liter) w każdym korpusie. Na tym etapie otrzymujemy dwie duże tablice skrótów, po jednej dla każdego korpusu, mapujące tokeny na liczbę wystąpień.
Następnie tworzę trzecią tablicę skrótów, tym razem mapującą każdy token na prawdopodobieństwo, że e-mail go zawierający jest spamem, które obliczam w następujący sposób [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))))))))) gdzie „word” to token, którego prawdopodobieństwo obliczamy, „good” i „bad” to tablice skrótów utworzone w pierwszym kroku, a „ngood” i „nbad” to odpowiednio liczba nie-spamów i spamów.
Wyjaśniłem to w formie kodu, aby pokazać kilka ważnych szczegółów. Chcę lekko odchylić prawdopodobieństwa, aby uniknąć fałszywych pozytywów, i metodą prób i błędów odkryłem, że dobrym sposobem na to jest podwojenie wszystkich liczb w „good”. Pomaga to odróżnić słowa, które sporadycznie występują w legalnych e-mailach, od słów, które prawie nigdy nie występują. Rozważam tylko słowa, które występują łącznie ponad pięć razy (w rzeczywistości, z powodu podwojenia, wystarczyłoby trzykrotne wystąpienie w nie-spamie). A potem pojawia się pytanie, jakie prawdopodobieństwo przypisać słowom, które występują w jednym korpusie, ale nie w drugim. Ponownie metodą prób i błędów wybrałem .01 i .99. Może być tu miejsce na dostosowanie, ale w miarę jak korpus będzie rósł, takie dostosowanie i tak nastąpi automatycznie.
Szczególnie spostrzegawczy zauważą, że chociaż traktuję każdy korpus jako pojedynczy długi strumień tekstu do celów zliczania wystąpień, używam liczby e-maili w każdym z nich, a nie ich łącznej długości, jako dzielnika przy obliczaniu prawdopodobieństw spamu. Dodaje to kolejne lekkie odchylenie w celu ochrony przed fałszywymi pozytywami.
Kiedy przychodzi nowa poczta, jest ona dzielona na tokeny, a piętnaście najbardziej interesujących tokenów, gdzie „interesujące” jest mierzone przez to, jak bardzo ich prawdopodobieństwo spamu odbiega od neutralnego .5, jest używane do obliczenia prawdopodobieństwa, że e-mail jest spamem. Jeśli „probs” to lista piętnastu indywidualnych prawdopodobieństw, obliczasz połączone prawdopodobieństwo w następujący sposób: (let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs))))) Jedno pytanie, które pojawia się w praktyce, to jakie prawdopodobieństwo przypisać słowu, którego nigdy wcześniej nie widzieliśmy, tj. takiemu, które nie występuje w tablicy skrótów prawdopodobieństw słów. Odkryłem, ponownie metodą prób i błędów, że .4 to dobra liczba do użycia. Jeśli nigdy wcześniej nie widziałeś słowa, jest ono prawdopodobnie dość niewinne; słowa spamowe są zazwyczaj zbyt dobrze znane.
Na końcu znajduje się dodatek z przykładami zastosowania tego algorytmu do rzeczywistych e-maili.
Traktuję pocztę jako spam, jeśli algorytm powyżej przypisuje jej prawdopodobieństwo ponad .9 bycia spamem. Ale w praktyce nie miałoby to większego znaczenia, gdzie umieściłbym ten próg, ponieważ niewiele prawdopodobieństw kończy się w środku zakresu.
Jedną z wielkich zalet podejścia statystycznego jest to, że nie trzeba czytać tylu spamów. Przez ostatnie sześć miesięcy przeczytałem dosłownie tysiące spamów, i jest to naprawdę demotywujące. Norbert Wiener powiedział, że jeśli konkurujesz z niewolnikami, sam stajesz się niewolnikiem, i jest coś podobnie degradującego w konkurowaniu ze spamerami. Aby rozpoznać indywidualne cechy spamu, trzeba próbować wejść w umysł spammera, a szczerze mówiąc, chcę spędzać jak najmniej czasu w umysłach spamerów.
Ale prawdziwą zaletą podejścia bayesowskiego jest oczywiście to, że wiesz, co mierzysz. Filtry rozpoznające cechy, takie jak SpamAssassin, przypisują e-mailom „wynik” spamu. Podejście bayesowskie przypisuje rzeczywiste prawdopodobieństwo. Problem z „wynikiem” polega na tym, że nikt nie wie, co on oznacza. Użytkownik nie wie, co on oznacza, ale co gorsza, także twórca filtra. Ile punktów powinien otrzymać e-mail za posiadanie słowa „sex” w treści? Prawdopodobieństwo może oczywiście być błędne, ale niewiele jest niejednoznaczności co do tego, co ono oznacza, lub jak należy łączyć dowody, aby je obliczyć. Na podstawie mojego korpusu słowo „sex” wskazuje na .97 prawdopodobieństwa, że zawierający e-mail jest spamem, podczas gdy „sexy” wskazuje na .99 prawdopodobieństwa. A reguła Bayesa, równie jednoznaczna, mówi, że e-mail zawierający oba słowa miałby, przy (mało prawdopodobnym) braku innych dowodów, 99,97% szans na bycie spamem.
Ponieważ mierzy prawdopodobieństwa, podejście bayesowskie uwzględnia wszystkie dowody w e-mailu, zarówno dobre, jak i złe. Słowa, które występują nieproporcjonalnie rzadko w spamie (jak „though” czy „tonight” czy „apparently”), przyczyniają się do zmniejszenia prawdopodobieństwa w takim samym stopniu, jak złe słowa, jak „unsubscribe” i „opt-in”, do jego zwiększenia. Więc pozornie niewinny e-mail, który przypadkowo zawiera słowo „sex”, nie zostanie oznaczony jako spam.
Idealnie oczywiście prawdopodobieństwa powinny być obliczane indywidualnie dla każdego użytkownika. Otrzymuję dużo e-maili zawierających słowo „Lisp”, a (jak dotąd) żaden spam. Więc takie słowo jest w zasadzie rodzajem hasła do wysyłania mi poczty. W moim wcześniejszym oprogramowaniu do filtrowania spamu użytkownik mógł ustawić listę takich słów, a poczta je zawierająca automatycznie przechodziła przez filtry. Na mojej liście umieściłem słowa takie jak „Lisp”, a także mój kod pocztowy, dzięki czemu (pozornie spamowe) potwierdzenia zamówień online przechodziły. Myślałem, że jestem bardzo sprytny, ale odkryłem, że filtr bayesowski zrobił to samo dla mnie, a ponadto odkrył wiele słów, o których nie pomyślałem.
Kiedy na początku powiedziałem, że nasze filtry przepuszczają mniej niż 5 spamów na 1000 z 0 fałszywych pozytywów, mówię o filtrowaniu mojej poczty na podstawie korpusu mojej poczty. Ale te liczby nie są mylące, ponieważ taki jest proponowany przeze mnie sposób: filtruj pocztę każdego użytkownika na podstawie spamu i nie-spamu, który otrzymuje. W zasadzie każdy użytkownik powinien mieć dwa przyciski usuwania: zwykłe usuwanie i usuń-jako-spam. Wszystko usunięte jako spam trafia do korpusu spamu, a wszystko inne do korpusu nie-spamu.
Można zacząć od filtra początkowego dla użytkowników, ale ostatecznie każdy użytkownik powinien mieć własne prawdopodobieństwa dla poszczególnych słów na podstawie faktycznej poczty, którą otrzymuje. To (a) sprawia, że filtry są skuteczniejsze, (b) pozwala każdemu użytkownikowi samodzielnie zdefiniować spam, i (c) co być może najważniejsze, utrudnia spamerom dostosowywanie e-maili, aby przeszły przez filtry. Jeśli duża część „mózgu” filtra znajduje się w indywidualnych bazach danych, to samo dostosowanie spamów do przejścia przez filtry początkowe nie zagwarantuje niczego co do tego, jak dobrze przejdą przez zróżnicowane i znacznie bardziej wytrenowane filtry poszczególnych użytkowników.
Filtrowanie spamu oparte na treści często łączy się z białymi listami, czyli listą nadawców, których poczta może być akceptowana bez filtrowania. Jednym z łatwych sposobów tworzenia takiej białej listy jest prowadzenie listy wszystkich adresów, na które użytkownik kiedykolwiek wysłał pocztę. Jeśli czytnik poczty ma przycisk usuń-jako-spam, można również dodać adres nadawcy każdego e-maila, który użytkownik usunął jako zwykły kosz.
Jestem zwolennikiem białych list, ale bardziej jako sposobu na oszczędność obliczeń niż na poprawę filtrowania. Kiedyś myślałem, że białe listy ułatwią filtrowanie, ponieważ trzeba by filtrować tylko e-maile od ludzi, o których nigdy nie słyszano, a ktoś wysyłający ci pocztę po raz pierwszy jest ograniczony konwencją w tym, co może ci powiedzieć. Ktoś, kogo już znasz, może wysłać ci e-mail o seksie, ale ktoś wysyłający ci pocztę po raz pierwszy prawdopodobnie by tego nie zrobił. Problem w tym, że ludzie mogą mieć więcej niż jeden adres e-mail, więc nowy adres nadawcy nie gwarantuje, że nadawca pisze do ciebie po raz pierwszy. Nie jest niczym niezwykłym, że stary przyjaciel (szczególnie jeśli jest hakerem) nagle wysyła ci e-mail z nowym adresem nadawcy, więc nie możesz ryzykować fałszywych pozytywów, filtrując pocztę od nieznanych adresów, zwłaszcza zbyt rygorystycznie.
W pewnym sensie jednak moje filtry same w sobie stanowią rodzaj białej listy (i czarnej listy), ponieważ opierają się na całych wiadomościach, w tym nagłówkach. W tym sensie „znają” adresy e-mail zaufanych nadawców, a nawet trasy, którymi poczta do mnie dociera. I wiedzą to samo o spamie, w tym nazwy serwerów, wersje programów pocztowych i protokoły.
Gdybym sądził, że uda mi się utrzymać obecne tempo filtrowania spamu, uznałbym ten problem za rozwiązany. Ale nie oznacza to wiele, że można odfiltrować większość obecnego spamu, ponieważ spam ewoluuje. Rzeczywiście, większość technik antyspamowych do tej pory była jak pestycydy, które nic więcej nie robią, niż tylko tworzą nowy, odporny szczep robaków.
Jestem bardziej optymistycznie nastawiony do filtrów bayesowskich, ponieważ ewoluują one wraz ze spamem. Więc gdy spamerzy zaczną używać „c0ck” zamiast „cock”, aby ominąć proste filtry spamu oparte na poszczególnych słowach, filtry bayesowskie automatycznie to zauważą. Rzeczywiście, „c0ck” jest znacznie bardziej obciążającym dowodem niż „cock”, a filtry bayesowskie wiedzą dokładnie, o ile bardziej.
Niemniej jednak, każdy, kto proponuje plan filtrowania spamu, musi być w stanie odpowiedzieć na pytanie: gdyby spamerzy wiedzieli dokładnie, co robisz, jak dobrze mogliby cię ominąć? Na przykład, myślę, że jeśli filtrowanie spamu oparte na sumach kontrolnych stanie się poważną przeszkodą, spamerzy po prostu przejdą na techniki generowania treści wiadomości w stylu „mad-lib”.
Aby pokonać filtry bayesowskie, nie wystarczyłoby, aby spamerzy uczynili swoje e-maile unikalnymi lub przestali używać poszczególnych „niegrzecznych” słów. Musieliby sprawić, by ich wiadomości były nieodróżnialne od twojej zwykłej poczty. A to, jak sądzę, bardzo by ich ograniczyło. Spam to głównie oferty sprzedażowe, więc chyba że twoja zwykła poczta to same oferty sprzedażowe, spamy nieuchronnie będą miały inny charakter. A spamerzy musieliby również, oczywiście, zmienić (i nadal zmieniać) całą swoją infrastrukturę, ponieważ w przeciwnym razie nagłówki wyglądałyby dla filtrów bayesowskich tak samo źle jak zawsze, niezależnie od tego, co zrobiliby z treścią wiadomości. Nie wiem wystarczająco dużo o infrastrukturze używanej przez spamerów, aby wiedzieć, jak trudno byłoby sprawić, by nagłówki wyglądały niewinnie, ale zgaduję, że byłoby to jeszcze trudniejsze niż sprawienie, by treść wyglądała niewinnie.
Zakładając, że mogliby rozwiązać problem nagłówków, spam przyszłości prawdopodobnie będzie wyglądał mniej więcej tak: „Hej. Pomyślałem, że powinieneś sprawdzić poniższe: http://www.27meg.com/foo”, ponieważ to mniej więcej tyle, ile spamerowi pozwoli filtr oparty na treści. (Rzeczywiście, nawet to będzie trudne do przepuszczenia przez filtry, ponieważ jeśli wszystko inne w e-mailu jest neutralne, prawdopodobieństwo spamu będzie zależeć od adresu URL, a jego neutralne przedstawienie będzie wymagało pewnego wysiłku.)
Spamerzy wahają się od firm prowadzących tzw. listy opt-in, które nawet nie próbują ukrywać swojej tożsamości, po gości, którzy przejmują serwery pocztowe, aby wysyłać spam reklamujący strony z pornografią. Jeśli użyjemy filtrowania, aby ograniczyć ich opcje do wiadomości takich jak powyższa, to powinno to praktycznie wyeliminować spamerów z „legalnego” końca spektrum; są oni zobowiązani różnymi przepisami prawa do dołączania standardowego tekstu wyjaśniającego, dlaczego ich spam nie jest spamem i jak anulować „subskrypcję”, a taki tekst jest łatwy do rozpoznania.
(Kiedyś myślałem, że naiwnością jest wierzyć, że ostrzejsze prawa zmniejszą spam. Teraz myślę, że chociaż ostrzejsze prawa mogą nie zmniejszyć ilości wysyłanego przez spamerów spamu, mogą one z pewnością pomóc filtrom zmniejszyć ilość spamu, którą faktycznie widzą odbiorcy.)
Na całym spektrum, jeśli ograniczysz oferty sprzedażowe, które spamerzy mogą składać, nieuchronnie zaczniesz ich eliminować z biznesu. To słowo biznes jest ważne do zapamiętania. Spamerzy to biznesmeni. Wysyłają spam, bo to działa. Działa, ponieważ chociaż wskaźnik odpowiedzi jest żenująco niski (w najlepszym wypadku 15 na milion, w porównaniu do 3000 na milion w przypadku wysyłki katalogowej), koszt dla nich jest praktycznie zerowy. Koszt dla odbiorców jest ogromny, około 5 roboczotygodni na każdy milion odbiorców, którzy poświęcają sekundę na usunięcie spamu, ale spamer nie musi za to płacić.
Wysłanie spamu kosztuje spamera coś jednak. [2] Więc im niższy wskaźnik odpowiedzi uda nam się osiągnąć – czy to przez filtrowanie, czy przez użycie filtrów do zmuszenia spamerów do rozcieńczenia ich ofert – tym mniej firm uzna, że warto wysyłać spam.
Powodem, dla którego spamerzy używają takich ofert sprzedażowych, jakie stosują, jest zwiększenie wskaźników odpowiedzi. To być może nawet bardziej obrzydliwe niż zaglądanie w umysł spammera, ale przyjrzyjmy się szybko umysłowi kogoś, kto odpowiada na spam. Ta osoba jest albo zdumiewająco łatwowierna, albo głęboko zaprzecza swoim zainteresowaniom seksualnym. W obu przypadkach, odrażający lub idiotyczny, jak nam się wydaje spam, dla nich jest ekscytujący. Spamerzy nie mówiliby tych rzeczy, gdyby nie brzmiały ekscytująco. A „pomyślałem, że powinieneś sprawdzić poniższe” nie będzie miało takiego przyciągania dla odbiorcy spamu, jak rzeczy, które spamerzy mówią teraz. Rezultat: jeśli nie może zawierać ekscytujących ofert sprzedażowych, spam staje się mniej skutecznym narzędziem marketingowym, a mniej firm chce z niego korzystać.
To jest ostatecznie wielka wygrana. Zacząłem pisać oprogramowanie do filtrowania spamu, ponieważ nie chciałem już na to patrzeć. Ale jeśli staniemy się wystarczająco dobrzy w filtrowaniu spamu, przestanie on działać, a spamerzy faktycznie przestaną go wysyłać.
Ze wszystkich podejść do walki ze spamem, od oprogramowania po prawa, wierzę, że filtrowanie bayesowskie będzie najskuteczniejsze. Ale myślę też, że im więcej różnych rodzajów działań antyspamowych podejmiemy, tym lepiej, ponieważ każdy środek ograniczający spamerów ułatwi filtrowanie. I nawet w ramach filtrowania opartego na treści, myślę, że dobrze byłoby, gdyby jednocześnie używano wielu różnych rodzajów oprogramowania. Im więcej różnych filtrów, tym trudniej będzie spamerom dostosować spam, aby przez nie przeszedł.
Dodatek: Przykłady filtrowania
Tutaj znajduje się przykład spamu, który dotarł podczas pisania tego artykułu. Piętnaście najbardziej interesujących słów w tym spamie to: qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg unsecured platinum 3d0 qves 7c5 7c266675 Słowa te to mieszanka rzeczy z nagłówków i treści wiadomości, co jest typowe dla spamu. Typowe dla spamu jest również to, że każde z tych słów ma w mojej bazie danych prawdopodobieństwo spamu wynoszące .99. W rzeczywistości istnieje więcej niż piętnaście słów z prawdopodobieństwem .99, a są to tylko pierwsze piętnaście znalezionych.
Niestety, czyni to ten e-mail nudnym przykładem zastosowania reguły Bayesa. Aby zobaczyć interesującą gamę prawdopodobieństw, musimy spojrzeć na ten faktycznie dość nietypowy spam.
Piętnaście najbardziej interesujących słów w tym spamie, wraz z ich prawdopodobieństwami, to: 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 Tym razem dowody są mieszane – dobre i złe. Słowo takie jak „shortest” jest niemal równie dowodem niewinności, jak słowo „madam” czy „promotion” jest dowodem winy. Ale przypadek winy jest nadal silniejszy. Jeśli połączymy te liczby zgodnie z regułą Bayesa, wynikowe prawdopodobieństwo wynosi .9027.
„Madam” pochodzi oczywiście ze spamów zaczynających się od „Szanowni Państwo”. Nie są one zbyt częste, ale słowo „madam” nigdy nie pojawia się w mojej legalnej poczcie, a wszystko sprowadza się do proporcji.
„Republic” ma wysoki wynik, ponieważ często pojawia się w nigeryjskich e-mailach z oszustwami, a także pojawia się raz lub dwa razy w spamach odnoszących się do Korei i Republiki Południowej Afryki. Można powiedzieć, że to przypadek, że pomaga to zidentyfikować ten spam. Ale analizując prawdopodobieństwa spamu, odkryłem, że jest wiele takich przypadków, i mają one niepokojącą tendencję do kierowania rzeczy we właściwym kierunku, a nie w złym. W tym przypadku nie jest to całkowity przypadek, że słowo „Republic” pojawia się w nigeryjskich e-mailach z oszustwami i w tym spamie. Istnieje cała klasa wątpliwych propozycji biznesowych związanych z mniej rozwiniętymi krajami, a te z kolei częściej mają nazwy, które wyraźnie określają (ponieważ nimi nie są), że są republikami.[3]
Z drugiej strony, „enter” to prawdziwa pomyłka. Pojawia się głównie w instrukcjach rezygnacji z subskrypcji, ale tutaj jest używane w całkowicie niewinny sposób. Na szczęście podejście statystyczne jest dość solidne i może tolerować sporo pomyłek, zanim wyniki zaczną być zaburzone.
Dla porównania, tutaj jest przykład tego rzadkiego ptaka, spamu, który przechodzi przez filtry. Dlaczego? Ponieważ przez czysty przypadek jest on załadowany słowami, które pojawiają się w mojej faktycznej poczcie: 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 Jest tu kilka dobrych wiadomości. Po pierwsze, ta poczta prawdopodobnie nie przeszłaby przez filtry kogoś, kto nie specjalizowałby się w językach programowania i nie miałby dobrego przyjaciela o imieniu Morris. Dla przeciętnego użytkownika wszystkie pięć najczęściej występujących słów byłoby neutralnych i nie przyczyniałoby się do prawdopodobieństwa spamu.
Po drugie, myślę, że filtrowanie oparte na parach słów (patrz niżej) mogłoby to wyłapać: „cost effective”, „setup fee”, „money back” – dość obciążające rzeczy. I oczywiście, gdyby nadal spamowali mnie (lub sieć, do której należałem), sam „Hostex” zostałby rozpoznany jako termin spamowy.
Na koniec, tutaj jest niewinny e-mail. Jego piętnaście najbardziej interesujących słów to:
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
Większość słów tutaj wskazuje, że e-mail jest niewinny. Są dwa „podejrzane” słowa: „color” (spamerzy uwielbiają kolorowe czcionki) i „California” (które pojawia się w referencjach, a także w menu formularzy), ale nie wystarczą one, aby zniwelować oczywiste niewinne słowa, takie jak „continuation” i „example”.
Ciekawe, że „describe” jest uważane za tak całkowicie niewinne. Nie pojawiło się w żadnym z moich 4000 spamów. Dane okazują się pełne takich niespodzianek. Jedną z rzeczy, których uczysz się analizując teksty spamów, jest to, jak wąski podzbiór języka używają spamerzy. To właśnie ten fakt, wraz z równie charakterystycznym słownictwem poczty każdego indywidualnego użytkownika, sprawia, że filtrowanie bayesowskie jest dobrym rozwiązaniem.
Dodatek: Więcej pomysłów
Jednym z pomysłów, którego jeszcze nie wypróbowałem, jest filtrowanie na podstawie par słów, a nawet trójek, zamiast pojedynczych słów. Powinno to dać znacznie dokładniejsze oszacowanie prawdopodobieństwa. Na przykład, w mojej obecnej bazie danych słowo „offers” ma prawdopodobieństwo .96. Gdyby prawdopodobieństwa opierały się na parach słów, „special offers” i „valuable offers” miałyby prawdopodobieństwa .99, a „approach offers” (jak w „this approach offers”) miałoby prawdopodobieństwo .1 lub mniej.
Powodem, dla którego tego nie zrobiłem, jest to, że filtrowanie oparte na pojedynczych słowach już działa tak dobrze. Ale oznacza to, że jest miejsce na zaostrzenie filtrów, jeśli spam stanie się trudniejszy do wykrycia. (Co ciekawe, filtr oparty na parach słów byłby w efekcie generatorem tekstu łańcucha Markowa działającym wstecz.)
Konkretne cechy spamu (np. brak adresu odbiorcy w polu „to:”) oczywiście mają wartość w rozpoznawaniu spamu. Mogą być uwzględnione w tym algorytmie poprzez traktowanie ich jako wirtualnych słów. Prawdopodobnie zrobię to w przyszłych wersjach, przynajmniej dla garstki najbardziej rażących wskaźników spamu. Filtry spamu rozpoznające cechy mają wiele trafnych szczegółów; brakuje im jedynie ogólnej dyscypliny w łączeniu dowodów.
Rozpoznawanie cech nie-spamu może być ważniejsze niż rozpoznawanie cech spamu. Fałszywe pozytywy są tak dużym zmartwieniem, że wymagają nadzwyczajnych środków. Prawdopodobnie w przyszłych wersjach dodam drugi poziom testowania zaprojektowany specjalnie w celu unikania fałszywych pozytywów. Jeśli e-mail wywoła ten drugi poziom filtrów, zostanie zaakceptowany, nawet jeśli jego prawdopodobieństwo spamu przekroczy próg.
Nie spodziewam się, że ten drugi poziom filtrowania będzie bayesowski. Będzie on nieuchronnie nie tylko ad hoc, ale oparty na przypuszczeniach, ponieważ liczba fałszywych pozytywów nie będzie wystarczająco duża, aby zauważyć wzorce. (Tak czy inaczej, dobrze, jeśli system zapasowy nie opiera się na tej samej technologii co system główny.)
Inną rzeczą, którą mogę wypróbować w przyszłości, jest skupienie dodatkowej uwagi na konkretnych częściach e-maila. Na przykład, około 95% obecnego spamu zawiera adres URL strony, którą chcą, abyśmy odwiedzili. (Pozostałe 5% chce, abyśmy zadzwonili pod numer telefonu, odpowiedzieli e-mailem lub na adres poczty w USA, lub w kilku przypadkach kupili określony akcje.) Adres URL jest w takich przypadkach praktycznie wystarczający sam w sobie do określenia, czy e-mail jest spamem.
Nazwy domen różnią się od reszty tekstu w e-mailu (nie-niemieckim) tym, że często składają się z kilku słów połączonych ze sobą. Chociaż jest to kosztowne obliczeniowo w ogólnym przypadku, może warto spróbować je rozłożyć. Jeśli filtr nigdy wcześniej nie widział tokenu „xxxporn”, będzie miał indywidualne prawdopodobieństwo spamu .4, podczas gdy „xxx” i „porn” indywidualnie mają prawdopodobieństwa (w moim korpusie) .9889 i .99, a połączone prawdopodobieństwo .9998.
Spodziewam się, że rozkładanie nazw domen stanie się ważniejsze, ponieważ spamerzy będą stopniowo zmuszani do zaprzestania używania obciążających słów w treści swoich wiadomości. (Adres URL z adresem IP jest oczywiście niezwykle obciążającym znakiem, z wyjątkiem poczty kilku administratorów systemów.)
Mogłoby być dobrym pomysłem posiadanie wspólnie utrzymywanej listy adresów URL promowanych przez spamerów. Potrzebowalibyśmy metryki zaufania typu badanego przez Raph Levien, aby zapobiec złośliwym lub niekompetentnym zgłoszeniom, ale gdybyśmy coś takiego mieli, zapewniłoby to impuls dla każdego oprogramowania filtrującego. Byłaby to również wygodna podstawa do bojkotów.
Innym sposobem testowania wątpliwych adresów URL byłoby wysłanie robota, aby sprawdził stronę przed tym, jak użytkownik spojrzy na e-mail, który ją wspomina. Można by użyć filtra bayesowskiego do oceny strony, tak jak e-maila, a wszystko, co znaleziono na stronie, można by uwzględnić w obliczaniu prawdopodobieństwa, że e-mail jest spamem. Adres URL prowadzący do przekierowania byłby oczywiście szczególnie podejrzany.
Jednym ze wspólnych projektów, który moim zdaniem byłby naprawdę dobrym pomysłem, byłoby zgromadzenie gigantycznego korpusu spamu. Duży, czysty korpus jest kluczem do dobrego działania filtrowania bayesowskiego. Filtry bayesowskie mogłyby faktycznie wykorzystać korpus jako dane wejściowe. Ale taki korpus byłby również użyteczny dla innych rodzajów filtrów, ponieważ można by go użyć do ich testowania.
Tworzenie takiego korpusu stwarza pewne problemy techniczne. Potrzebowalibyśmy metryk zaufania, aby zapobiec złośliwym lub niekompetentnym zgłoszeniom, oczywiście. Potrzebowalibyśmy również sposobów na usuwanie informacji osobistych (nie tylko adresów „to” i „cc”, ale także np. argumentów w adresach URL do anulowania subskrypcji, które często kodują adres „to”) z wiadomości w korpusie. Jeśli ktoś chce podjąć się tego projektu, byłoby to dobre dla świata.
Dodatek: Definicja spamu
Myślę, że istnieje ogólny konsensus co do tego, czym jest spam, ale byłoby przydatne mieć jasną definicję. Będziemy musieli to zrobić, jeśli chcemy ustanowić centralny korpus spamu, a nawet sensownie porównywać wskaźniki filtrowania spamu.
Na początek spam nie jest niechcianym e-mailem komercyjnym. Gdyby ktoś w mojej okolicy usłyszał, że szukam starego roweru Raleigh trzybiegowego w dobrym stanie i wysłał mi e-mail z ofertą sprzedaży go, byłbym zachwycony, a jednak ten e-mail byłby zarówno komercyjny, jak i niechciany. Definiującą cechą spamu (w rzeczywistości jego raison d'etre) nie jest to, że jest niechciany, ale że jest zautomatyzowany.
Jest również jedynie przypadkowe, że spam jest zazwyczaj komercyjny. Gdyby ktoś zaczął masowo wysyłać e-maile w celu wsparcia jakiejś przyczyny politycznej, na przykład, byłoby to tyle samo spamu, co e-maile promujące strony z pornografią.
Proponuję zdefiniować spam jako niechciany zautomatyzowany e-mail. Ta definicja obejmuje zatem niektóre e-maile, których wiele definicji prawnych spamu nie obejmuje. Definicje prawne spamu, prawdopodobnie pod wpływem lobbystów, mają tendencję do wykluczania poczty wysyłanej przez firmy, które mają „istniejącą relację” z odbiorcą. Ale kupowanie czegoś od firmy, na przykład, nie oznacza, że zasolicytowaliście bieżącą pocztę od nich. Jeśli zamówię coś w sklepie internetowym, a oni następnie wyślą mi strumień spamu, to nadal jest spam.
Firmy wysyłające spam często dają możliwość „anulowania subskrypcji” lub proszą o przejście na ich stronę i zmianę „preferencji konta”, jeśli chcesz przestać otrzymywać spam. To nie wystarczy, aby przestać otrzymywać spam. Nie rezygnacja z subskrypcji nie jest tym samym co zapisanie się. Chyba że odbiorca wyraźnie zaznaczył pole (którego domyślnie było „nie”) z prośbą o otrzymanie e-maila, to jest to spam.
W niektórych relacjach biznesowych faktycznie domyślnie solicytujesz pewne rodzaje poczty. Kiedy zamawiasz online, myślę, że domyślnie solicytujesz potwierdzenie odbioru i powiadomienie o wysyłce zamówienia. Nie mam nic przeciwko, gdy Verisign wysyła mi e-mail z ostrzeżeniem, że nazwa domeny wkrótce wygaśnie (przynajmniej jeśli są oni rzeczywistym rejestratorem dla niej). Ale kiedy Verisign wysyła mi e-mail z ofertą DARMOWEGO Przewodnika po Budowaniu Mojej Witryny E-Commerce, to jest spam.
Przypisy:
[1] Przykłady w tym artykule są przetłumaczone na Common Lisp dla, wierzcie lub nie, większej dostępności. Opisana tutaj aplikacja jest jedną z tych, które napisaliśmy, aby przetestować nowy dialekt Lispa o nazwie Arc, który nie został jeszcze wydany.
[2] Obecnie najniższa stawka wynosi około 200 dolarów za wysłanie miliona spamów. To bardzo tanio, 1/50 centa za spam. Ale odfiltrowanie 95% spamu, na przykład, zwiększyłoby koszt spamerów dotarcia do danej grupy odbiorców dwudziestokrotnie. Niewielu może mieć wystarczająco wysokie marże, aby to wchłonąć.
[3] Jako reguła kciuka, im więcej kwalifikatorów przed nazwą kraju, tym bardziej skorumpowani są władcy. Kraj o nazwie Socjalistyczna Ludowa Demokratyczna Republika X jest prawdopodobnie ostatnim miejscem na świecie, w którym chciałbyś mieszkać.
Podziękowania dla Sarah Harlin za przeczytanie wersji roboczych tego artykułu; Daniela Giffina (który pisze również produkcyjny interpreter Arc) za kilka dobrych pomysłów na filtrowanie i za stworzenie naszej infrastruktury pocztowej; Roberta Morrisa, Trevora Blackwell i Eranna Gat za wiele dyskusji na temat spamu; Raph Levien za rady dotyczące metryk zaufania; oraz Chip Coldwell i Sam Steingold za rady dotyczące statystyki.
Ten esej i 14 innych znajdziesz w Hackers & Painters.
Więcej informacji: