BYTEORDER.HTON.SEND

从主机发送到网络前未转换字节顺序

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

BYTEORDER.HTON.SEND 检查器会报告源自主机端的多字节值未在发送前从主机字节顺序转换为网络字节顺序的情况。

漏洞与风险

当在使用不同字节顺序方法的系统下运行的程序需要相互通信时,如果未能转换字节顺序,可能导致意外行为。为避免此问题,在传输数据时应使用合适类型的转换函数。

漏洞代码示例

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

   void test_01_send_A(int s, short x) {
         short u = x + 12;
         send(s, &u, sizeof u, 0); // <== error
   }

Klockwork 针对第 7 行报告 BYTEORDER.HTON.SEND,指出 u 已发送但未转换。对于主机到网络方向,u 应转换为网络值,然后才能发送到网络。如果未加以修正,此情况可能导致意外的程序行为。

修正代码示例

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

   void test_01_send_B(int s, short x) {
         short u = x + 12;
         short v = htons(u);
         send(s, &v, sizeof v, 0); // ok
   }

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

扩展

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

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

  • BO.SEND
  • BO.HTON.O

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