BYTEORDER.HTON.WRITE

从主机写入网络前未转换字节顺序

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

BYTEORDER.HTON.WRITE 检查器会报告源自主机端的多字节值未在写入相应环境(例如写入文件)前从主机字节顺序转换为网络字节顺序的情况。

漏洞与风险

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

漏洞代码示例

复制
   #include <unistd.h>;
   #include <netinet/in.h>;
  
  
   void test_06_mywrite(int s, short *p) {
       write(s, p, sizeof *p);
   }
  
   void test_06_mywrite_wrapper(int s, short *p) {
      test_06_mywrite(s, p);
  }
 
 
  void test_06_write(int s, short x) {
      short u = x + 12;
      test_06_mywrite_wrapper(s, &u); 
  }

Klockwork 在第 16 行报告了 BYTEORDER.HTON.WRITE,显示出 u 已写入但未转换。对于主机到网络方向,u 应转换为网络值,然后才能写入。如果未加以修正,此情况可能导致意外的程序行为。

修正代码示例

复制
   #include <unistd.h>
   #include <netinet/in.h>
  
  
   void test_06_mywrite(int s, short *p) {
       write(s, p, sizeof *p);
   }
  
   void test_06_mywrite_wrapper(int s, short *p) {
      test_06_mywrite(s, p);
  }
 
 
  void test_06_write(int s, short x) {
      short u = x + 12;
      u = htons(u);
      test_06_mywrite_wrapper(s, &u);
  }

在该修正代码中,“short int”类型的值在写入前通过调用函数“htons”进行转换。写入正确的网络值类型意味着程序将按预期操作。

扩展

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

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

  • BO.SEND
  • BO.HTON.O

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