
HTTP-клиент с нулевым доверием и анти-форензикой. Уничтожает секреты. Обрывает следы. CPR в стелс-танке. 👻
# BurnerNet
**HTTP-клиент с нулевым доверием и антифорензикой. Стирает секреты. Уничтожает следы. Реанимация в стелс-танке. 👻**
BurnerNet — это **антифорензический HTTP-клиент** на C++20. Он предоставляет плавный, CPR-подобный API для приложений, которые не могут полностью доверять локальной машине, физически стирая секреты из ОЗУ и разрывая следы выполнения, чтобы скрыть вашу логику от сканеров и отладчиков.
Он предлагает знакомые, совместимые с хостом настройки по умолчанию для обычного HTTP и явный профиль Hardened для враждебных сред. Оба пути отдают предпочтение недолговечным клиентам; расширенное доверие остаётся на стороне приложения.
Ищете защиту полезных нагрузок, загруженных BurnerNet? Ознакомьтесь с [RipStop Codec](https://github.com/Krixx1337/ripstop-codec) для дешифровки активов в памяти.
[Принципы](https://github.com/krixx1337/burner-net/blob/main/PRINCIPLES.md) • [Начало работы](#getting-started) • [Способы интеграции](#integration-paths) • [Реалии безопасности](#security-reality--the-white-box-defense)
## Краткий обзор
| Область | BurnerNet |
| :--- | :--- |
| **Язык** | C++20 |
| **Платформа** | Windows x64/x86 (**Первый класс**), Linux (Проверено) |
| **Транспорт** | HTTP(S) на базе `libcurl` |
| **Гигиена памяти** | Утилиты безопасного стирания и распределители с затиранием |
| **Форензическая гигиена** | Автоматическая очистка кучи/стека на всём протяжении управляемого BurnerNet транспортного состояния |
| **Динамический анализ** | Изоляция стека вызовов может разорвать связь между потребителем и транспортом |
| **Укрепление сборки** | Опциональное удаление диагностических строк, обфусцированные литералы, уменьшение метаданных среды выполнения C++ в укреплённых сборках |
| **Укрепление выполнения** | Поддержка DoH, поставщики секретов и более строгие элементы управления доверием |
| **Интеграция** | CMake или Visual Studio — добавление исходников |
## Зачем это использовать
Используйте BurnerNet, когда обычный HTTP-клиент слишком доверчив для вашего окружения.
Он помогает, когда вы хотите:
- сделать клиенты запросов недолговечными вместо единого глобального транспорта
- уменьшить зависимость от локального DNS и других настроек хоста по умолчанию
- получать токены, сертификаты и секреты проверки только по мере необходимости
- оставить логику проверки ответов в собственном коде приложения
- уменьшить количество открытых строковых констант и метаданных в укреплённых сборках
## Для кого это
BurnerNet подходит для таких проектов, как:
- Windows-приложения на рабочем столе с запросами высокой ценности (аутентификация, лицензирование, обновления)
- встраиваемый или инжектированный код, выполняющийся в хосте, которому вы не до конца доверяете
- инструменты, которым нужны более строгие транспортные проверки без отказа от удобного C++ API
## Стандартный стек против BurnerNet
| Аспект | Типичный HTTP-стек | BurnerNet |
| :--- | :--- | :--- |
| **Время жизни клиента** | Часто общий и долгоживущий | Предназначен для одноразовых клиентов и всплесковых задач |
| **Чувствительные значения** | Секреты часто находятся в конфиге или памяти дольше необходимого | Обратные вызовы поставщиков получают их непосредственно перед использованием |
| **DNS и доверие** | Обычно наследует локальный резолвер и настройки хоста | Поддерживает более строгие элементы управления доверием, включая DoH и закреплённые ключи |
| **Проверка** | Специфичные для приложения проверки целостности часто добавляются позже | Создан для работы с хуками предварительной проверки, транспортной проверки и проверки ответов |
## Оборонительные результаты
- **Архитектура памяти "Zero-Ghost"**: BurnerNet использует собственный **префиксно-размерный очиститель** для перехвата внутренних путей выделения памяти в `libcurl` и потоках OpenSSL. Чувствительные транспортные буферы стираются, когда покидают управляемый BurnerNet жизненный цикл. **Эта гигиена проверена как на Windows, так и на Linux в рамках аудируемых конфигураций, описанных в документации.**
- **Затирание кадров стека**: После каждого запроса библиотека активно очищает собственный стек потока (очистка по отметке верхнего уровня воды). Это предназначено для уничтожения эфемерных транспортных фрагментов до возврата управления вашему приложению.
- **Динамическая куча**: Сочетание одноразовых транспортов и выровненных заголовков метаданных создаёт высокую дисперсию адресного пространства, делая память процесса непредсказуемой и устойчивой к стабильному отображению указателей.
- **Недолговечное состояние запроса**: BurnerNet спроектирован вокруг одноразовых клиентов вместо общепроцессных синглтонов-транспортов.
- **Меньше доверия к хосту**: Поддержка DoH, закреплённых ключей и аудит транспорта помогают снизить зависимость от скомпрометированных локальных настроек.
- **Меньшая открытость текстовых данных**: Обратные вызовы поставщиков и утилиты безопасного стирания сокращают время жизни сертификатов, ключей, токенов и других чувствительных буферов.
- **Проверка, принадлежащая приложению**: Проверка ответов остаётся в вашем коде через `WithResponseVerifier(...)` вместо того, чтобы быть жёстко закодированной в общей библиотеке.
- **Усложнение статического снятия отпечатков**: Укреплённые сборки могут установить `BURNERNET_DIAGNOSTIC_STRINGS=0`, чтобы `ErrorCodeToString(...)` возвращала стабильные значения `E<number>` без встраивания символьных имён ошибок.
- **Варианты развёртывания с лёгким импортом**: `BURNERNET_HARDEN_IMPORTS=1` может динамически разрешать зависимости среды выполнения вместо прямого объявления их в таблице импорта, используя путь `KernelResolver` BurnerNet в Windows.
- **Изоляция стека вызовов (асинхронная передача)**: При включении через `.WithStackIsolation(true)` библиотека выполняет жизненный цикл транспорта на отдельном рабочем потоке. Это может физически разорвать стек вызовов вызывающей стороны и уменьшить прямое нисходящее отслеживание логики приложения.
## Подтверждённая скрытность
BurnerNet не просто заявляет о режиме укрепления с лёгким импортом; он также поставляется с примечаниями аудита для конкретных протестированных конфигураций. В аудите Windows x64 Release с `BURNERNET_HARDEN_IMPORTS=ON`:
- **Затемнение IAT**: В аудируемом бинарном файле не было обнаружено записей для `libcurl.dll`, `ws2_32.dll`, `bcrypt.dll` или `crypt32.dll`.
- **Темнота памяти**: Судебные сканы (Cheat Engine "All Strings") не смогли обнаружить чувствительные канальные URL или заголовки в куче или стеке процесса.
- **Слепота отладчика**: Интегрированные тесты подтверждают, что библиотека вызывает «Сдвиг идентичности». Лицо, принимающее решения (ваше приложение), и Транспортёр (BurnerNet) работают на разных идентификаторах потоков, уменьшая нисходящее отслеживание во время сеансов живой отладки.
- **Шум против сигнала**: Библиотека стремится к судебной гигиене в рамках своих полномочий по стиранию, признавая оставшиеся системные «тени» в ОС и среде выполнения.
Подробности аудита и методология:
- [docs/BINARY_STEALTH_AUDIT.md](https://github.com/krixx1337/burner-net/blob/main/docs/BINARY_STEALTH_AUDIT.md)
## Начало работы
Самый быстрый путь:
- Добавьте BurnerNet в свою сборку через CMake или Visual Studio source-drop.
- Включите `<burner/net.h>`.
- Создайте стековый клиент, отправьте запрос, затем дайте ему выйти из области видимости.
Минимальный пример:
```cpp
#include <iostream>
#include <burner/net.h>
int main() {
burner::net::Client client;
if (!client.IsReady()) {
std::cerr << burner::net::ErrorCodeToString(client.InitError()) << '\n';
return 1;
}
const auto response = client
.Get("https://example.com")
.WithHeader("Accept", "text/html")
.WithTimeoutSeconds(10)
.Send();
if (!response.TransportOk()) {
std::cerr << burner::net::ErrorCodeToString(response.transport_error) << '\n';
return 1;
}
std::cout << "HTTP " << response.status_code << '\n';
return 0;
}
```
`Client` использует стандартные настройки: системный CA, DNS и прокси с включённой проверкой однорангового узла и имени хоста через TLS. `WithCasualDefaults()` остаётся доступным как псевдоним совместимости со Standard.
Для критического с точки зрения безопасности трафика используйте профиль Hardened. `Build()` отклоняет отсутствующие элементы управления перед любым запросом:
```cpp
auto secure = burner::net::ClientBuilder(burner::net::ClientProfile::Hardened)
.WithMtlsProvider(ProvideMtlsCredentials)
.WithSecurityPolicy(AppSecurityPolicy{})
.WithDnsFallback(burner::net::DnsMode::Doh,
"https://resolver.example/dns-query",
"Primary DoH")
.AllowSystemDns(true) // явный резерв, после DoH
.WithResponseVerifier(VerifySignedResponse)
.Build();
```
Hardened требует проверки однорангового узла и имени хоста, изоляции стека, маршрутизации через DoH в первую очередь, проверщика ответов приложения и точки доверия, принадлежащей приложению. Постоянные учётные данные `WithMtls(...)` отклоняются; используйте `WithMtlsProvider(...)`.
## Способы интеграции
### 1. Стандартный CMake
Используйте это, если ваш downstream-проект уже использует CMake и вы хотите самый чистый путь с управлением зависимостями.
Документация:
- [docs/CMAKE_INTEGRATION.md](https://github.com/krixx1337/burner-net/blob/main/docs/CMAKE_INTEGRATION.md)
- [examples/cmake-consumer/README.md](https://github.com/krixx1337/burner-net/blob/main/examples/cmake-consumer/README.md)
### 2. Visual Studio Source-Drop
Используйте это, если ваша среда ориентирована на MSBuild или вы хотите, чтобы BurnerNet компилировался непосредственно внутри вашего `.vcxproj`.
Документация:
- [docs/VISUAL_STUDIO_INTEGRATION.md](https://github.com/krixx1337/burner-net/blob/main/docs/VISUAL_STUDIO_INTEGRATION.md)
- [examples/vs-consumer/README.md](https://github.com/krixx1337/burner-net/blob/main/examples/vs-consumer/README.md)
### 3. Укреплённые импорты среды выполнения
Используйте это, если вы хотите уменьшить очевидное воздействие зависимостей среды выполнения и готовы явно управлять загрузкой начальной загрузки.
Включите:
- `BURNERNET_HARDEN_IMPORTS=1`
- Использует путь `KernelResolver` BurnerNet в Windows для поддержки более лёгкого по импорту следа среды выполнения
Ссылки:
- [docs/USAGE_BEST_PRACTICES.md](https://github.com/krixx1337/burner-net/blob/main/docs/USAGE_BEST_PRACTICES.md)
- [docs/CMAKE_INTEGRATION.md](https://github.com/krixx1337/burner-net/blob/main/docs/CMAKE_INTEGRATION.md)
- [docs/VISUAL_STUDIO_INTEGRATION.md](https://github.com/krixx1337/burner-net/blob/main/docs/VISUAL_STUDIO_INTEGRATION.md)
> **Поддержка Linux:** BurnerNet обеспечивает полную судебную паритетность (стирание памяти и изоляцию стека) в Linux. См. [docs/LINUX_USAGE.md](https://github.com/krixx1337/burner-net/blob/main/docs/LINUX_USAGE.md) для инструкций по сборке.
## Примечания по использованию
Рекомендуемые настройки по умолчанию:
- рассматривать клиентов как одноразовые транспорты
- разделять трафик с высоким и низким доверием на разные клиенты
- использовать обратные вызовы поставщиков для материала mTLS, токенов-носителей и секретов проверки ответов
- оставлять бизнес-правила и точки доверия в вашем приложении
## Примеры и документация
Примеры:
- [examples/01_basic_usage.cpp](https://github.com/krixx1337/burner-net/blob/main/examples/01_basic_usage.cpp)
- [examples/02_zero_trust_pipeline.cpp](https://github.com/krixx1337/burner-net/blob/main/examples/02_zero_trust_pipeline.cpp)
- [examples/03_custom_security_policy.cpp](https://github.com/krixx1337/burner-net/blob/main/examples/03_custom_security_policy.cpp)
- [examples/04_bootstrap_runtime.cpp](https://github.com/krixx1337/burner-net/blob/main/examples/04_bootstrap_runtime.cpp)
- [examples/05_mtls_usage.cpp](https://github.com/krixx1337/burner-net/blob/main/examples/05_mtls_usage.cpp)
- [examples/06_hmac_custom_verifier.cpp](https://github.com/krixx1337/burner-net/blob/main/examples/06_hmac_custom_verifier.cpp)
Документация:
- [PRINCIPLES.md](https://github.com/krixx1337/burner-net/blob/main/PRINCIPLES.md)
- [docs/USAGE_BEST_PRACTICES.md](https://github.com/krixx1337/burner-net/blob/main/docs/USAGE_BEST_PRACTICES.md)
- [docs/CMAKE_INTEGRATION.md](https://github.com/krixx1337/burner-net/blob/main/docs/CMAKE_INTEGRATION.md)
- [docs/VISUAL_STUDIO_INTEGRATION.md](https://github.com/krixx1337/burner-net/blob/main/docs/VISUAL_STUDIO_INTEGRATION.md)
- [docs/LINUX_USAGE.md](https://github.com/krixx1337/burner-net/blob/main/docs/LINUX_USAGE.md)
## Требования
- C++20
- Windows x64/x86 или Linux (GCC 13+ / Clang 15+)
- `libcurl` 7.87.0+ и заголовки `OpenSSL`
- **Руководство для Linux:** См. [docs/LINUX_USAGE.md](https://github.com/krixx1337/burner-net/blob/main/docs/LINUX_USAGE.md)
## Реалии безопасности и защита "Белого ящика"
BurnerNet — это уровень укрепления, предназначенный для повышения стоимости атаки до профессионального уровня. Мы исходим из принципа, что **скрытность должна быть архитектурной, а не просто поверхностной.**
**Может ли злоумышленник обойти BurnerNet, имея исходный код?**
Знание исходного кода BurnerNet само по себе не является мастер-ключом к каждому downstream-приложению. BurnerNet следует принципу Керкгоффса: библиотека спроектирована так, чтобы ваши специфичные для приложения точки доверия (секреты HMAC, закреплённые ключи, логика UI, политики) оставались в собственности приложения. Знание транспортного уровня не даёт автоматического универсального обхода вашего конкретного потока безопасности.
- **Скрытность как задержка:** Укрепление вынуждает злоумышленников покидать стандартные удобные инструменты и переходить к утомительному анализу на уровне инструкций.
- **Данные как корень:** Используйте **Функциональную зависимость** (Принцип 6), чтобы ваше приложение было буквально сломано без данных, предоставляемых сервером.
- **Преимущество призрака:** К тому времени, как злоумышленник найдёт вашу логику запроса, **Изоляция стека** и **Стирание памяти** уже уничтожат нужные им судебные доказательства.