### 简要描述:
利用pycurl上传文件时,如果文件内容是unicode类型,那么会产生Use After Free漏洞
### 详细说明:
文件名: pycurl\src\easy.c

如果setopt给定的FORM_BUFFERPTR的内容是Unicode,如
curl.setopt(pycurl.HTTPPOST, [('field2', (pycurl.FORM_BUFFER, 'uploaded.file', pycurl.FORM_BUFFERPTR, u'test')),])
那么会进入如下流程:
代码1571行会先把unicode转换成str,ostr和olen,分别是str的字符串指针和长度
输入是Unicode的情况下,真是目的是要使用转换为str类型的字符串,对这个str类型的字符串增加引用,因为是通过Python调用C的函数,所以取了字符串指针和长度作为参数给C函数,对应的是ostr和olen
问题出在1588行,先看代码本身: 此处未判断输入串的类型,直接赋值obj等于原始输入串(也就是unicode)的对象,后续会append到list,作用是增加引用,不至于被提前释放
真正需要引用的转换后的str字符串,没有被引用,实际引用了原始输入的Unicode字符串,
而这个str字符串,在这个函数运行完以后,就会被释放,因为没有了引用,但是str的字符串指针,ostr在后续perform时仍然会被使用
实际上该函数setopt完成之后,ostr就成了野指针,因此导致UAF漏洞
pycurl本身是一个功能模块,漏洞要被利用,要看功能的使用者的场景
但原理上,只需要在str被释放之后,马上申请一个Python对象,如str,byte等,并在内容指针的地方放合适的数据,就控制了上传的数据
### 影响版本:
存在于7.19.5.1之前的版本
### 漏洞证明:
见图


修复方案:
判断输入的字符串类型,引用正确的对象
暂无评论