【漏洞处置SOP】Python安全漏洞(CVE-2019-9636、CVE-2023-24329)

【漏洞处置SOP】Python安全漏洞(CVE-2019-9636、CVE-2023-24329)

原创 SSS 方桥安全漏洞防治中心 2025-02-19 09:01

01

SOP基本信息

  • SOP名称:Python安全漏洞(CVE-2019-9636、CVE-2023-24329)处置标准作业程序(SOP)

  • 版本:1.0

  • 发布日期:2024-12-20

  • 作者:just4fun

  • 审核人:T小组

  • 修订记录:

  • 初始版本:创建SOP

02

SOP的用途

本SOP旨在指导系统管理员安全、高效地处置Python安全漏洞(CVE-2019-9636、CVE-2023-24329),确保在规定时间内完成漏洞修复并提交给安全部门验证,保障系统安全。


03

SOP的目标用户技能要求

  • 熟悉Python编程语言和环境

  • 了解基本的系统管理和更新操作

  • 具备基本的网络安全知识

04

漏洞详细信息

1.CVE-2019-9636:Python 信任管理问题漏洞

  • 漏洞描述:Python 2.7.x版本至2.7.16版本和3.x版本至3.7.2版本中存在信任管理问题漏洞。攻击者可借助特制的URL利用该漏洞泄露信息(如cookies或身份验证数据)。

  • 漏洞影响:主要影响上述指定版本的Python环境。

  • 修复措施:升级到不受影响的Python版本。

  • 注意:某些操作系统或软件发行版可能已经通过打补丁的方式修复了此漏洞,而无需用户升级到最新的Python版本。

  • 参考信息:该漏洞信息来源于麒麟软件有限公司的官方网站,该公司专注于国产操作系统的研发。

CVE官网介绍:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9636

2.CVE-2023-24329:Python urllib.parse 安全特性绕过漏洞
漏洞描述:在Python的urllib.parse组件中,当整个URL以空白字符开头时,会出现解析问题,影响主机名和方案的解析。攻击者可以通过提供以空白字符开头的URL来绕过使用阻止列表实现的任何域或协议过滤方法,可能导致任意文件读取、命令执行或SSRF等。

  • 漏洞影响:影响Python < 3.12以及特定版本的Python 3.x(如3.11.x < 3.11.4、3.10.x < 3.10.12等)。

  • 修复措施:升级到不受影响的Python版本,如Python >= 3.12或特定版本的Python 3.x的更新版本。

  • 参考信息:CVE官网介绍:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-24329

05

漏洞处置方案

  • 修复版本:

  • CVE-2019-9636:建议升级到3.12.5版本。

  • CVE-2023-24329:建议升级到3.12.5版本。

  • 补充说明:

根据经验,推荐升级到3.12.5版本,该版本于2024年8月6日发布,兼容性和性能方面表现良好,具有以下特性:
– 更灵活的f字符串解析,允许许多以前不允许的事情。

  • 支持Python代码中的缓冲区协议。

  • 一种新的调试/评测API。

  • 支持具有单独全局解释器锁的隔离子解释器。

  • 更改进的错误消息。现在,更多可能由拼写错误引起的异常会向用户提出建议。

  • 支持Linux性能分析器在跟踪中报告Python函数名。

  • 许多大大小小的性能改进(如PEP 709和对BOLT二进制优化器的支持),估计总体性能提高了5%。

  • 修复方法:

卸载现有python版本,重新安装新的安全的python版本。

从官网https://www.python.org/downloads/下载适合自己操作系统的安全版本安装包,升级python版本。

注意事项

  • 在进行任何修复操作之前,务必备份所有重要数据和配置文件。

  • 升级或补丁应用过程中应尽量减少对业务的影响,尽量在维护窗口内完成所有操作。

  • 遵循官方提供的安装和配置指南进行操作。

  • 在生产环境中升级前,最好在测试环境中先进行测试。

  • 修复漏洞前进行充分测试,以确保系统稳定性和安全性。

06

漏洞修补详细步骤

以下是具体可操作的详细修复步骤参考:
1. ## 识别漏洞:确认当前版本存在漏洞(可使用POC验证剔除误报)

CVE-2019-9636:Python 信任管理问题漏洞

以Windows Server 2016为例。

假设用户已经安装了Python 3.7.1(漏洞版本),在桌面按着Shift + 鼠标右键,选择在此处打开命令行窗口,在弹出的窗口中输入python,显示当前已安装的漏洞的版本。

接下来验证漏洞是否存在,使用以下文件CVE-2019-9636.poc.py

POC原理是Unicode Character “℆” (U+2106)
这个字符经过urlparse等一系列处理之后会转为c/a,若漏洞存在则会打印输出漏洞存在。

文件内容如下:

from urllib.parse import urlunsplit, urlsplitfrom urllib import parse def run():    x = 8454    uni = chr(x)    url = "http://suctf.c{}".format(uni)    try:        if getUrl(url):            print("str: " + uni + ' unicode: \\u' + str(hex(x))[2:])            print("漏洞存在")        else:            print("漏洞不存在")    except Exception as e:        print(e) def getUrl(url):    url = url    host = parse.urlparse(url).hostname    if host == 'suctf.cc':        return False    parts = list(urlsplit(url))    host = parts[1]    if host == 'suctf.cc':        return False    newhost = []    for h in host.split('.'):        newhost.append(h.encode('idna').decode('utf-8'))    parts[1] = '.'.join(newhost)    finalUrl = urlunsplit(parts).split(' ')[0]    host = parse.urlparse(finalUrl).hostname    if host == 'suctf.cc':        return True    else:        return False  if name == '__main__':    run()
from urllib.parse import urlunsplit, urlsplit
from urllib import parse

def run():
    x = 8454
    uni = chr(x)
    url = "http://suctf.c{}".format(uni)
    try:
        if getUrl(url):
            print("str: " + uni + ' unicode: \\u' + str(hex(x))[2:])
            print("漏洞存在")
        else:
            print("漏洞不存在")
    except Exception as e:
        print(e)

def getUrl(url):
    url = url
    host = parse.urlparse(url).hostname
    if host == 'suctf.cc':
        return False
    parts = list(urlsplit(url))
    host = parts[1]
    if host == 'suctf.cc':
        return False
    newhost = []
    for h in host.split('.'):
        newhost.append(h.encode('idna').decode('utf-8'))
    parts[1] = '.'.join(newhost)
    finalUrl = urlunsplit(parts).split(' ')[0]
    host = parse.urlparse(finalUrl).hostname
    if host == 'suctf.cc':
        return True
    else:
        return False


if name == '__main__':
    run()

在命令行中执行  python CVE-2019-9636.poc.py , 根据回显结果可知当前漏洞存在

CVE-2023-24329:Python urllib.parse 安全特性绕过漏洞

以Windows Server 2016为例。

假设用户已经安装了Python 3.11.3(漏洞版本),在桌面按着Shift + 鼠标右键,选择在此处打开命令行窗口,在弹出的窗口中输入python,显示当前已安装的漏洞的版本。

接下来验证漏洞是否存在,使用以下文件CVE-2023-24329.poc.py。

POC原理是malicious_url是以空白字符为开头的URL,通过urlparse处理,观察解析的结果是否符合预期。

文件内容如下:

from urllib.parse import urlparse # 构造以空白字符开头的 URLmalicious_url = " \thttps://example.com/some/path" # 使用 urlparse 解析 URLparsed_url = urlparse(malicious_url) # 打印解析结果print(f"Scheme: {parsed_url.scheme}")print(f"Network location: {parsed_url.netloc}")print(f"Path: {parsed_url.path}")
from urllib.parse import urlparse

# 构造以空白字符开头的 URL
malicious_url = " \thttps://example.com/some/path"

# 使用 urlparse 解析 URL
parsed_url = urlparse(malicious_url)

# 打印解析结果
print(f"Scheme: {parsed_url.scheme}")
print(f"Network location: {parsed_url.netloc}")
print(f"Path: {parsed_url.path}")

在命令行中执行  python CVE-2023-24329.poc.py , 根据回显结果Scheme为空、Network location为空、Path不符合预期值可知当前漏洞存在。

2. 实施修复:升级版本至3.12.5

①卸载旧版本

Windows操作系统上删除Python

  • 方式1:使用Windows设置:

从开始菜单打开“设置”应用程序或按Win+I。

导航到“应用”,然后到“应用和功能”。

滚动浏览列表或使用搜索栏查找Python。

单击Python,然后选择“卸载”。

  • 方式2:使用控制面板:

打开控制面板。

单击“程序和功能”。如果控制面板处于类别视图中,需要先单击“程序”。

在已安装程序列表中找到Python。

右键单击Python,然后选择“卸载”。

Linux操作系统上删除Python

  • 方式1:使用包管理器卸载:

对于基于Debian的系统(如Ubuntu),可以使用sudo apt-get remove python3.x命令来卸载Python(其中3.x是要卸载的Python版本号)。

对于基于RPM的系统(如CentOS、Fedora),可以使用sudo yum remove python3.x或sudo dnf remove python3.x命令来卸载Python(其中3.x是要卸载的Python版本号)。
方式2:手动卸载:

如果Python是从源码编译安装的,那么需要手动删除安装过程中创建的文件和目录。这通常包括可执行文件的目录(如/usr/local/bin)、库文件的目录(如/usr/local/lib/python3.x)以及其他相关目录。

在删除文件和目录之前,建议先使用whereis python或which python命令来查找Python的安装位置,以确保能够找到并删除所有相关的文件和目录。

验证卸载:

卸载完成后,可以通过运行python –version或python3 –version命令来验证Python是否已经从系统中移除。如果这些命令返回“命令未找到”或类似的消息,则表明Python已被成功卸载。

②安装新版本 3.12.5

Windows操作系统上安装Python

安装Python

确认Windows版本:确认Windows系统是32位还是64位,可以在“我的电脑”或“此电脑”的属性中查看。

访问Python官网:打开浏览器,访问Python官网(
https://www.python.org/downloads
),选择适合自己系统架构的Python稳定版本3.12.5,点击“Download”按钮。

选择“Windows”操作系统对应的链接下载安装包:点击下载按钮,选择“Windows installer(32-bit)”(对于32位系统)或“Windows  installer (64-bit)”(对于64位系统)来下载Python的安装包。

运行安装包:下载完成后,右键以管理员身份运行下载的.exe文件开始安装过程。

自定义安装(可选):在安装向导中,可以选择“自定义安装”来配置安装选项,如添加Python到PATH环境变量中、安装pip(Python的包管理工具)以及选择是否安装IDLE(Python的集成开发环境)等。

安装:完成上述配置后,点击“Install”或“Next”按钮开始安装过程。安装程序会自动完成安装,并在安装过程中显示进度条。

完成安装:安装完成后,点击“Finish”按钮退出安装向导。

验证安装:按下Win+R键,输入cmd并回车,打开命令提示符窗口。输入python,然后回车。如果安装成功,将看到Python的版本号输出到命令行窗口中。

Linux操作系统上安装Python

安装3.12.5版本的Python,可以按照以下步骤进行:

下载Python源码:从Python官网(https://www.python.org/downloads/)下载3.12.5版本的源码压缩包(如tgz格式)。

解压源码压缩包:将下载的源码压缩包解压到指定目录。

tar -zxvf Python-3.12.5.tgz

准备编译环境:安装编译Python所需的依赖包。这可以通过包管理器(如yum、apt等)来完成。例如,对于基于Debian的系统,可以使用sudo apt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev libffi-dev liblzma-dev
命令来安装依赖包。

编译安装Python:进入解压后的Python源码目录,依次执行./configure、make
和sudo make install
命令来编译和安装Python。

建立软连接:为了方便使用,可以为安装的Python版本建立软连接。例如,可以使用sudo ln -s /usr/local/bin/python3.12 /usr/bin/python3
命令来建立Python3的软连接。

打开命令提示符窗口。输入python3,然后回车。如果安装成功,将看到Python的版本号输出到命令行窗口中


1. ## 验证修复:POC验证漏洞已修复

CVE-2019-9636:Python 信任管理问题漏洞

假设成功安装了新版本3.12.5后,在命令行中再次执行  python CVE-2019-9636.poc.py , 根据回显结果可知爆出了错误netloc ‘suctf.c℆’ contains invalid characters under NFKC normalization, 符合预期,证明当前版本到漏洞已经修复。

CVE-2023-24329:Python urllib.parse 安全特性绕过漏洞

假设成功安装了新版本3.12.5后,在命令行中再次执行 python CVE-2023-24329.poc.py , 根据回显结果可知正确处理了带有空格的字符串,解析出来正确的Scheme、Network location、Path, 符合预期,证明当前版本到漏洞已经修复。

关注回复“
9636
”添加运营助手领取PDF版