社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python ctypes溢出漏洞分析

FreeBuf • 4 年前 • 512 次点击  

简介

Python是一款快速、优雅的编程语言。ctypes 是Python的外部函数库,它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数,可使用该模块以纯 Python 形式对这些库进行封装。在ctypes之中存在栈溢出问题。漏洞影响范围:小于3.9.1版本,影响模块_ctypes/callproc.c。

分析环境

系统版本:Win10 x64      

环境版本:VS2019      

Python源码版本:3.8.7rc1

环境搭建

1、安装VS2019,访问 https://visualstudio.microsoft.com/zh-hans/vs/按照安装步骤即刻安装。

2、访问 https://github.com/python/cpython/tree/v3.8.7rc1/下载CPython源码。

3、在管理员权限下执行 cpython-3.8.7rc1\PCbuild\build.bat 等待其执行成功。

4、执行 cpython-3.8.7rc1\PCbuild\pcbuild.sln。

5、启动vs2019之后,右键选择 解决方案 找到 属性->配置属性。因为其他模块不需要分析,所以就不用编译。按照图中勾选。

6、选择菜单栏之中 生成->生成解决方案。

7、环境启动后,在需要调试的方法上设置断点。

代码分析

先来看到 _ctypes\callproc.c PyCArg_repr 方法。这个函数的作用将数据类型转换为C数据类型进行传递。该方法内定义变量 buffer[256]用于存放字符。

问题代码位于 cpython-3.8.7rc1\Modules_ctypes\callproc.c Line:521。使用sprintf作为字符串格式化,由于双精度长度超过预期。当给予超长字符串时候将会触发字符串超长溢出。

咱们执行POC之后观察DEBUG情况

>>> from ctypes import * >>> c_double.from_param(1e300)

Debug情况表示已经触发溢出,漏洞实际影响较小,buffer 256长度无法继续利用。如果大佬有什么好思路,欢迎补充。

修复情况

咱们访问 https://github.com/python/cpython/blob/master/Modules/_ctypes/callproc.cLine:488 PyCArg_repr()。

在新版本之中该问题已经得到修复,已经将sprintf换成PyUnicode_FromFormat。

温馨提示:最新版已修复,需要使用C\C++开发Python模块的大佬要注意更新。

总结

Python作为胶水语言为了结合各类语言的优势,安全问题相对涉及面较为广泛。虽然问题影响不大,但是挖掘漏洞的思路非常好。

精彩推荐







Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/108796
 
512 次点击