Obscura — хайп, аудит и доверие в open source

Разработчики хотят пробовать новые инструменты, потому что каждый второй пост в ленте обещает «убийцу Chrome» или «революцию в скрейпинге». Но хайп не равен качеству — и не равен безопасности. Доверять проекту только потому, что у него 14 тысяч звёзд, — всё равно что пускать незнакомца в дом, потому что у него много подписчиков в соцсетях.

Мы увидели Obscura в X. Headless-браузер на Rust от 16-летнего разработчика с ником h4ckf0r0day. 14,6 тысяч звёзд за два месяца. Красивые цифры, громкие заявления. Заинтересовались — развернули, попробовали, а потом копнули глубже. И прогнали полноценный security-аудит.

Что такое Obscura

Obscura — headless-браузер на Rust, позиционируется как замена headless Chrome для AI-агентов и скрейпинга. Сторонний проект, не часть чьего-либо ядра.

Технические характеристики (по данным авторов): - 30 МБ памяти против 200+ у Chrome — в 6 раз меньше - 85 мс загрузка страницы против ~500 мс — в 6 раз быстрее - Встроенный anti-detect: fingerprint rotation через CDP - 57 МБ Docker-образ на distroless - Поддержка CDP — работает с Puppeteer и Playwright без изменений - MCP-сервер из коробки: 12 инструментов для AI-агентов - CLI: obscura fetch --dump markdown, obscura scrape с параллелизмом - Лицензия Apache 2.0

Звучит как мечта: лёгкий, быстрый и совместимый с существующей экосистемой. Но мы не остановились на README.

Что мы нашли при аудите

Взяли репозиторий, склонировали 20 771 строку Rust, проверили всё: сетевые вызовы, зависимости, Dockerfile, CI/CD, профиль автора. Цель была простая: понять, можно ли запускать это в production-окружении, где браузер получает произвольные URL от AI-агента.

Код чистый. Ноль phone-home, ноль C2-команд, ноль эксфильтрации данных, ноль обфускации. Все 371 зависимость из crates.io — ни одной git-зависимости. Это хороший знак: проект не пытается ничего скрыть.

Авторство мутное. Формально проект ведёт h4ckf0r0day — 26 коммитов за два месяца, в основном README, маркетинг и ответы на issues. Основной код пишет некто SGavrl — 72 коммита: V8-integration, CDP-протокол, stealth-движок. Кто это — непонятно. «16-летний разработчик» не написал 20 771 строку системного Rust с интеграцией V8 за два месяца. Это не значит, что проект вредоносный. Это значит, что за красивой историей стоит кто-то ещё, и мы не знаем кто.

14,6 тысяч звёзд за 2 месяца. Подозрение на накрутку. Спонсоры проекта — прокси-сервисы (Swiftproxy, ProxyEmpire, MangoProxy) с партнёрскими ссылками в README. Сами по себе звёзды не проблема, но в сочетании с мутным авторством это повод задуматься: звёзды — метрика внимания, а не качества.

Нет культуры безопасности. Нет SECURITY.md, нет disclosure-политики, нет bug bounty, нет ни одного независимого аудита. Проект с 20 тысячами строк Rust, который запускает непроверенные URL, не имеет даже формального процесса сообщения об уязвимостях.

V8 — главная атакная поверхность. Obscura встраивает движок V8 напрямую. Sandbox escape в V8 даёт RCE на хосте. Это не гипотетический риск: Chrome patched десятки sandbox-уязвимостей за последние два года. Obscura обновляет V8 через crates.io, но кто следит за timely-обновлениями — непонятно.

CDP без аутентификации. По умолчанию CDP открыт на loopback без токена. Любой процесс на той же машине может управлять браузером. В серверном сценарии — где AI-агент дёргает браузер для скрейпинга — это значит, что компрометация одного контейнера даёт контроль над браузерным движком соседа.

Есть и хорошие safety-решения. SSRF-защита включена, file:// заблокирован, CDP слушает только loopback, 3 unsafe-вызова — raw pointer casts, стандартная практика для V8 FFI.

Забавный момент с Reddit. Claude AI сфлажил проект как малварь исключительно из-за ника автора — «H4ckf0r0day». Никто не представил доказательств вредоносности кода. Имя автора — не вектор атаки, но показывает, как работает восприятие безопасности: люди судят по обложке, а не по коду.

Из минусов (серьёзно)

  • wreq — pre-release зависимость с BoringSSL, расширяет TLS-поверхность. Pre-release в продакшене — красный флаг для security-аудита.
  • Single point of failure. 72 коммита от SGavrl. Если он уйдёт, проект встанет.
  • Нет процесса обновления V8. Браузерный движок без регулярных апдейтов — накапливающаяся угроза.
  • Прокси-спонсоры. Партнёрские ссылки в README создают конфликт интересов: проект заинтересован в росте аудитории больше, чем в стабильности.

Чем полезно нам

Мы попробовали Obscura в контексте наших проектов — PlanEx, Hermes-агенты, kanban-пайплайн. Вердикт: использовать пока нет.

Для задач скрейпинга и браузинга внутри AI-агентов технические характеристики впечатляют — 30 МБ памяти и 85 мс загрузки реально решают проблему «Chrome жрёт гигабайт на 10 вкладок». Но в нашей архитектуре агенты запускают код на сервере, и мы не готовы давать непроверенному браузерному движку доступ к сети без аудита V8-песочницы.

Если проект доживёт до независимого security-аудита и закроет базовые hygiene-вопросы (SECURITY.md, CDP-аутентификация, процесс обновления V8) — вернёмся. Пока наблюдение.

Что сделать, чтобы разобраться самому

  1. Склонировать репозиторий, прогнать cargo audit и cargo geiger по зависимостям — 371 крейт, это быстро.
  2. Запустить в Docker с ограниченной сетью (--network none + --cap-drop=ALL), проверить выживаемость.
  3. Прогнать fuzzer по CDP-интерфейсу — раз аутентификации нет, поверхность атаки открыта даже на loopback.

Gotchas

  • «14 тысяч звёзд = безопасно» — нет. Звёзды не заменяют аудит.
  • «На Rust = безопасно» — нет. Rust защищает от memory corruption, но не от логических уязвимостей вроде SSRF или insecure defaults.
  • Pre-release зависимости (wreq) не должны попадать в production-сборку, но попадают.
  • CDP без аутентификации — не проблема на десктопе, но критично на сервере.
  • Автор с ником «h4ckf0r0day» — не индикатор злого умысла, но индикатор отношения к безопасности.

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