PORTING.BYTEORDER.SIZE
网络转换宏使用了不兼容的类型
PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.BYTEORDER.SIZE 检查器会检测网络字节顺序宏 ntoh*() 和 hton*() 与不兼容类型一起使用的情况。
漏洞与风险
根据针对类型提升和类型降级的基础 ANSI 语义学,常见的数据转换函数可以接受不适当的类型来作为自变量,这导致可能出现不正确的转换。在最坏的情况下,这可能导致随机数据作为字节操纵进程的一部分进行转换。
缓解与预防
在代码对来自网络或发送至网络的数据进行转换时,始终使用适当的 ntoh*() or hton*() 变体。
漏洞代码示例
复制
unsigned short foo(int socket)
{
int len;
unsigned short val = 0;
len = read(socket, &val, sizeof(unsigned short));
if( len == sizeof(unsigned short) )
val = ntohl(val); // PORTING.BYTEORDER.SIZE
return val;
}
检查器针对第 7 行生成警告,因为传递的类型大小 (unsigned short) 与转换函数 ntohl() 所预期的大小不同。
修正代码示例
复制
unsigned short foo(int socket)
{
int len;
unsigned short val = 0;
len = read(socket, &val, sizeof(unsigned short));
if( len == sizeof(unsigned short) )
val = ntohs(val);
return val;
}
经修复的示例使用了大小适当的宏进行转换,确保交换预期大小的字节。