【发布时间】:2021-10-01 16:16:19
【问题描述】:
例如,我有一个 TCP 服务器需要在接收所述数据之前知道一些任意数据的无符号整数 (uint32_t) 大小。为了接收任意数据,客户端首先必须发送使用htonl 编码的uint32_t 无符号整数的大小字节,例如(客户端):
uint32_t size_int = // some size integer calculated before
uint32_t nbo_data = htonl(size_int);
// send nbo_data to server...
为了解码字节,服务器将执行以下操作:
// First receive nbo_bytes into receive_buffer...
uint32_t nbo_data;
memcpy(&nbo_data, receive_buffer, sizeof(uint32_t));
uint32_t size_int = ntohl(nbo_data);
现在假设攻击者发送了超过UINT32_MAX值/4294967295的htonl编码的uint32_t字节。如何防止发生整数上溢/下溢?将简单转换为更大的数据类型,即long long 和边界检查就足够了吗?像这样:
char receive_buffer[1024];
// First receive nbo_bytes into receive_buffer...
uint32_t nbo_data;
memcpy(&nbo_data, receive_buffer, sizeof(uint32_t));
long long size_int = (long long)ntohl(nbo_data);
// Check if size_int > UINT32_MAX or size_int < 0 here
// If true raise error.
或者有没有更好的方法/这种方法是否有缺陷且无效?
【问题讨论】:
-
32 位的数量不可能超过 UINT32_MAX。
-
@Mat 所以换句话说,转换为
long long并检查边界/范围是多余的? -
不仅冗余,而且容易出错。 (而且一开始就没有意义。)
-
无符号整数永远不会溢出,它们只是环绕。
标签: c security tcp integer-overflow