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++ 分析。