我有一台接受客户请求的服务器。客户端使用boost序列化来序列化数据,Server对数据进行反序列化以获得实际请求。 攻击者可能会向服务器发送欺诈请求。服务器需要检测无效输入。问题是如何?
// client request
char* input = ...;
int size = ...;
SomeType to_serialize;
try {
boost::iostreams::array_source source(input, size);
boost::iostreams::stream<boost::iostreams::array_source> source_stream(
source);
boost::archive::binary_iarchive iarch(source_stream);
iarch >> to_serialize;
} catch (...) {
...
}
目前,当收到无效请求时,服务器可能需要malloc最多1.7TB内存。并发生OOM错误。
答案 0 :(得分:0)
我认为没有办法。 Boost中没有真正的可移植存档格式。
您可以使用EOS Portable Archive之类的第三方存档。
在继续使用非原始反序列化函数之前,您仍然希望对要发送的归档版本进行编码并进行明确检查。
也许您可以在归档流¹之前设计自己的标题。根据您的有效负载,您也可以在收到完整流后添加校验和。
如果您需要以流模式接收(例如,因为整个流太大而无法容纳在内存中,并且您正在构建映射/共享内存中的数据结构?)并且仍然需要校验和,您可以在基础流中实现这些水平。请参阅https://www.boost.org/doc/libs/1_66_0/libs/iostreams/doc/index.html获取灵感。