零信任、反取证HTTP客户端。清除秘密。切断痕迹。隐形坦克中的CPR。👻
BurnerNet 是一个 C++20 反取证 HTTP 客户端。它提供一个流畅的、类似CPR的API,适用于不能完全信任本地机器的应用程序——从RAM中物理擦除秘密,并切断执行痕迹,以隐藏你的逻辑不被扫描器和调试器发现。
它为普通HTTP提供熟悉的主机兼容默认设置,并为敌对环境提供明确的强化配置文件。两种路径都偏爱短生命周期的客户端;高级信任由应用程序自行掌握。
正在寻找保护由BurnerNet下载的负载的方法?请查看 RipStop Codec 以进行内存中的资产解扰。
| 领域 | BurnerNet |
|---|---|
| 语言 | C++20 |
| 平台 | Windows x64/x86(一级支持),Linux(已验证) |
| 传输层 | 基于 libcurl 的 HTTP(S) |
| 内存卫生 | 安全擦除工具和擦除分配器 |
| 取证卫生 | 自动堆/栈清理,覆盖 BurnerNet 管理的传输状态 |
| 动态分析 | 调用栈隔离可以切断消费者与传输层之间的链接 |
| 构建加固 | 可选的诊断字符串移除、混淆字面量、在加固构建中减少 C++ 运行时元数据 |
| 运行时加固 | DoH 支持、基于提供者的密钥、更严格的信任控制 |
| 集成方式 | CMake 或 Visual Studio 源码植入 |
当普通 HTTP 客户端对你的环境来说过于信任时,请使用 BurnerNet。
当你希望:
它将有所帮助。
BurnerNet 适用于以下项目:
libcurl 和 OpenSSL 支持流的内部内存分配路径。敏感的传输缓冲区在离开 BurnerNet 管理生命周期时被擦除。在文档所述的审计配置中,此卫生措施已在 Windows 和 Linux 上得到验证。WithResponseVerifier(...) 将响应验证保留在你的代码中,而不是硬编码到共享库中。BURNERNET_DIAGNOSTIC_STRINGS=0,使 ErrorCodeToString(...) 返回稳定的 E<数字> 值,而不嵌入符号化的错误名称。BURNERNET_HARDEN_IMPORTS=1 可以动态解析运行时依赖,而不是直接在导入表中声明它们,在 Windows 上使用 BurnerNet 的 KernelResolver 路径。.WithStackIsolation(true) 启用时,库在分离的工作线程上执行传输生命周期。这可以从物理上切断调用者的调用栈,并减少应用逻辑的直接自上而下的追踪。BurnerNet 不仅仅声称具有精简导入的加固模式;它还附带针对特定测试配置的审计说明。在启用了 BURNERNET_HARDEN_IMPORTS=ON 的 Windows x64 Release 审计中:
libcurl.dll、ws2_32.dll、bcrypt.dll 或 crypt32.dll 的条目。审计细节和方法:
最快路径:
<burner/net.h>。最小示例:
#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() 仍然可用作标准兼容别名。
对于安全关键的流量,请使用加固配置文件。Build() 在任何请求之前拒绝缺少的控制:
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();
加固配置文件要求对等体验证和主机名验证、栈隔离、DoH 优先路由、应用程序响应验证器和应用程序拥有的信任挂载。持久化的 WithMtls(...) 凭据被拒绝;请使用 WithMtlsProvider(...)。
当你的下游项目已经使用 CMake 并且你希望采用最干净的依赖管理路径时,请使用此方式。
文档:
当你的环境以 MSBuild 为主,或者你希望将 BurnerNet 直接编译在你的 .vcxproj 内部时,请使用此方式。
文档:
当你希望减少明显的运行时依赖暴露,并准备显式管理引导加载时,请使用此方式。
启用:
BURNERNET_HARDEN_IMPORTS=1KernelResolver 路径,以支持更精简导入的运行时足迹参考:
Linux 支持: BurnerNet 在 Linux 上提供完整的取证功能对等(内存擦除和栈隔离)。请参阅 docs/LINUX_USAGE.md 了解构建说明。
推荐的默认做法:
示例:
文档:
libcurl 7.87.0+ 和 OpenSSL 头文件BurnerNet 是一个加固层,旨在将攻击成本提升到专业级别。我们遵循的原则是:隐身性应该是架构性的,而不仅仅是表面性的。
如果攻击者拥有源代码,他们能绕过 BurnerNet 吗? 了解 BurnerNet 的源代码本身并不能成为每个下游应用程序的万能钥匙。BurnerNet 遵循 Kerckhoffs 原则:该库的设计使得你的应用程序特定的信任锚(HMAC 密钥、固定密钥、UI 逻辑、策略钩子)仍然由应用程序拥有。了解传输层并不能自动实现对你特定安全流程的通用绕过。
| 关注点 | 典型 HTTP 栈 | BurnerNet |
|---|
| 客户端生命周期 | 通常共享且长生命周期 | 设计为可丢弃的客户端和爆发式使用 |
| 敏感值 | 秘密往往在配置或内存中停留超过所需时间 | 提供者回调在接近使用时获取它们 |
| DNS 和信任 | 通常继承本地解析器和主机默认设置 | 支持更严格的信任控制,包括 DoH 回退和固定密钥 |
| 验证 | 特定应用的完整性检查通常事后附加 | 设计为与预检、传输和响应验证钩子一起工作 |