Python ctypes溢出漏洞分析

  • A+
所属分类:安全文章

简介

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/按照安装步骤即刻安装。

Python ctypes溢出漏洞分析

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

Python ctypes溢出漏洞分析

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

Python ctypes溢出漏洞分析

4、执行 cpython-3.8.7rc1PCbuildpcbuild.sln。

Python ctypes溢出漏洞分析

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

Python ctypes溢出漏洞分析

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

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

代码分析

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

Python ctypes溢出漏洞分析

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

Python ctypes溢出漏洞分析

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

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

Python ctypes溢出漏洞分析

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

修复情况

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

Python ctypes溢出漏洞分析

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

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

总结

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

Python ctypes溢出漏洞分析

精彩推荐





Python ctypes溢出漏洞分析


Python ctypes溢出漏洞分析

Python ctypes溢出漏洞分析

Python ctypes溢出漏洞分析

Python ctypes溢出漏洞分析

本文始发于微信公众号(FreeBuf):Python ctypes溢出漏洞分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: