Как лучше всего наказывать спамеров? Я очень долго думал над этой темой, потому что потратил кучу времени на фильтрацию бесконечного хлама, который они мне присылали. И тут меня озарило: наказание должно соответствовать преступлению — краже моего времени. То есть я, в свою очередь, должен красть их время. Разумеется, с минимальными затратами моего времени. Поэтому в начале этого года я создал Password Purgatory («Парольное чистилище») с единственной целью — провести спамеров через всего круги ада выбора пароля, удовлетворяющего ужасно сложным критериям. И когда я говорю "ужасно сложные критерии", это значит, что они гораздо хуже, чем то, что вы когда-либо видели. Я выложил проект в открытый доступ, принял несколько PR, создал API, задающий всё более сложные требования к паролям, и на этом остановился. Пока, наконец, не выпустил готовый проект. Он жив, работает и при этом дьявольски прекрасен.

Шаг первый: получаем спам


Это самое простое — на этом шаге мне вообще не надо ничего делать! Но позвольте мне познакомить вас с контекстом и привести пример из жизни:


М-да. Неприятная штука, достойная отправления в ад. Всё начинается с отправки спама в специальную папку «Send Spammer to Password Purgatory» («Отправить спамера в парольное чистилище»):


Именно такого количества усилий достаточно для каждого спам-сообщения. Но давайте раскроем подробности о том, что же происходит дальше.

Шаг второй: запускаем поток Microsoft Power Automate


Microsoft Power Automate (ранее «Microsoft Flow») — это очень удобный способ запуска последовательности действий на основании события; в этом ПО есть куча встроенных коннекторов, сильно упрощающих жизнь. Упрощающих жизнь нам, разработчикам, но не спамерам, потому что после отправления письма в вышеупомянутую папку происходит следующее:


Благодаря встроенному коннектору с моим аккаунтом электронной почты Microsoft 365 наличие нового письма в этой папке запускает новый экземпляр потока. Далее я добавил коннектор «HTTP», позволяющий мне выполнить исходящий запрос:


Этот запрос лишь выполняет POST к API в Password Purgatory под названием «create-hell». Он передаёт ключ API, потому что я не хочу, чтобы кто угодно мог создавать эти запросы, ведь он создаёт данные, сохраняемые в Cloudflare. Кстати, давайте теперь посмотрим, что происходит там.

Шаг третий: вызываем Cloudflare Worker и создаём запись в KV


Позвольте мне начать с небольшой истории: в не таком уж далёком прошлом Cloudflare не был хостом, а просто выполнял запросы обратных прокси через исходные сервисы и по пути делал с ними всякие интересные штуки. Благодаря этому мы легко могли добавить HTTPS к любому сайту (бесплатно), использовать кучу удобных функций WAF и расширить возможности кэширования. Но всё это выполнялось в процессе передачи, а вся логика приложений, данные и основная часть кодовой базы находились на исходном сайте. Cloudflare Worker начали менять ситуацию, и внезапно код оказался на периферии, работая в сотнях узлов по всему свету, удобно и близко к нашим посетителям. Тогда ли Cloudflare начал превращаться в «хост»? Хм… но сами данные по-прежнему находились на исходном сервисе (если не учитывать промежуточное кэширование). Перенесёмся в настоящее: сегодня есть множество вариантов хранения данных на периферии Cloudflare, в том числе сервис R2 (находящийся в бета-версии), Durable Objects, (будущая) база данных D1 SQL и самое важное для нашего поста — Workers KV. Делает ли это сервис хостом, ведь теперь мы можем собирать целые приложения в его окружении? Возможно, но пока давайте не будем спорить о названиях и сосредоточимся на коде.

Весь код, на который я буду здесь ссылаться, выложен с открытыми исходниками и доступен в публичном репозитории Password Purgatory Logger на Github. Почти в самом начале файла index.js, выполняющего всю работу, вы увидите функцию createHell, вызываемую при выполнении представленного выше шага потока. Этот код создаёт GUID, затем сохраняет его в KV, после чего я могу легко просмотреть его в дэшборде Cloudflare:


Значения пока нет, есть только ключ, возвращаемый в JSON-ответе в свойстве kvKey. Чтобы считать его обратно в поток, мне нужен шаг «Parse JSON» со схемой, которую я сгенерировал из примера:


Итак, теперь у меня есть уникальный ID в постоянном хранилище, доступный из потока, то есть далее можно отправить спамеру электронное письмо.

Шаг 4: приглашаем спамера в ад


Так как оставлять письмо без ответа грубо, я бы хотел отправить спамеру сообщение и пригласить его в мою особую форму регистрации. Для этого я использую коннектор «Reply to email» и передаю через гиперссылку kvKey:


Это HTML-письмо с ключом, скрытым в тэге гиперссылки, чтобы оно не выглядело слишком странным. Благодаря использованию коннектора при отправке письма оно будет выглядеть именно так, как я создал его:


Теперь весь поток исполняется полностью, поэтому мы можем просмотреть историю каждого шага и увидеть, как между ними перемещаются данные:


Далее нам нужно сидеть и ждать поклёва.

Шаг 5: логируем мучения спамера


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

Итак, перейдя по ссылке, спамер оказывается здесь (можете пройти по ссылке и поиграться):


Через строку запроса передаётся kvKey, и страница предлагает спамеру начать процесс заключения партнёрского соглашения. Ему достаточно оставить адрес электронной почты… и пароль. Затем эта страница встраивает два скрипта с веб-сайта Password Purgatory. Оба скрипта можно найти в опенсорсном публичном репозитории Github, который я создал для оригинала статьи. Каждая попытка создания аккаунта отправляет только пароль в исходный Password Purgatory API, который я создал несколько месяцев назад, после чего страница отвечает новым набором критериев. При этом каждая попытка также отправляет отображённый критерий (при первой попытке он пуст, при каждой последующей попытке он становится всё более странным), пароль, который отправил спамер для соответствия критериям, и kvKey, чтобы всех их можно было связать вместе. Это значит, что ранее созданная запись Cloudflare Workers KV постепенно разрастается следующим образом:


В код встроена пара небольших условий:

  1. Если в запросе лога передан несуществующий на Cloudflare kvKey, то возвращается HTTP 404. Это нужно для того, чтобы случайные посетители не отправляли в KV мусорные логи.
  2. После логирования первого пароля есть окно в 15 минут, в течение которого можно логировать все дальнейшие пароли. Это сделано по двум причинам: во-первых, я не хотел публиковать попытки спамеров, пока не буду уверен, что новые пароли не будут логированы, если они будут отправлять персональные данные или что-то другое неподходящее. Во-вторых, после того, как пользователь, не являющийся спамером, узнает значение kvKey, он мог бы начать отправлять логи (например, когда я позже опубликую значение в Twitter или в посте).

И это всё, что нужно для привлечения спамеров и фиксации их мучений, а теперь самое весёлое.

Шаг 6: упиваемся мучениями спамера


При первом логировании попытки подбора пароля спамером Cloudflare Worker отправляет мне письмо, сообщающее о том, что на крючок попался ещё один спамер (эту возможность при MailChannels реализовали только в этом году):


Ощущения от получения первого письма вчера было потрясающим, я как будто в буквальном смысле поймал рыбу на крючок! Этой ссылкой я могу поделиться, чтобы весь мир мог насладиться мучениями спамера. Это стало возможным благодаря ещё одному пути Cloudflare, который просто получает логи для указанного kvKey и красиво форматирует их в HTML-ответе:


Ах, какое же удовольствие! Я указал потраченное спамером время, чтобы в будущем совершенствовать критерии сложности пароля и чтобы он дольше оставался на крючке. Например, не является ли требование почтового индекса США в пароле слишком привязанным к местоположению? Время покажет, а пока я от всего сердца приглашаю вас отправлять соответствующие PR в исходный репозиторий Password Purgatory API.

Для повышения популярности моего сервиса я создал красивую Twitter-карточку, в которой указаны те самые последние критерии и пароль, наконец-то сломившие дух спамера и вынудившие его сдаться:


Подведём итог


Очевидно, я получил большое удовольствие от мучений спамеров и надеюсь, что вы тоже повеселитесь. Нужно сказать честно — я никогда так не радовался, изучая папку спама! Но удовольствие я получил и от создания этой системы при помощи Power Automate и Workers KV. Очень здорово, что сегодня можно создать приложение просто из сочетания конфигурации на основе браузера, кода и хранилища, работающего непосредственно на сотнях распределённых по миру периферийных узлов. Надеюсь, спамеры оценят изящество всей этой схемы!

Комментарии (16)


  1. SuperTEHb
    13.10.2022 15:45
    +23

    В случае, если спамер человек. Иначе же, бот на том конце имеет все шансы понять, что ящик "живой".


  1. sedyh
    13.10.2022 15:48
    +4

    В валидации присутствуют противоречивые параграфы по типу even/odd length, да и все остальные условия тупо берутся из списка рандомом, лучше сделать форму проходимой, человек слишком быстро ее закроет.


  1. nick-for-habr
    13.10.2022 16:03
    +33

    Всё это несомненно полезно для изучения различных технологий, но совершенно бессмысленно для достижения декларируемой автором оригинала цели: потратить время спамера или более того — якобы «помучить» его.
    Понятно, что это лишь некая «игра ума», но передайте автору оригинала небольшой секрет: нет никакого смысла писать что-то в ответ спамеру, т.к. в основном это тупо реклама, направленная в один конец. Её задача — показать содержимое адресату, и если повезёт — заставить перейти по ссылке в письме. Обратный адрес в 99% случаев — фальшивка.
    Есть небольшой процент мошеннического спама — те же «нигерийские письма», но и в этом случае вряд ли кто-то будет «мучатся» с паролями и прочей ерундой, что замыслил автор, даже если удосужиться вникнуть в то, что он понаотправлял в ответе.
    В общем — вполне себе «выстрел в ногу» самого автора: потратить кучу времени на никому не нужную работу.

    Ну и не могу не заметить — современные переводные «эссе» на технические темы от западных авторов просто ужасны: бесконечные простыни текста с претензией на литературные экзерсисы. Вместо пары блоков кода и тройки скриншотов — какая-то примитивная однообразная сантабарбара. Ладно бы это было исключением, но ведь это становится правилом. Господи, сколько у людей лишнего времени )))


    1. SuperTEHb
      13.10.2022 16:26
      +2

      Корпоративный блог же. Количество превыше качества.


      1. nick-for-habr
        13.10.2022 17:01
        +6

        К блогу на Хабре вообще вопросов нет по этому: они указали источник, поставили плашку «перевод» — всё честно. Я как раз про оригиналы, с которых делают эти переводы.
        Потому что уже не раз замечал, что начинаешь читать «не глядя», чувствуешь: «вода, вода»… Ну да, точно — перевод.
        И обратно: открываешь статью, видишь плашку «перевод», и дальше уже думаешь: нужна ли тебе порция «воды» с крупицами смысла, или лучше пройти мимо.
        Про откровенно-пустые «корпоративные» тексты ниачём всё ясно — их уже на автомате пропускаешь. Но тут же вроде как технический текст, но зачем столько(!) пустопорожней дребедени? И это не переводчики добавляют, это авторы занимаются такой фигнёй сами. И таких раздутых якобы технических, но на самом деле графоманских текстов — всё больше, что печалит.


    1. JerleShannara
      13.10.2022 17:29

      Здравствуйте, Вам написывать наследный принц Мумбата Матумба с Нигерия. Мой хотеть спасти 929432 мелионов доларов, вы мочь помощь мне?

      Вот от таких «умников» оно очень даже спасёт.


      1. iig
        13.10.2022 17:41
        +2

        Есть предположение, что с помощью стиля письма спамеры фильтруют слишком умных, на которых нет смысла тратить время спамера-человека.


        1. click0
          13.10.2022 18:32

          Так и есть.


      1. nick-for-habr
        13.10.2022 18:53
        +5

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


    1. Moskus
      13.10.2022 21:26
      +2

      Более того, при определенных обстоятельствах, можно угодить в список спамеров самому.


  1. iig
    13.10.2022 16:27
    +1

    Не хватает логов, которые можно проанализировать на пример мучений.


  1. SergeyMax
    13.10.2022 17:37
    +20

    Тот случай, когда ты нагнул спамера на 80 секунд, а он тебя - на пол-дня.


    1. shasoftX
      14.10.2022 13:07

      Так ведь спамеров то много. И через неделю он выйдет на те же "полдня" и "отобьёт" затраченное время :)

      p.s.в реальности с другого конца просто бот, которому пофиг что ему отвечают.


  1. Kiborg777
    13.10.2022 17:38
    +6

    Не менее 99% спам-рассылок рассылаются ботами, нет смысла тратить время усилия на "усложнение жизни" условных "senders". Кроме того, современные емаил-сервисы очень успешно отсеивают спам. "Парольное чистилище", в том виде, в котором описано в статье - борьба с ветряными мельницами.


  1. shasoftX
    14.10.2022 13:10
    +6

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

    36 минут в течении которых мошенник не имел возможности обмануть кого-то более доверчивого.

    А в данном случае обычно боты рассылают письма и на ответы они не особо смотрят.


  1. AlexiusK
    15.10.2022 23:43

    Пароль таки прекрасен. И по-английски, и по-русски транслитерацией )