☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不应使用非零常量对指针赋值

14.11 ID_fixedAddrToPointer
目录 › next › previous

将非零常量作为固定地址是不可移植的,且存在安全隐患。

示例:

const void* badAddr = (void*)0xffffffff;  // Non-compliant

示例代码的本意是声明一个表示无效地址的值,但在 64 位系统中这个地址可能是有效的。

又如:

typedef int (*fp_t)(int);
fp_t fp = (fp_t)0x1234abcd;  // Non-compliant
int res = (*fp)(123);        // Unsafe

示例代码假设在特定地址可以找到特定的函数,将该地址赋给一个指针并调用,这种假设是不可移植的,也可能本身就是错误的,会导致崩溃,而且函数地址往往也属于敏感信息,不应被写入代码,否则一旦泄露,攻击者可以更改预期地址上的数据,导致恶意代码被执行。

某些框架或系统会以 -1 表示无效地址,但不具备通用性,审计工具不妨通过配置决定是否放过。

例外:

#define DEVICE_BASE ((volatile Dev*)0x1234)

volatile Dev* p = DEVICE_BASE;  // Let it go if the address is right

如果固定地址受环境支持,如固定的设备地址,可不受本规则约束,但应通过接口获取地址,避免将常量地址写死在代码中。

配置

allowMinusOneAsPointerValue: 是否允许 -1 作为指针的值

相关

ID_addressExposure ID_plainSensitiveInfo ID_ptrIntCast

参考

CWE-587
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.