概念
当动态分配的内存释放时,该内存的内容是不确定的,有可能保存完整并可以被访问。
重新分配和回收释放时由内存管理程序决定的,但是也可能该内存的内容已经被改变,从而导致意外的程序行为。
当内存释放之后,应当保证不再对其进行写入和读取。
UAF会导致包括程序异常终止,任意代码执行和拒绝服务攻击等危险。
漏洞编号 | 漏洞概述 |
CVE-2018-1000051 | Artifex Mupdf V1.12.0的fz_keep_key_storable 存在UAF漏洞,导致拒绝服务或代码执行 |
CVE-2018-17474 | Chrome V70.0.3538.67之前版本中,Bink引擎的HTMLImportsController中存在一个UAF漏洞,导致攻击者可以构造一个特殊的HTML网页去利用堆损坏问题。 |
CVE-2018-15924 | Adobe Acrobat 和 Reader 2018.011.20063及之前版本,2017.011.30102及之前版本、2015.006.30452及之前版本存在UAF漏洞,攻击者可以利用该漏洞执行任意代码。 |
CVE-2019-9447 | Android Kernel 中的FingerTipS Touchscreen 驱动程序存在UAF漏洞,攻击者可以利用该漏洞提升权限。 |
CVE-2020-9606 | Adobe Acrobat 和 Reader 2020.006.20042及之前版本,2017.011.30166及之前版本、2015.006.30518及之前版本存在UAF漏洞,攻击者可以利用该漏洞执行任意代码。 |
CVE-2021-3348 | Linux Kernel through 5.10.12存在UAF漏洞,攻击者可以利用该漏洞在设备安装过程中的某个点通过IO请求触发攻击。 |
代码
void Use_After_Free()
{
char *data;
data=NULL;
data=(char *) malloc(100*sizeof(char));
if (data==NULL) {exit (-1);}
memset(data,'A',100-1);
data[100-1]='\0';
/*释放data*/
free(data);
/*释放后使用*/
printLine(data);
}
避免UAF
1. 释放内存后置空指针
2. 循环语句中进行内存动态分配或释放时,谨慎确认