
Каждый, кто хоть раз пытался купить билеты на концерт в первые минуты продаж, знает это чувство, когда ты честно ставишь галочку «Я не робот», выбираешь на картинке все светофоры, потом выбираешь их еще раз, потому что в первый раз ты якобы ошибся, а билеты в это время уже уехали к перекупщикам, у которых никаких светофоров не спрашивали. Галочку эту давно и с удовольствием нажимают те самые роботы, причем делают они это аккуратнее, быстрее и, что обиднее всего, гораздо спокойнее живого человека.
Летом двадцать пятого года по сети разошлась история про ИИ-агента, который посреди задачи наткнулся на проверку Cloudflare, нажал кнопку подтверждения и между делом пояснил своему пользователю, что этот шаг нужен, чтобы доказать, что он не бот. Шутили над этим много, но если отбросить смешную сторону, картинка получилась довольно точная, потому что вопрос «человек ли ты» давно перестал делить трафик на своих и чужих и делит его сейчас скорее по тому, сколько денег и терпения вложил в маскировку тот, кто сидит по ту сторону запроса.
Двадцать лет назад ботнет был толпой зараженных компьютеров, которая умела делать одну вещь, зато очень громко: завалить сайт запросами, разослать миллион писем про чудо-таблетки или перебрать пароли по словарю. Сегодня ботнет по поведению больше похож на огромный колл-центр, где каждый сотрудник ведет себя чуть-чуть по-своему, сидит со своего домашнего интернета, неторопливо листает страницы и иногда даже ошибается в форме логина, потому что живые люди ошибаются, и антибот-системы об этом прекрасно знают.
Пришел он к этому не сразу, и каждый шаг в эту сторону был ответом на очередную защиту, которую придумывали на другой стороне, так что историю ботнетов вполне можно рассказывать как историю капчи, только вывернутую наизнанку.
Картинки с кривыми буквами
Похожую штуку AltaVista использовала еще в девяносто седьмом, чтобы спамеры не добавляли свои сайты в поиск тысячами, а сам термин CAPTCHA придумали в Карнеги-Меллон около двухтысячного года, и расшифровка у него длинная и немного хвастливая: полностью автоматический публичный тест Тьюринга для различения компьютеров и людей. Идея держалась на простом наблюдении, что человек легко читает искаженный текст, а программы распознавания на тот момент справлялись с ним плохо, поэтому Yahoo поставила такие картинки на регистрацию почты, и спамеры на какое-то время действительно приуныли.
Боты той эпохи были простыми скриптами, которые дергали формы через curl или самописный HTTP-клиент, не грузили картинок, не выполняли JavaScript и ходили с одного-двух серверов в дата-центре, так что отличить их от человека можно было и без всякой капчи, по логам, если кто-то вообще в эти логи заглядывал. Капча закрывала дыру на регистрации и в комментариях, и долгое время этого хватало, пока оптическое распознавание не начало догонять человеческий глаз.
Гонка на этом поле шла предсказуемо: буквы становились кривее, фон шумнее, линии поперек текста толще, а распознаватели учились все это вычищать. И примерно к началу десятых машина читала некоторые капчи увереннее пользователя, который ради регистрации на форуме в третий раз пытался понять, где там «rn», а где «m». К тому моменту у Луиса фон Ана, одного из авторов термина, уже был проект reCAPTCHA, который Google купила в 2009, и в нем был остроумный ход, когда капча заодно оцифровывала старые книги и газеты, а позже номера домов со Street View, так что человечестве бесплатно размечало данные, на которых потом учили те самые модели, которые эту капчу и решают.
Люди по доллару за тысячу

Самым дешевым ответом на капчу долгое время оставался обычный живой человек где-нибудь в стране с низкими зарплатами, который сидит перед экраном и вводит текст с картинок, приходящих через API, по несколько секунд на каждую. Сервисы вроде 2Captcha или Anti-Captcha работают так до сих пор, бот отправляет картинку или параметры задачи, получает ответ и подставляет его в форму, и с точки зрения сайта капчу решил человек, потому что ее действительно решил человек, просто сидел он в другом полушарии и работал на чужой ботнет.
В каком-то смысле именно тогда ботнеты впервые стали людьми, причем буквально, и почти все дальнейшие хитрости только удешевляли этот процесс, пытаясь убрать из цепочки живого исполнителя. Расчет на бумаге здесь получается такой, что защищающейся стороне становится грустно:
решение капчи на ферме: ~ 2 $ / 1000 = 0.002 $ за штуку наценка на билет у перекупа: ~ 100 $ и выше 100 $ / 0.002 $ = 50 000 решенных капч на один перепроданный билет
Пока ценность одного успешного действия измеряется долларами, а капча стоит доли цента, она работает как небольшой налог на атаку, который ботовод один раз закладывает в себестоимость и дальше о нем не вспоминает. Студента, который на выходных написал парсер, такая защита отсекает хорошо, а тех, у кого вокруг ботов выстроена бизнес модель с бухгалтерией, почти не замечает.
Галочка, которая смотрит на вас
В 2014 Google выкатила No CAPTCHA reCAPTCHA, ту самую галочку, и сдвинула всю игру в сторону, которую тогда понимали немногие. Нажатие на квадратик само по себе почти ничего не проверяет, зато за ним стоит скрипт, который успел посмотреть, как курсор двигался по странице, сколько времени прошло от загрузки до клика, какие у браузера куки и залогинен ли он в аккаунт Google с многолетней историей. Если все выглядит прилично, вы получаете зеленую галочку, а если что-то смущает, на вас вываливают светофоры и пешеходные переходы, иногда несколько раундов подряд.
Четыре года спустя вышла третья версия, где картинок нет совсем, есть только оценка от нуля до единицы, которую скрипт выставляет каждому посетителю по совокупности поведения на сайте, а решать, что делать с оценкой 0.3, приходится уже владельцу сайта. С этого момента капча окончательно превратилась из теста в слежку, вежливую и почти незаметную, и задача бота сместилась с чтения картинки на то, чтобы прожить на странице несколько секунд так, как их прожил бы человек.
Ответ ботоводов оказался вполне инженерным, и курсор стали водить по кривым Безье с небольшим дрожанием и неровной скоростью, потому что человеческая рука не умеет ехать по прямой с постоянной скоростью, задержки между нажатиями клавиш начали брать из распределений, снятых с живых людей, а куки и историю стали выращивать, когда профиль браузера неделями бродит по новостным сайтам, смотрит видео и логинится в почту, чтобы к моменту настоящей работы выглядеть солидным пользователем с биографией. Ферма аккаунтов в таком виде больше напоминает питомник, где каждую учетку выгуливают, кормят и следят, чтобы она не заболела раньше времени.
Масштаб, до которого дорастает такая имитация, хорошо показал Methbot, которого в 2016 раскопали в White Ops. Он изображал зрителей видеорекламы с фальшивыми движениями мыши, имитацией входа через соцсети и подделанной геолокацией и, по оценкам исследователей, выкачивал из рекламодателей от трех до пяти миллионов долларов в день, при этом сам жил на арендованных серверах в дата-центрах и только притворялся домашними пользователями из США.
Отпечатки пальцев браузера

Пока одна сторона училась изображать поведение, другая начала проверять сам браузер, и выяснилось, что браузер выбалтывает о себе удивительно много. Шрифты в системе, разрешение экрана, часовой пояс, список плагинов, то, как видеокарта рисует невидимую картинку на canvas, и то, какие строки отдает WebGL, вместе складываются в отпечаток, по которому браузер узнается достаточно надежно даже без кук, а заодно становится видно, что «пользователь из Техаса» почему-то живет по московскому времени и пользуется шрифтами от серверного Linux.
Автоматизация тоже долго выдавала себя сама, потому что headless Chrome и Selenium честно оставляли следы в окружении, и первые проверки выглядели примерно так:
if (navigator.webdriver) { // привет, Selenium return markAsBot(); } if (!window.chrome && /Chrome/.test(navigator.userAgent)) { // называет себя Chrome, а объекта chrome нет return markAsBot(); } if (navigator.plugins.length === 0) { // у живых людей обычно хоть что-нибудь да стоит suspicious++; }
Продержались такие проверки недолго, потому что подменить свойство в JavaScript дешевле, чем его проверить, и вокруг Puppeteer и Playwright быстро выросли плагины, закрывающие десятки мелких утечек, после чего защита ушла глубже, туда, где подменять сложнее. Сначала взялись за TLS, где порядок шифров и расширений в ClientHello у Chrome, у питоновского requests и у Go-клиента заметно различается, и по отпечатку вроде JA3, а потом и JA4, было видно, что юзер-агент обещает браузер, а рукопожатие делает скрипт. Потом добавились отпечатки HTTP/2 с их порядком заголовков и настроек фреймов, и стало понятно, что убедительно притвориться браузером можно только одним способом, запустив настоящий браузер.
Так появились антидетект-браузеры, сборки на основе Chromium, где каждый профиль получает свой согласованный набор параметров, от шрифтов и видеокарты до часового пояса и языка, и все это сходится между собой, потому что противоречия между полями ловятся лучше, чем сами поля. Продавали их поначалу арбитражникам и тем, кому надо вести десяток рекламных кабинетов, но покупает их понятно кто, а к ним в комплект продаются наборы отпечатков, снятых с реальных устройств, примерно как продаются краденые карты, пачками и с гарантией валидности.
Чужой дом с хорошей репутацией
Самой упрямой проблемой для ботов долго оставался IP-адрес, потому что подсети дата-центров давно размечены, и когда на сайт из одной подсети AWS приходит тысяча «домашних пользователей», никакие кривые Безье уже не спасают. Человек сидит дома, на адресе своего провайдера, рядом с соседями, которые тоже сидят дома, и именно такой адрес с его чистой историей стал самым ценным, что может достаться боту.
Ответом стали резидентные прокси, и устроены они проще, чем хотелось бы. В бесплатное приложение, будь то VPN, игра или утилита для очистки памяти, встраивается SDK, который в фоне пропускает через устройство чужой трафик, а в пользовательском соглашении где-то на двадцатой странице написано, что владелец телефона на это согласился. Дальше трафик бота выходит в интернет с адреса чьей-то квартиры, и сайт видит обычного абонента домашнего провайдера, которым запрос и является.
Когда согласие из соглашения убирают совсем, получается обычный ботнет, только сдаваемый в аренду по гигабайтам. В мае двадцать четвертого ФБР вместе с партнерами разобрало 911 S5, сеть, в которой, по их данным, было порядка девятнадцати миллионов уникальных IP-адресов и которая расползалась вместе с бесплатными VPN-приложениями, и через нее, по версии следствия, прогоняли мошенничество с пособиями, кражу учеток и прочие радости. Годом позже Google подала иск против операторов BadBox 2.0, где зараженными оказались дешевые Android-приставки, проекторы и планшеты, причем часть из них приезжала к покупателю уже с прошивкой, которая сдавала его домашний интернет под прокси и рекламное мошенничество, и счет устройств там шел на миллионы.
Получается довольно странная конструкция, когда ботнет буквально живет у людей дома, пользуется их интернетом и их репутацией, и отключить его, не задев самих людей, невозможно, потому что адрес у них общий. Блокируя такой трафик по IP, сайт заодно блокирует бабушку, у которой за телевизором стоит та самая приставка за двадцать баксов, и ни одна антибот-система не горит желанием объяснять бабушке, почему ей нельзя зайти в интернет-банк.
Машина решает быстрее
Пока защита возилась с отпечатками браузеров, вопрос с картинками тихо решился сам собой. В двадцать третьем году исследователи из Калифорнийского университета в Ирвайне посадили больше тысячи живых людей решать капчи с популярных сайтов и сравнили их результаты с опубликованными данными о ботах. Вышло не в пользу людей, потому что боты почти во всех типах задач справлялись быстрее и в большинстве случаев точнее. В двадцать четвертом в ETH Zurich взяли модель детекции объектов из семейства YOLO, дообучили ее на картинках reCAPTCHA v2 и получили решение всех задач, которые ей попадались, причем раундов модели требовалось примерно столько же, сколько живому человеку.
Из этого следует неприятная вещь, которую разработчики защиты знают, но вслух произносят редко: визуальная капча сегодня отсеивает в основном людей, и в первую очередь тех, кому и так сложнее всех: со слабым зрением, с медленным интернетом, с экраном размером с ладонь, а также тех, кто просто устал и в третий раз не может понять, считается ли кусочек столба светофором. Бота такие вопросы не мучают, ему этот кусочек столба когда-то разметили те же самые люди, которые сейчас не могут пройти проверку.
Поэтому от картинок постепенно уходят, и Cloudflare Turnstile, новые версии решений от Google и hCaptcha все больше опираются на невидимые проверки, когда браузер в фоне решает небольшие вычислительные задачки, отдает отпечатки, показывает, как он исполняет JavaScript, и пользователь в идеальном случае вообще ничего не видит. Живому человеку так удобнее, но для защиты это означает, что вся тяжесть снова ложится на поведение и окружение. То есть ровно туда, где боты последние десять лет тренировались больше всего.
Вежливый агент

Следующий виток начался, когда языковые модели научились управлять браузером, и граница между человеком и ботом стала размываться уже с другой стороны. Агент, который по просьбе пользователя ищет авиабилеты, сравнивает цены или заполняет анкету на сайте, технически ведет себя как бот, запускает браузер, двигает курсор и нажимает кнопки, но делает это от имени конкретного человека, который сидит рядом и ждет результата, и записать такой трафик во вредный уже как-то неловко.
Те же самые агенты, оказавшись по другую сторону, сильно удешевили работу ботоводов, потому что раньше под каждый сайт писали свой скрипт и чинили его после каждого обновления верстки, а сейчас модели можно объяснить словами, что нужно сделать, и она сама найдет кнопку, даже если ее перекрасили и передвинули в другой угол. Поведение у такого бота получается неровным, с паузами «на подумать», с лишними кликами и возвратами назад, и выглядит оно крайне похожим на человека, который впервые зашел на сайт и пытается разобраться, где здесь корзина.
Вместе с агентами расплодились и боты, которые вообще ничего не изображают. Краулеры для обучения моделей, и про них в последние пару лет регулярно пишут мейнтейнеры open-source проектов, у которых git-хостинг ложится под наплывом таких гостей. Часть краулеров честно представляется в юзер-агенте и даже читает robots.txt, часть ходит через те самые резидентные прокси, и некоторые проекты в итоге поставили перед своими репозиториями proof-of-work проверку вроде Anubis, которая заставляет каждого посетителя немного погреть процессор, прежде чем ему покажут код.
Кто за тобой стоит

Индустрия понемногу сдается в вопросе «человек или бот» и переходит к другому вопросу, на который ответить проще: кто готов поручиться за этот запрос и чем он при этом рискует. Apple в двадцать втором году вместе с Cloudflare и Fastly запустила Private Access Tokens, где сайт вместо капчи получает криптографический токен о том, что запрос пришел с настоящего устройства с действующей учетной записью. У Android есть своя аттестация через Play Integrity, и все это работает тихо и быстро.
Платить за такую проверку приходится в другой валюте, и счет за нее выставляют вовсе не ботоводам. Сайт начинает доверять запросу потому, что за ним стоит устройство конкретного вендора, и все, у кого телефон старый, с рут правами, собранный своими руками или работает на свободной прошивке, автоматически записываются в подозрительные. А возможность пройти в интернет без капчи превращается в функцию того, у какой корпорации куплен телефон. Ботоводы в этой схеме тоже не пропадают, они начинают скупать настоящие устройства и аккаунты, и фермы из сотен телефонов на стеллажах (которые и так давно существуют для накрутки в мобильных приложениях) получают вторую профессию.
Если посмотреть на всю эту историю целиком, каждая новая проверка поднимала цену притворства для бота и одновременно цену доказательства для человека. Первая всегда росла медленнее второй, потому что у ботовода есть бюджет, автоматизация и масштаб, а у человека только терпение и десять секунд, которые он готов потратить на светофоры. Галочка «Я не робот» до сих пор висит на миллионах сайтов, но обращаются с ней честнее всех как раз роботы, нажимающие ее с первого раза. Они не жалуются, а иногда даже объясняют своему пользователю, зачем они это делают.
Veegres
Был опыт парсинга некоторых сайтов и не для чего злоумышленного, а просто собрать мето информацию с вебстранички, которю гугл показывает у себя в поисковике при выдаче. Так это оказалось еще той задачкой не которые сайты проверяют tls handshaike даже и если он не похож на браузера, то сразу банят. Самое сложное было распарсить блумберг - так и не справился, пришлось ограничиться информацией которую выдает sitemap.