BYTEORDER.NTOH.READ

从网络到主机读取后未转换字节顺序

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

BYTEORDER.NTOH.READ 检查器会报告某一多字节值未在从相应环境读取后从网络字节顺序转换为主机字节顺序的情况。

漏洞与风险

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

漏洞代码示例

复制
   #include <unistd.h>
   #include <netinet/in.h>
  
  
   void test_06_myread(int d, short *p) {
       read(d, p, sizeof *p);
   }
  
   void test_06_myread_wrapper(int d, short *p) {
      test_06_myread(d, p);
  }
 
 
  int test_06_read(int d) {
      short u;
      test_06_myread_wrapper(d, &u);
      return u - 12; 
  }

在此示例中,Klockwork 在第 17 行报告 BYTEORDER.NTOH.READ,指出 u 已从相应文件读取并已使用,但未转换。对于网络到主机方向,u 应在读取后转换为主机值。如果未加以修正,此情况可能导致意外的程序行为。

修正代码示例

复制
   #include <unistd.h>
   #include <netinet/in.h>
  
  
   void test_06_myread(int d, short *p) {
       read(d, p, sizeof *p);
   }
  
   void test_06_myread_wrapper(int d, short *p) {
      test_06_myread(d, p);
  }
 
 
  int test_06_read(int d) {
      short u;
      test_06_myread_wrapper(d, &u);
      return ntohs(u) - 12;
  }

在该修正代码示例中,“short int”类型的读取值由调用转换为函数“ntohs”。读取正确的主机值类型意味着程序将按预期操作。

扩展

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

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

  • BO.SEND
  • BO.HTON.O

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