minas_a (minas_a) wrote,
minas_a
minas_a

Categories:

План для спама - Пол Грэм, 2002, перевод на русский. Часть 1/3

План для спама. Пол Грэм, Август 2002
 Перевод на русский - Minas Abrahamyan, 2015
 Оригинал "A Plan for Spam - Paul Graham, 2002" тут: http://www.paulgraham.com/spam.html
 часть 1/3

 (Эта статья описывает техники фильтрации спама, используемые в спамоустойчивой читалке веб-почты, которую мы создали для тренировки языка программирования Arc[*]. Усовершенствованный алгоритм описан в статье "Улучшенная байесовская фильтрация"[*]
 [*] http://www.paulgraham.com/arc.html
 [*] http://www.paulgraham.com/better.html
 ).

Я думаю, что спам остановить возможно, и что фильтры на основе содержимого являются способом это сделать. Ахиллесова пята спамеров — это их сообщение. Они могут обойти любой другой барьер, который вы создадите. Обходят пока что, по крайней мере. Но они должны доставить своё сообщение, каким бы оно ни было. Если мы сможем написать программу, которая распознает их сообщения, то не будет никакого способа, чтобы они смогли это обойти.

_ _ _


С точки зрения получателя, спам легко распознаваем. Если бы вы наняли кого-нибудь, чтобы читать вашу почту и игнорировать спам, у него не было бы с этим никаких проблем. Если не прибегать к созданию ИИ, насколько многое мы должны проделать, чтобы автоматизировать этот процесс?

Я думаю, мы сможем решить эту проблему довольно простыми алгоритмами. На самом деле, я обнаружил, что вы можете вполне приемлемо фильтровать современный спам, используя ничего больше, чем байесовскую комбинацию вероятностей спамовости отдельных слов. Используя немного настроенный (как описано ниже) байесовский фильтр, мы теперь промахиваемся менее чем на 5 сообщений из 1000 спамовых сообщений (неправильно распознавая спам как не-спам), с 0 количеством ложных срабатываний.

Статистический подход  обычно не является тем первым подходом, который пробуют, когда пишут фильтры спама. Первым инстинктом большинства хакеров будет попробовать написать программу, которая распознает индивидуальные свойства спама. Вы смотрите на спамовые письма, и думаете, про наглость этих парней, пытающихся отправить мне письмо, начинающееся на "Дорогой Друг", или с темой письма, сплошь состоящей из прописных букв и завершающейся восемью восклицательными знаками. Я могу отфильтровать такие штуки практически одной строчкой кода.

Вы так и делаете, и сначала это работает. Несколько простых правил откусят большой кусок от вашего входящего спама. Простой поиск слова "click"("щелкните") поймает 79,7% электронных писем в моем корпусе спамовых текстов, выдавая лишь 1,2% ложноположительных результатов.

Я потратил почти шесть месяцев в написании программы, которая искала бы индивидуальные характеристики (features) спама, до того, как я попробовал статистический подход. Я обнаружил, что распознование нескольких последних процентов спама стало очень трудным, и что усиливая строгость фильтров, я получал больше ложных срабатываний.

Ложные срабатывания (ложноположительные результаты, false positives) – это нормальные ("невиновные") письма, которые были ошибочно распознаны как спам. Для большинства пользователей пропажа нормального ("законного") письма на порядок хуже получения спама, так что фильтр, выдающий ложные срабатывания, это как лечение угрей, несущее с собой также и риск смерти пациента.

Чем больше спама пользователь получает, тем менее вероятно, что он заметит одно нормальное ("невиновное") письмо, лёжащее в папке для спама. И, как ни странно, чем лучше становятся ваши спамовые фильтры, тем более опасными становятся ложные срабатывания, потому что, когда фильтры действительно хороши, пользователи всё больше больше склонны игнорировать всё, что они поймают.

Я не знаю, почему я так долго избегал попытки статистического подхода. Я думаю, это было из-за того, что я пристрастился к попыткам самому определить спамовые характеристики, как будто я играл в какую-то состязательную игру со спамерами. (Не-хакеры часто не осознают этого, но большинство хакеров являются весьма соревнующимися.) Когда я попробовал статистический анализ, я сразу обнаружил, что он был намного умнее меня. Он обнаружил, конечно, что такие термины как "virtumundo" (спамовая контора в США, аналог "Центра изучения английского" -прим.пер.) и "teens"("подростки") являются хорошими показателями спама. Но он также обнаружил, что слова "per" и "FL" и "ff0000" тоже являются хорошими показателями спама. На самом деле оказалось, что "ff0000" (HTML код для цвета "ярко-красный") является настолько же хорошим показателем спама, как и любое порнографическое слово.

_ _ _


Вот набросок того, как я делаю статистическую фильтрацию. Я начинаю с одного корпуса спамовых и одного корпуса неспамовых писем. В этот момент в каждом из них есть около 4000 сообщений. Я сканирую весь текст, включая заголовки и встроенный HTML и JavaScript, все письма в каждом корпусе. Я сейчас считаю, что алфавитно-цифровые символы, тире, апострофы и знаки долларов являются частью токенов (лексем), и всё остальное – это разделитель токенов. (Вероятно, здесь есть место для улучшения.) Я игнорирую токены, которые состояит только из цифр, и я также игнорирую HTML-комментарии, даже не рассматривая их как разделители токенов.

Я считаю сколько раз каждый токен (сейчас без учета регистра) встречается в каждом корпусе. На этом этапе я имею в результате две большие хэш-таблицы, по одной для каждого корпуса, с отображением токенов на число их вхождений.

Затем я создаю третью хэш-таблицу, в этот раз отображая каждый токен на вероятность того, что письмо, содержащее его, является спамом, которую я вычисляю следующим образом [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)))))))))

где word является токеном, чью вероятность мы вычисляем, good и bad являются хэш-таблицами, которые я создал на  первом шаге, а ngood и nbad являются количеством неспамовых и спамовых писем соответственно.

Я объяснил это на уровне кода, чтобы показать пару важных деталей. Я хочу немного сместить вероятности так, чтобы избежать ложных срабатываний, и методом проб и ошибок я нашёл, что хороший способ это сделать – это удвоить все числа в good. Это помогает различать слова, которые иногда возникают в "добропорядочной" ("законной") почте, и слова, которые там почти никогда не встречаются. Я рассматриваю только слова, которые встречаются всего более пяти раз (на самом деле, из-за удвоения, вхождение трех раз в неспамовой почте будет достаточно). И затем есть вопрос о том, какой вероятность задать словам, которые встречаются в одном корпусе, но не встречаются в другом. Снова методом проб и ошибок я выбрал 0.01 и 0.99. Здесь может быть пространство для настройки, но, с ростом корпуса, такая настройка, в любом случае, произойдёт автоматически.

Особенно наблюдательные отметят, что, в то время как я рассматриваю, в целях счёта частот, каждый корпус как сплошной длинный поток текста, я использую количество писем в каждом вместо использования их общей длины в качестве делителя в вычислении спамовых вероятностей. Это добавляет еще одно небольшое смещение для защиты от ложных срабатываний.

Когда новая письмо приходит, оно сканируется в токены (лексемы), и самые интересные пятнадцать токенов, в которых интересность измеряется тем, насколько далёка их спамовая вероятность, от нейтрального 0.5, используются для того, чтобы вычислить вероятность того, что почта является спамом. Положим probs – это список из пятнадцати индивидуальных вероятностей, тогда вычисление скомбинированной[*] вероятности будет таким:

[*] http://www.paulgraham.com/naivebayes.html

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

Один вопрос возникает на практике – какую вероятность присвоить слову, которое вы никогда не встречали, т. е. такому, которое отсутствует в хэш-таблице вероятностей слова. Я нашел, снова путем проб и ошибок, что является 0,4 хорошим числом для этого. Если вы никогда не видели слово прежде, это, вероятно, довольно "невиновное" слово; спамовые слова, как правило, все слишком знакомы.

В приложении в конце есть примеры этого алгоритма, примененного к реальным письмам.

Я считаю письмо спамом, если вышеприведенный алгоритм даёт ей вероятность быть спамом более 0.9. Но на практике это не очень важно каким этот порог я поставлю, потому что лишь несколько значений вероятности для писем оказываются в середине диапазона.

_ _ _


Одним большим преимуществом статистического подхода является то, что вы не вынуждены читать так много спама. За последние шесть месяцев, я читал буквально тысячи спамовых писем, и это, действительно, своего рода деморализует. Норберт Винер сказал, если вы конкурируете с рабами, то вы становитесь рабом, и есть что-то аналогично унизительное в соперничестве со спамерами. Чтобы распознать индивидуальные характеристики спама, вы должны попытаться проникнуть в мозг спамера, и, честно говоря, я хочу, потратить как можно меньше времени в умах спамеров, как это возможно.

Но реальное преимущество байесовского подхода, конечно, состоит в том, что вы знаете, что вы измеряете. Фильтры, распознающие характеристики, такие как признание SpamAssassin назначают электронным письмам некие спамовые "баллы". Байесовский подход присваивает настоящую вероятность. Проблема с "баллами" состоит в том, что никто не знает, что они означают. Пользователь не знает что они означают, но что еще хуже, этого не знает и сам разработчик фильтра. Сколько баллов должно получить письмо за то, что в нем есть слово "секс"? Вероятность, конечно, может быть ошибочной, но  мало двусмысленности в том, что она означает, или в том, как данные (признаки) должны быть скомбинированы для её вычисления. Основываясь на моем корпусе, слово "секс" указывает вероятность 0,97 того, что  содержащее его письмо будет спамом, в то время как "сексуальные" ("sexy") выдает вероятность 0,99. И правило Байеса, столь же недвусмысленное, гласит, что письмо, содержащее оба слова имело бы, в (маловероятном) отсутствии  каких-либо других доказательств, 99,97% шансов быть спамом.

Потому что это измерение вероятности, и байесовский подход учитывает все улики в электронной почте, и хорошие, и плохие. Непропорционально редко возникающие в спаме слова (такие как "though"("однако") или "сегодня вечером" или "очевидно"), так же способствуют снижению спамовой вероятности, как плохие слова, такие как "отписаться" и "подписаться" способствуют её увеличению. Так что, "невиновное" в других отношениях письмо, которое, как вдруг оказалось, содержит слово «секс», не будет помечено как спам.

В идеале, конечно, вероятности должны рассчитываться индивидуально для каждого пользователя. Я получаю много писем, содержащих слово "Lisp", и (пока) ни одного спамового, у которого оно бы было. Так что, такое слово, это как своего рода настоящий пароль для отправки мне почты. В моём более раннем программе для фильтрации спама пользователь мог  настроить список таких слов, и почта, содержащая их, автоматически прошла бы фильтры. В свой список я ставил такие слова, как "Lisp", а также мой почтовый индекс  для того, чтобы такие письма, (в другом отношении считаемые за спам) подтверждающие онлайн заказы смогли бы дойти. Я думал, что я очень умён, но я счёл, что байесовский фильтр сделал для меня такую же вещь, но более того, он обнаружил много слов о которых я и не думал.

Когда я сказал в начале, что наши фильтры пропускают менее 5 сообщений спама на 1000, с 0 ложных срабатываний, я говорил о фильтрации мою почты на основе корпуса моей почты. Но эти цифры не вводят в заблуждение, потому что это тот подход который я защищаю: фильтровать письма каждого пользователя на основе спамовых и неспамовых писем, которые он получает. По сути, каждый пользователь должен иметь две кнопки удаления писем: обычное удаление и "удалить как спам". Все удаленное как спам идет в спамовый корпус, а все остальное идет в неспамовый корпус.

Вы можете начать фильтровать для пользователей с начального фильтра, но в конечном счете каждый пользователь должен иметь свои собственные пословные вероятности основанные на той почте что он получает. Это (a) делает фильтры более эффективными, (b) позволяет каждому пользователю задать свое собственное точное определение спама и (c) возможно, самое лучшее, это делает трудным для спамеров настройку писем для обхода через фильтры. Если большинство "мозгов" фильтра будут находиться в индивидуальных базах данных, то тогда простая настройка спамовых писем на пробитие через изначальные настроенные  фильтры не будет ничего гарантировать в том, как хороши они будут в  прохождении фильтров отдельных пользователей, изменчивых. от пользователя к пользователю, и гораздо более натренированных.

Фильтрация спама на основе содержания часто сочетается с белым списком, т.е. списком отправителей, сообщения от которых могут быть приняты без фильтрации. Простой способ построения такого белого списка это содержать список адресов, которым пользователь когда-либо посылал письмо. Если читалка почты имеет кнопку "удаление как спам", тогда вы можете также добавлять туда (в белый список) адреса отправителей (поле "От:") каждого письма, которое  пользователь удалил как обычный мусор (т.е. не спам).

Я сторонник белых списков, но, больше как способ сэкономить вычислений, чем как способ улучшать фильтрацию. Раньше я думал, что белые списки сделали бы фильтрацию проще, потому что вам пришлось бы фильтровать электронную почту только от людей, о которых вы никогда не слышали, и некто отправляющий вам почту в первый раз был бы вынужден придерживаться некоей конвенции в том, что он может написать вам. Кто-то, кого вы уже знаете, мог бы послать вам письмо, с разговорами о сексе, но кто-то отправляющий вам почту в первый раз не будет, скорее всего так делать. Проблема в том, люди могут иметь более одного адреса электронной почты, так что новый адрес отправителя ("От:") не гарантирует, что отправитель пишет вам в первый раз. Это не является необычным для старого друга (особенно, если он хакер) внезапно отправить вам письмо с новым адресом отправителя, так что вы не можете рисковать ложными срабатываниями путем особенно строгой фильтрации почты от неизвестных адресов.

В некотором смысле, однако, мои фильтры сами воплощают что-то вроде белого списка (и чёрного списка), потому что они основаны на целых сообщениях, включая заголовки. Так что в этой мере, они "знают" адреса электронной почты надежных отправителей и даже маршрутов, по которым почта приходит от них ко мне. И они знают столько же о спаме, включая имена серверов, почтовых программ, версий и протоколов.

_ _ _


Если бы я думал, что я могу поддерживать постоянными текущие процентные доли фильтрации спама, я бы считал, что эта проблема решена. Но уметь отфильтровывать большинство современного спама, не очень большое достижение, так как спам эволюционирует. В самом деле, большинство антиспамовых техник[*] до сих пор были как пестициды, которые делают не более того, что создают новую, устойчивую породу жучков.

[*] http://www.paulgraham.com/falsepositives.html

Но я больше надеюсь на байесовские фильтры, потому что они эволюционируют вместе со спамом. Так что, в то время как спамеры начинают использовать "c0ck" вместо "cock", чтобы уклониться от простодушных спам-фильтров, основанных на отдельных словах, байесовские фильтры обнаружат это автоматически. Даже более того, «c0ck» является гораздо более изобличающим доказательством, чем «cock» и байесовские фильтры точно знают насколько более.

Тем не менее, каждый, кто предлагает план для фильтрации спама, должен уметь ответить на вопрос: если бы спамеры знали что именно вы делаете, насколько успешно они могли бы пройти через ваш фильтр? Например, я думаю, что, если фильтрация спама основанная на контрольной сумме станет серьёзным препятствием, спамеры просто переключатся на техники mad lib* для генерации тела сообщений. (* mad lib -- американская игра в процессе которой игроки заменяют слова в тексте c сохранением части речи или иного контекста http://en.wikipedia.org/wiki/Mad_Libs -пер.)

Чтобы победить  байесовске фильтры, спамерам не было бы достаточно сделать свои письма уникальными или прекратить использование отдельных неприличных слов. Им бы пришлось сделать свои письма неотличимыми от вашего обычного письма. И это, я думаю, будет серьезно их сдерживать. Спам в большинстве своем это торговые презентации (pitches), так что, если ваша обычная почта не вся целиком состоит из торговых презентаций, спам будет неизбежно иметь другой характер. И спамерам также, конечно, пришлось бы изменить (и продолжать изменять) всю свою инфраструктуру, потому что иначе заголовки выглядели бы так же плохо как когда-то байесовские фильтры, независимо от того что они сделали с телом сообщений. Я недостаточно знаю об инфраструктуре, которую спамеры используют, чтобы знать, насколько трудным было бы заставить выглядеть "невиновными" заголовки, но моя догадка состоит в том, что это было бы ещё труднее, чем заставлять выглядеть "невиновным" тело сообщения.

Предполагая, что они могли бы решить проблему заголовков, спам будущего, вероятно, выглядел бы чем-то вроде этого:

  Привет всем. Думаю, вы должны посмотреть это:
  http://www.27meg.com/foo

потому, что это примерно столько же торговой презентации сколько пространства оставит спамерам фильтр на основе содержания. (На самом деле, даже этому будет трудно пройти фильтры, потому что, если все остальное в электронной почте является нейтральным, вероятность спамовости будет зависеть от URL, и потребуются некоторые усилия, чтобы сделать его выглядящим нейтрально.)

Диапазон спамеров - от бизнеса работающего c так называемыми списками подписки (opt-in lists), которые даже не пытаются скрыть кем они являются, до ребят, которые угоняют почтовые сервера для отправки спама по продвижению порносайтов. Если мы используем фильтрацию, чтобы сократить его выбор до писем подобных приведенному выше, это должно почти поставить спамеров в "законный" конец спектра, выдавив их за рамки бизнеса; спамеры будут чувствовать себя вынужденными согласно различным государственным законам, включить стандартный текст, про то, почему что их спам не является спамом, и как отменить вашу "подписку", и такого рода текст легко распознавать.

(Раньше я думал, что было бы наивно полагать, что строгие законы будут уменьшать количество спама. Сейчас я думаю, что, в то время как более строгие законы не могут уменьшать количество спама, который спамеры отправляют, они безусловно могут помочь фильтрам уменьшить количество спама, которое получатели действительно увидят.)

Вдоль всего спектра, если ограничить коммерческие презентации, которые могут делать спамеры, вы неизбежно будете стремится вывести их из бизнеса. Слово "бизнес" является важным, чтобы запомнить. Спамеры – бизнесмены. Они шлют спам, потому что это работает. Это работает, потому что, хотя доля откликнувшихся  отвратительно низкая (в лучшем 15 на миллион, против 3000 на миллион для рассылки писем по каталогу), стоит это им практически ничего. Стоимость огромна для получателей, около 5 человеко-недель на каждый миллион получателей, которые проводят секунду чтобы удалить спам, но спамеры не будут оплачивать это.

Однако, отправка спама все же чего-то стоит спамеру. [2] Так что, чем меньшей мы сможем сделать долю откликнувшихся, или фильтруя, или используя фильтры вынуждающие спамеров разбавить свои торговые презентации, тем меньше бизнесов сочтёт стоящим своих хлопот посылать спам.

Причина, по которой спамеры используют те виды торговых презентаций[*] которые они используют в том, что они это делают для увеличения доли отклика. Это, возможно, даже более отвратительно, чем проникновение в мозги спамера, но давайте быстро взглянем изнутри в мозги кого-то, кто откликается на спам. Этот человек либо поразительно доверчив либо находится в глубоком отрицании своих сексуальных интересов. В любом случае, спам, отталкивающий либо идиотской, каким он нам кажется, для них он вдохновляющий. Спамеры не писали бы таких вещей, если бы они не звучали волнующе. И тексты вроде таких: "думаю, что вы должны посмотреть это" просто близко не имели бы рычага влияния на получателя спама, так же как и другие вещи того сорта, которые спамеры сейчас говорят. Результат: если он не может содержать продающих коммерческих презентаций, спам становится менее эффективным в качестве маркетингового движка, и меньше фирм хотят его использовать.
[*] http://www.milliondollaremails.com/

Это – крупная победа в конце концов. Я начал писать программное обеспечение для фильтрации спама, потому что я не хочу больше быть вынужденным смотреть на некоторые вещи. Но, если мы станем достаточно хорошими в фильтрации спама, он перестанет работать, и спамеры на самом деле перестанут слать его.

_ _ _
#конец части 1/3
Tags: antispam techniques, paul graham, перевод
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments