PORTING.BSWAP.MACRO
在不检查字节顺序的情况下使用自定义字节交换宏
PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.BSWAP.MACRO 检查器会检测那些在不检查字节顺序的情况下使用自定义字节交换宏的情况。为了让 PORTING.BSWAP.MACRO 检查器将代码标记为字节交换宏,宏定义必须包括移位运算符和要移位的位数,可以是:
- 左位移 (<<) 或右位移 (>>) 运算符
- 按位与 (&) 或按位或 (|) 运算符
- 8 的倍数的整数文本
- 字节掩码,比如 0xFF 或 0xFF00
如果未采用字节顺序保护宏来保护字节交换宏,Klocwork 会报告该问题。
漏洞与风险
典型的字节交换宏会假设按照整型布局来移动数据,例如通过交换 MSB 和 LSB。在底层芯片的字节顺序性质可能因时间不同而发生变化的环境中(比如在各构建之间),此类操作可能不安全,尤其是被转换的整型读取自永久存储器或其他硬件环境中时。
缓解与预防
与任何字节顺序易受攻击的操作一样,通过 BIG_ENDIAN 或 LITTLE_ENDIAN 保护宏来保护宏定义,可让您确保所执行的转换适合所使用的环境。
漏洞代码示例
复制
// Pretty normal byte swapping macro, changes unsigned integers from one type of endian to another
#define SWAPBYTES(x) ( ((x) & 0xff) << 24 ) | ( (((x) >> 8) & 0xff) << 16 ) | ( (((x) >> 16) & 0xff) << 8 ) | ( (((x) >> 24) & 0xff)
在本示例中,宏的定义专用于特定的字节顺序体系结构,但定义本身并未得到保护,并可能被不适当地编译到针对相反体系结构所设计的构建中。
修正代码示例
复制
// Now the definition is endian-guarded
#if BIG_ENDIAN
#define SWAPBYTES(x) ( ((x) & 0xff) << 24 ) | ( (((x) >> 8) & 0xff) << 16 ) | ( (((x) >> 16) & 0xff) << 8 ) | ( (((x) >> 24) & 0xff) )
#else
#define SWAPBYTES(x) ( x )
#endif
在经修复的示例中,宏定义以适当的字节顺序保护进行了保护,并可以针对相反的体系结构定义相应的替代品。