BYTEORDER.NTOH.RECV

从网络到主机接收后未转换字节顺序

有两种主要的多字节值存储方法:大端和小端。当数据在使用不同方法的系统之间进行传输时,多字节值应从主机字节顺序转换为网络字节顺序,或刚好相反。BYTEORDER 检查器会查找未正确转换多字节值的情况。

BYTEORDER.NTOH.RECV 检查器会报告某一多字节值未在接收后从网络字节顺序转换为主机字节顺序的情况。

漏洞与风险

当在使用不同字节顺序方法的系统下运行的程序需要相互通信时,如果未能转换字节顺序,可能导致意外行为。网络到主机和主机到网络的转换应通过网络操作和文件读取/写入操作来执行,以确保数据的便携性。为避免此问题,使用数据前,可使用合适的转换函数。

漏洞代码示例

复制
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <netinet/in.h>

   int test_01_recv_A(int s) {
         short u;
         recv(s, &u, sizeof u, 0);
         return u - 12; 
   }

Klockwork 在第 8 行报告 BYTEORDER.NTOH.RECV,显示出 u 已接收并使用,但未进行转换。对于网络到主机方向,u 应在接收后转换为主机值。如果未加以修正,此情况可能导致意外的程序行为。

修正代码示例

复制
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <netinet/in.h>

   int test_01_recv_B(int s) {
         short u;
         short v;
         recv(s, &u, sizeof u, 0);
         v = ntohs(u);
        return v - 12; 
  }

在该修正代码示例中,“short int”类型的接收值通过调用函数“ntohs”进行转换。接收正确的主机值类型意味着程序将按预期运行。

扩展

此检查器可进行扩展。通过 Klocwork 知识库可添加特定于平台和特定于应用程序的信息。配置信息用于描述执行缓冲区操作的系统功能的属性。在标准发行版中,提供了多个特定于平台的配置。

相关的 C/C++ 知识库记录类型包括:

  • BO.SEND
  • BO.HTON.O

有关详情,请参阅调整 C/C++ 分析。