Как один забытый вебхук сжёг мне $14 200: анатомия уязвимостей, о которых молчат фреймворки
Я потерял 14 200 долларов в ноябре 2021 года. Не на ликвидации, не на проскальзывании и не на ошибке в математике арбитражного бота. Бот работал идеально. Деньги ушли через веб-интерфейс, который я набросал за вечер пятницы на FastAPI, чтобы выводить графики доходности и дергать ручки перезапуска воркеров.
Я был уверен в себе. У меня за плечами висели годы бэкенда, прочитанные мануалы и уверенность, что если ты завернул всё в Docker и повесил Nginx с базовой авторизацией, ты защищен. Это чушь. Классическая иллюзия разработчика, который считает, что знание синтаксиса спасает от сетевых атак.
Через криво настроенный CORS и слепой SSRF на внутреннем служебном роуте бот слил приватные API-ключи биржи. За пять минут ботнет выставил серию встречных ордеров по неликвидным парам и вымыл депозит на чужой кошелек. Я смотрел в терминал, видел, как тают цифры, и не мог сделать ничего, пока физически не убил процесс на сервере через SSH со смартфона, стоя на светофоре.
Фреймворки приучили нас к лени
Современный веб прекрасен и одновременно опасен тем, как легко он скрывает кишки инфраструктуры. ORM защищает от банальных SQL-инъекций. React экранирует XSS из коробки. Разработчики расслабляются. Кажется, что базовый web security for developers сводится к установке bcrypt на пароли и покупке SSL-сертификата.
Но уязвимости бизнес-логики никуда не делись. Логика авторизации на уровне объектов (BOLA/IDOR), подделка межсайтовых запросов, инъекции в заголовки, через которые корпоративный web security gateway пропускает вредоносный трафик, думая, что это обычный REST-запрос — всё это цветёт пышным цветом. Когда мы в NEXUS Algo строим торговые боты и автоматизированные связки под крипту, цена ошибки — это мгновенный ноль на балансе. В финтехе нет кнопки «откатить транзакцию». Если ваша архитектура дырявая, деньги просто заберут те, кто умеет читать сетевой стек глубже вас. Посмотрите на наши публичные отчеты вроде разбора трейдов RVV — объемы там не прощают детских багов в API.
Теория против реального взлома
Когда программист решает подтянуть защиту, он обычно идет по стандартному пути. Открывает web security academy portswigger, читает статьи, решает понятные лабораторные работы в песочнице. Это отличная база. Площадки вроде web security academy или тренировочные дистрибутивы вроде старого доброго web security dojo дают фундамент: ты начинаешь понимать, как атакующий видит твои куки и заголовки.
Затем человек открывает OWASP web security testing guide, пугается объема в сотни страниц чек-листов и закрывает вкладку. Потому что в стартапе или в реальном бизнесе нет трех месяцев на ручное тестирование каждого эндпоинта по методологии спецслужб.
Возникает вопрос: а что тогда минимально жизнеспособно? Какой web security skill действительно спасает шкуру, когда ты релизишь проект в прод? Я выделяю три вещи:
Первое: изоляция контекстов исполнения. Любой интерфейс, смотрящий наружу, должен считать бэкенд враждебной средой, а бэкенд обязан считать врагом любой входящий байт, даже если он пришел с заголовком от авторизованного админа. Никаких прямых обращений веб-ноды к базе данных с балансами или хранилищу ключей.
Второе: понимание того, как работает настоящий web security периметр. Нельзя просто выставить наружу веб-сокеты торгового шлюза и надеяться, что токен в заголовке `Authorization` спасет от replay-атак или отравления кэша.
Третье: отказ от веры в «неуязвимость по умолчанию». Это и есть главные web security essentials: если код написан человеком, в нем есть ошибка. Вопрос лишь в том, сколько времени потребуется боту-сканеру, чтобы ее нащупать. Обычно на это уходит от 40 секунд до 2 часов с момента появления нового DNS-записи в публичных логах Certificate Transparency.
Почему бесплатные чекеры бесполезны
Владельцы сайтов обожают вбивать в поиск аудит безопасности сайта онлайн, тыкать на первую ссылку, вставлять свой домен в форму и радоваться зелёному отчету: «SSL действителен, заголовки HSTS найдены, угроз нет». Это самообман. Такие скрипты не проверяют права доступа к соседним аккаунтам. Они не проверяют, отвечает ли ваш скрытый GraphQL-эндпоинт на интроспекцию схемы. Они не видят, что тестовый роут `/debug/pprof` забыли закрыть в продакшене.
Когда бизнесу называют реальную аудит безопасности сайта стоимость у топовых пентестеров — с ценниками от пяти до двадцати тысяч долларов за проект — начинается ступор. Платить такие деньги за то, чтобы тебе принесли PDF-отчет на 80 страниц с формулировками «возможно теоретическое переполнение буфера», мало кто готов, если речь не идет о банке.
Но между слепой верой в бесплатный онлайн-чекер и неподъемным контрактом с ИБ-корпорацией лежит здравый смысл. Профессиональный аудит безопасности сайта — это не магия. Это автоматизированный агрессивный поиск слепых зон, конфигурационных дыр и уязвимостей рантайма, помноженный на ручную валидацию векторов атак.
Мы прошли через сливы депозитов и взломы инфраструктуры на собственном опыте еще года три назад. С тех пор золотое правило разработки в наших проектах простое: код не считается готовым, пока его не прогнали через независимый стресс-тест на проникновение. Если вы держите веб-платформу, личный кабинет для клиентов или связку API для финансовых сервисов, проверьте периметр до того, как его проверят парни с темных форумов. Для этого мы развернули понятный сервис без бюрократии и раздутых смет: закажите рабочий аудит безопасности сайта от GuardLabs — снимем розовые очки, найдем реальные дыры в архитектуре и покажем, где именно вас могут взломать уже сегодня ночью.