漏洞产生原因

| categories notes 
tags 漏洞 

类型错误

A函数调用B函数,传递了类型P。B函数内部将其转换为类型Q。然而实际传递的数据类型为A,导致B函数操作Q的时候发生预期外的情况。

这里P,Q为同一类型的子类,否则编译不通过。

e.g. CVE-2014-4943

a数组类型为char,传递给B函数,B函数参数为unsighed int,在B中遍历a数组时,错误的用了a的长度,导致越界读或越界写。

e.g. https://github.com/asarubbo/poc/blob/master/00209-pcre-stackoverflow2-read_capture_name32,CVE-2017-7246

空指针

直接食用了A->B->C,然而A->B为空,导致空指针异常。

一般使用指针之前需要先检查为空。

e.g. CVE-2013-7339 CVE-2014-2678

无限循环

for(;;) {
    somecode:
        break
    continue;
}

循环内有条件跳转。通过构造输入,导致跳转条件永远不可达,则导致无限循环的DOS。

整数溢出

在有乘法的时候更容易发生,不过加法也可能,只是比较慢。

a += k;
if (a < b + c) {
    b += c; // 溢出
}

调用逻辑错误

A函数调用B,B函数执行出错返回。但是A没有校验B的返回值,导致A函数以B函数执行成功的条件继续执行,导致出现各种错误。

If you liked this post, you can share it with your followers !