
Обратный прокси, не учитывающий содержимое, для защищённого от раскрытия сканирования безопасности
Локальный обратный прокси для сканирования безопасности без учёта содержимого.
Go · Локальный HTTPS · HTTP и WebSocket · Tor / SOCKS5
Обоснование / Как работает / Быстрый старт / Сертификаты / Tor / CAPTCHA / Доказательства / Разработка
Тестирование безопасности — это дисциплина, основанная на поведении. Важно то, что делает приложение: как оно обрабатывает ввод, какие механизмы контроля применяет, что отражает обратно, как завершается с ошибкой. Идентичность не должна иметь значения для такого анализа.
Инструменты безопасности с поддержкой ИИ работают иначе. Они видят цель — её домен, бренд, организацию — и формируют мнения. Они смягчают выводы для известных сервисов. Они отказываются от проверки, исходя из того, кем является цель. Они отказываются тестировать пути, которые ассоциируют с конкретным поставщиком. ИИ принимает решения, которые принадлежат оператору, и принимает их на основе контекста, а не поведения.
Это неверная ось. Оператор авторизует область работ. Инструмент оценивает поведение. Это разные обязанности, и они не должны сливаться в одну. Но сегодня в каждом инструменте с поддержкой ИИ полная идентичность цели встроена в каждое принимаемое им решение — что тестировать, как сильно давить, сообщать ли о находке.
Blinder — это отправная точка: практичный инструмент, но также и позиция о том, что тестирование должно быть отделено от контекста. Это ранняя попытка донести идею. Если подход найдёт отклик, мы будем рады лучшим реализациям, вкладу или просто разговору о том, где должна проходить граница.
Удаление идентичности не означает удаление содержимого. Именно здесь ломаются большинство наивных подходов. Уязвимости наблюдаемы как изменения в содержимом ответа — сообщения об ошибках, отражённый ввод, данные, до которых сессия не должна дотянуться, вычисленные результаты, раскрывающие серверную обработку. Если бы прокси удалял это содержимое, он бы скрывал доказательства, которые ищет тестировщик.
Требование хирургическое: удалить идентичность, сохранив поведенческие сигналы. Страница, которая никому не принадлежит, но ведёт себя точно так же, как оригинал, — включая случаи, когда ведёт себя плохо.
Blinder — это локальный обратный прокси HTTPS, который находится между ИИ-сканером (или браузером) и целью. Он переписывает идентичность — домены, бренды, названия организаций, адреса электронной почты, IP-адреса — сохраняя при этом функциональное поведение приложения: его ошибки, отражения, механизмы безопасности, коды состояния, структуру содержимого.
Для нижестоящего ИИ цель — это анонимное локально размещённое приложение по адресу https://127.0.0.1:8099. Никакого бренда для распознавания. Никакого домена, о котором можно сформировать мнение. ИИ тестирует то, что приложение делает, а не то, чем оно является.
Это сканирование без учёта содержимого: оператор контролирует, кем является цель; ИИ сосредоточен на том, что она делает.
Замещающее содержимое — часть корректности: нейтральный наполнитель для отображения, обратимые значения для данных приложения, а также сохранённая диагностика и поведение механизмов контроля. Сгенерированные уведомления об удалении не должны попадать на страницы.
| Очистка содержимого | Отображаемый текст заменяется нейтральным прозаическим наполнителем; интерактивные элементы (кнопки, метки, элементы форм) и диагностическое содержимое (сообщения об ошибках, трассировки стека, отражённая разметка) сохраняются. Токены идентичности, ссылки на домены и значения cookie переписываются в телах HTTP, заголовках и тексте WebSocket. --preserve-content сохраняет исходный отображаемый текст для очистки только идентичности. |
| Целостность ресурсов | Исходный SRI проверяется для каждой ссылки и пересчитывается для переписанных ресурсов, с соответствующим преобразованием хешей CSP. Версионированные ссылки привязывают отдаваемые байты; целостность внешних ресурсов сохраняется. |
| Кэш ответов | Раздельные валидаторы кэша для восходящего и нисходящего потоков. Ревалидация 304 объединяет заголовки политики безопасности. Вытеснение с учётом Vary. |
| Обработка сессий | Обратимые имена cookie с очисткой по значениям. Маршрутизация по нескольким источникам через --extra-origin с детерминированными псевдонимами хостов, маршрутизацией по заголовку Host и трансляцией источника CORS. |
| Ретрансляция CAPTCHA | Очередь заданий, обращённая к оператору, и отдельные источники провайдеров. Ресурсы, маршрутизируемые через Tor, сохраняют cookie, CSP и CORS провайдера отдельно от цели и оператора. |
| Приватная маршрутизация | Восходящие HTTP и WebSocket через Tor SOCKS5 с удалённым разрешением имён хостов. Сбои Tor — это жёсткие ошибки, никогда не молчаливые откаты. |
| Локальный HTTPS | Локальный CA со сроком жизни 90 дней и автоматическим продлением; листовые сертификаты сессий подписываются на лету. Доверьтесь CA один раз — добавление источников или изменение псевдонимов никогда не требует повторного доверия. Доступен эфемерный режим. |
| Доказательства | HAR до очистки с журнальной персистентностью, манифест запросов с подсчётом очисток/утечек по каждому запросу, сопоставления доменов и отчёт об очистке. Сравнения парных ответов проверяют точность размера в байтах и то, сохраняются ли изменения содержимого/статуса после маскирования. Проверки сохранения сигналов фиксируют подтверждённое поведение и оставшиеся дефекты. |
См. поддерживаемое поведение и критерии поставки для статуса реализации и известных ограничений.
Сборка с Go 1.26+. Бинарный файл не имеет внешних зависимостей времени выполнения.
git clone https://github.com/Splinters-io/blinder.git
cd blinder
make build
./blinder --preflight
Следуйте рекомендациям по сертификатам для вашей ОС, затем запустите сессию:
capture_dir=$(mktemp -d)
./blinder --target https://your-authorized-target.example \
--identity YourOrganisation \
--har "$capture_dir/session.har" \
--output "$capture_dir/output"
Направьте браузер или сканер на https://127.0.0.1:8099. Добавляйте несколько токенов идентичности повторяющимися флагами --identity. Остановите с помощью Ctrl-C, чтобы сохранить доказательства сессии.
Используйте --config (-c) для загрузки значений по умолчанию из файла YAML. Флаги CLI переопределяют файл.
# blinder.yaml
listen: "127.0.0.1:9443"
target: "https://example.com"
alias: "target-001.local"
identity:
- "ExampleCorp"
- "example.com"
output: "/tmp/blinder-output"
captcha_config: "captcha.yaml"
no_verify_tls: true
tor:
enabled: false
addr: "127.0.0.1:9050"
har:
path: "/tmp/session.har"
max_body: 10485760
./blinder -c blinder.yaml
# override the listen port from the file:
./blinder -c blinder.yaml --listen 127.0.0.1:7777