调用malloc()时传入NaN会发生什么?是否存在安全漏洞?
调用malloc(NAN)的结果与安全风险分析
首先得明确:malloc的参数要求是size_t类型(无符号整数),而NAN是浮点数类型的特殊值,把它传给malloc本质上是做了一次浮点数到无符号整数的强制类型转换,这种转换的行为在C标准里是未定义的——不同编译器、不同平台的处理方式可能完全不一样。
具体可能出现的几种情况:
- 转换后得到一个极大的
size_t值:这时候malloc会尝试分配远超系统可用内存的空间,几乎肯定会返回NULL。如果程序没检查malloc的返回值就直接使用指针,会触发空指针解引用,直接导致程序崩溃。 - 转换后得到
0:malloc(0)的行为是实现定义的——有的编译器会返回NULL,有的会返回一个不能用来读写的非空指针。如果后续往这个指针指向的区域写数据,会直接造成内存越界,破坏堆结构或者其他内存区域,引发不可预料的崩溃甚至内存损坏。 - 转换后得到随机的
size_t值:这种情况最危险,malloc可能分配一块大小不确定的内存,后续的读写操作很可能超出分配范围,破坏堆的元数据,进而导致堆溢出、use-after-free之类的问题,这类问题如果被攻击者利用,就可能执行任意代码。
关于你问的是否属于安全漏洞:
- 如果是程序内部逻辑错误导致传入
NAN,这属于代码bug,可能引发程序崩溃,但如果没有外部可控的输入途径,一般不算安全漏洞。 - 但如果攻击者能够控制这个传入
malloc的参数(比如通过外部输入构造出NAN并传入),那么这种未定义行为就可能被利用来触发堆破坏、拒绝服务甚至远程代码执行,这时候就属于明确的安全漏洞。
内容的提问来源于stack exchange,提问作者user23635689
相关产品推荐
相关产品推荐

