FEATURED · 精选文章

Python 3.6.5rc1 变更全解析:安全修复、核心虚拟机改进与跨平台兼容性补丁

发布时间 / 2026/9/10 15:23:11
来源 / 创域科博编辑部
栏目 / 资讯中心
Python 3.6.5rc1 变更全解析:安全修复、核心虚拟机改进与跨平台兼容性补丁 Python 3.6.5rc1 变更全解析安全修复、核心虚拟机改进与跨平台兼容性补丁【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpythonPython 3.6.5rc1 是 CPython 3.6 分支的最后一个候选发布版本release candidate正式版 3.6.5 紧随其后于 2018-03-13 发布本篇文章以当前 CPython 仓库中记录的 3.6.5rc1 变更日志 为骨架逐条梳理其安全公告、解释器核心行为修正、标准库缺陷修复以及 Windows / macOS / IDLE 等平台与工具链的改进并结合仓库源码如 ast_preprocess.c、sysmodule.c、difflib.py、poplib.py给出实现层面的佐证。读完本文你将能系统理解 3.6.5rc1 修复了哪些高危问题、这些修复背后涉及哪些解释器与标准库机制以及它们在后续 CPython 版本中的沉淀方式。版本背景rc 阶段的意义3.6.5rc1 处于 3.6 稳定分支的维护期变更日志的 entry 全部带有标准的 NEWS 元信息bpobug tracker 编号、date提交日期、nonce防重复标识、section分类。分类共 11 个Security、Core and Builtins、Library、Documentation、Tests、Build、Windows、macOS、IDLE、Tools/Demos、C API。这种按模块归类的 changelog 结构正是 CPython 发布流程中feature freeze 后只修 bug 不引入新特性的体现——rc 阶段的所有改动都是为了打磨稳定性与安全性。安全修复两个直接影响线上服务的漏洞本节对应日志中的Security分类是 3.6.5rc1 最值得关注的改动。os.symlink 在 Windows 上的缓冲区越界bpo-33001Minimal fix to prevent buffer overrun in os.symlink on Windows修复目标是 Windows 平台os.symlink()的缓冲区越界buffer overrun问题。os.symlink在 Windows 上通过CreateSymbolicLinkW等 Win32 API 与 NTFS 重解析点reparse point交互其参数目标路径、链接路径需要先转换为宽字符一旦长度计算或缓冲分配与实际写入的字节数不一致就会产生越界写。日志特意强调这是 Minimal fix——即在维护分支上采取最小侵入式修补避免改动 API 语义符合 rc 阶段风险最小化的修复策略。该缺陷的相关路径处理逻辑在仓库中对应 Modules/posixmodule.c 中的os.symlink实现及其 Windows 分支。difflib 与 poplib 的正则灾难性回溯bpo-32981CVE-2018-1060 / CVE-2018-1061Regexes in difflib and poplib were vulnerable to catastrophic backtracking. These regexes formed potential DOS vectors (REDOS). They have been refactored. This resolves :cve:2018-1060 and :cve:2018-1061.这是本版本最重要的安全修复difflib和poplib中的正则表达式存在**灾难性回溯catastrophic backtracking**漏洞可被构造的恶意输入触发指数级匹配耗时构成拒绝服务ReDoS攻击向量对应 CVE-2018-1060 与 CVE-2018-1061补丁由 Jamie Davis 提供。从当前仓库源码仍可看到这两处正则的形态Lib/difflib.py 中用于行差异标记的change_re re.compile(r(\|\-|\^))——若不加控制地让交替分支与贪婪量词嵌套在用户可控的长输入上就可能触发回溯爆炸重构目标正是消除这类易受攻击的组合。Lib/poplib.py 中用于解析服务器响应的timestamp re.compile(br\OK.[^]*(.*))[^]*与.*的组合在特定输入下同样存在回溯风险。这两类正则的共同教训是解析外部输入的re.compile必须避免量词嵌套交替的高危形态必要时改用非贪婪、原子分组或手写状态机。该修复同时被收录为正式安全公告属于 3.6.5 用户应当优先升级的理由。Core and Builtins解释器核心行为的修正本节改动涉及帧调试、字节码折叠、哈希随机化与内存安全等解释器底层是理解 CPython 运行时演进的重要窗口。调试器与 trace 事件的跳转限制bpo-33026、bpo-17288Fixed jumping out of with block by setting f_lineno. Prevent jumps from return and exception trace events.两个修复都与f_lineno帧对象当前行号和 trace 事件相关bpo-33026此前通过设置f_lineno可以从with块中跳出去绕过上下文管理器的__exit__协议造成资源未释放或状态不一致修复后禁止这类非法跳转。bpo-17288sys.settrace的return与exception事件不允许再作为跳转目标防止调试器在事件回调中篡改执行流。这两点共同收紧了通过帧行号篡改控制流的边界保证了with语句的语义完整性。相关行为在 Include/frameobject.h 与 Objects/frameobject.c 的f_lineno设置逻辑中体现。__debug__常量在编译期被折叠bpo-27169附带修复 bpo-22091The __debug__ constant is now optimized out at compile time.这是本版本解释器优化的标志性改动__debug__现在在编译期AST 折叠阶段就被替换为常量而不是在运行时解析为内建名字。其实现逻辑可在当前仓库的 Python/ast_preprocess.c 中找到case Name_kind: if (state-syntax_check_only) { break; } if (node_-v.Name.ctx Load _PyUnicode_EqualToASCIIString(node_-v.Name.id, __debug__)) { LEAVE_RECURSIVE(); return make_const(node_, PyBool_FromLong(!state-optimize), ctx_); } break;含义当 AST 折叠器遇到Load上下文中的__debug__名字时直接根据optimize级别即-O/-OO是否开启生成布尔常量True/False。这带来的连锁收益是形如if __debug__: ...的调试代码可以在编译期被常量传播与死代码消除处理-O模式下相关分支直接消失同时把__debug__当作普通变量赋值或删除会继续在 Python/symtable.c 抛出SyntaxError: cannot assign to __debug__语义约束保持一致。sys.flags.hash_randomization在PYTHONHASHSEED0时正确归零bpo-32329sys.flags.hash_randomization is now properly set to 0 when hash randomization is turned off by PYTHONHASHSEED0.哈希随机化hash randomization是 Python 抵御哈希碰撞型 DoS 攻击的机制。此前当用户显式设置PYTHONHASHSEED0关闭随机化时sys.flags.hash_randomization仍错误地保持为 13.6.5rc1 将其修正为 0使运行时状态与命令行/环境变量一致。sys.flags的结构体字段定义在 Python/sysmodule.c其中hash_randomization对应命令行开关-R该字段由解释器启动时的哈希种子配置Python/initconfig.c 的PYTHONHASHSEED解析驱动。frozenset 哈希改进bpo-26163Improved frozenset() hash to create more distinct hash values when faced with datasets containing many similar values.改进frozenset()的哈希算法在元素值高度相似的数据集上产生更分散的哈希值降低哈希碰撞概率。这属于集合哈希质量的优化实现在 Objects/setobject.c 的frozenset_hash相关逻辑中。dict 嵌套过深时的安全 reprbpo-18533、bpo-32137repr() on a dict containing its own values() or items() no longer raises RecursionError; OrderedDict similarly. Instead, use ..., as for other recursive structures. The repr of deeply nested dict now raises a RecursionError instead of crashing due to a stack overflow.两处修复共同处理了repr(dict)的递归安全bpo-18533当 dict 包含自身的values()或items()视图时repr()不再误报RecursionError而是像其他递归结构一样输出...OrderedDict同步修复。bpo-32137真正无限深嵌套的 dict其repr()抛出受控的RecursionError而非因 C 栈溢出直接崩溃。两者结合repr在自引用与真递归之间有了正确区分实现在 Objects/dictobject.c 的 dict repr 与递归守卫逻辑中。常量折叠的资源上限保护bpo-30416The optimizer is now protected from spending much time doing complex calculations and consuming much memory for creating large constants in constant folding.折叠优化器新增资源保护对复杂计算与超大常量的折叠进行限制防止编译器在编译期被恶意构造的表达式拖垮时间与内存双重维度。这正是 Python/ast_preprocess.c 中astfold_expr系列函数的职责边界——折叠只做廉价、确定的变换。其他 Core 修复一览bpo内容摘要影响面bpo-32889更新 Valgrind 抑制列表适配Py_ADDRESS_IN_RANG更名为address_in_range内存检查工具兼容bpo-32650bdb.py系调试器含 pdb的next命令可正确步过原生协程native coroutine补丁由 Pablo Galindo 提供异步调试体验bpo-32685改进 Python 2 形式print语句的迁移提示当它与复合语句头同行或以分号结尾时给出更准确的建议补丁由 Nitish Chandra 提供2to3 迁移辅助bpo-32583修复使用自定义解码错误处理器时内建 Unicode 解码器可能发生的越界写导致崩溃内存安全bpo-32028生成 Py2print→ Py3print()转换建议时正确忽略前导空白补丁由 Sanyam Khurana 提供迁移提示Library标准库的广度修补Library 分类是本次变更数量最多的部分覆盖 asyncio、ssl、csv、subprocess、ctypes、tarfile 等高频模块。以下按主题分组呈现。asyncio锁、条件变量与传输层可靠性bpo内容摘要意义bpo-32841修复asyncio.Condition在 notify 后取消条件锁时静默忽略取消的问题补丁由 Bar Harel 提供条件变量与取消协作的正确性bpo-32734修复asyncio.Lock()的安全问题锁未释放时可被重复 acquire 多次补丁由 Bar Harel 提供互斥语义的严格化bpo-33037SSL 传输关闭后跳过收发数据避免关闭后读写引发的异常与内存问题bpo-26133解释器关闭时不再对 asyncio UNIX 事件循环执行信号反订阅规避 shutdown 阶段的竞态ssl / socket协议能力探测与连接选项bpo内容摘要意义bpo-30622ssl 模块检测 LibreSSL 缺少 NPN 支持的情况多 SSL 实现兼容bpo-32185OpenSSL 1.0.2 或支持 inet_pton 的平台不再在 SNI TLS 扩展中发送 IP 地址隐私与协议合规bpo-32394Windows 旧版本在运行时移除TCP_FASTOPEN、TCP_KEEPCNT标志跨版本 Windows 兼容bpo-27456确保 Linux 上设置TCP_NODELAY网络延迟优化文件、编码与路径处理bpo内容摘要意义bpo-32922dbm.open()使用文件系统编码filesystem encoding而非默认编码编码文件名非 ASCII 文件名正确性bpo-32228truncate()在写入超过缓冲区大小的数据后保持tell()报告的文件位置IO 语义一致性bpo-31802未导入os时也可直接导入原生路径模块posixpath、ntpath消除隐式导入依赖bpo-31900locale.localeconv与{:n}.format()在LC_NUMERIC与LC_CTYPE不一致时临时切换 locale 解码decimal_point/thousands_sep注意该临时切换影响其他线程数字格式化 locale 正确性bpo-32555FreeBSD/Solaris 上os.strerror()始终以当前 locale 编码解码字节串错误信息可读性CSV 行为的两处收紧bpo-30157、bpo-32255bpo-30157修复csv.Sniffer.sniff()在只有最后一个字段被引号包裹时对引号与分隔符的猜测错误补丁由 Jake Davis 提供。bpo-32255单个空字段现在总是被引号包裹写入为从而可以区分空行与仅含一个空字段的行补丁由 Licht Takeuchi 提供。这一行为变更直接影响了 CSV 的读写一致性相关实现在 Modules/_csv.c 与 Lib/csv.py 中。子进程、多进程与进程生命周期bpo内容摘要意义bpo-32777修复 POSIX 上 subprocess 在 exec 前标记子进程文件描述符可继承时罕见的死锁该 bug 自 3.4 引入高并发 fork/exec 可靠性bpo-31804标准流已关闭或为 None 时multiprocessing.Process退出不再失败守护进程优雅退出网络协议模块email、smtplib、urllibbpo内容摘要意义bpo-32727SMTP 信封发件地址不再包含 name 字段补丁由 Stéphane Wirtel 提供邮件协议合规bpo-27931用户名为空引号字符串时email 地址头解析错误被修复补丁由 Xiang Zhang 提供邮件头健壮性bpo-32323urllib.parse.urlsplit不再将带 scope 的 IPv6 主机名中的 zone-id 转为小写URL 解析准确性ctypes / 扩展模块链接bpo内容摘要意义bpo-30353修复 64 位 Cygwin/MinGW 上 ctypes 结构体按值传递问题跨平台 ABIbpo-32647ctypes 从依赖 dlopen 的间接链接改为在有 dl 的平台显式链接 libdl链接可靠性其余 Library 修复速查bpo内容摘要bpo-33064lib2to3 支持函数签名中*args/**kwargs后的尾随逗号bpo-33009修复单参数partialmethod的inspect.signature()bpo-32969暴露 zlib 中缺失的多个常量并修正对应文档bpo-32713修复tarfile.itn对越界浮点值的处理补丁由 Joffrey Fuhrer 提供bpo-32859os.dup2不再每次调用都探测dup3系统调用是否存在bpo-21060重写 setup.py upload 的误导性报错改为 Must create and upload files in one commandbpo-32857tkinter的after_cancel(None)现在抛出ValueError而非取消第一个已调度函数补丁由 Cheryl Sabella 提供bpo-32852运行 trace 时确保sys.argv保持为 listbpo-31787修复多个模块__init__()方法的反射泄漏refleak由 Oren Milman 贡献bpo-32304distutils 的 upload 命令不再破坏以 CR 字节结尾的 tar 文件也不再在上传文本字段中做 CR→CRLF 转换bpo-32502uuid.uuid1遇到 64 位硬件地址时不再抛异常bpo-31848修复Aifc_read.initfp()在找不到 SSND chunk 时的错误处理补丁由 Zackery Spytz 提供bpo-32521两条nis 模块适配新 libnsl 与头文件位置glibc 移除 Sun RPC 后改用 libtirpc 头文件与库bpo-32473提升ABCMeta._dump_registry()输出的可读性bpo-32277平台不支持chmod(..., follow_symlinksFalse)时抛出NotImplementedError而非SystemError补丁由 Anthony Sottile 提供bpo-32199getnode()的 IP getter 改用ip link而非ip link listDocumentation、Tests 与 Build质量基线的加固Documentationbpo-17232、bpo-32800、bpo-8722、bpo-32614、bpo-31972、bpo-17799bpo-17232澄清-O与-OO的文档说明补丁由 Terry Reedy 提供。结合 Python/initconfig.c 中-O的说明remove assert anddebug-dependent statements可见文档与实现相互印证。bpo-32800更新 XML 默认命名空间相关 w3c 文档链接。bpo-8722文档化 property 的get方法抛出AttributeError时__getattr__的行为。bpo-32614将文档中的正则示例改为 raw string 以消除DeprecationWarning并在正则 HOWTO 中补充相关弃用说明。bpo-31972改进pathlib.PurePath子类的 docstring。bpo-17799解释sys.settrace/sys.setprofile及其 C API 对应物各自接收哪些事件类型补丁由 Pablo Galindo Salgado 提供。Testsbpo-32517、bpo-32721、bpo-32252、bpo-31518bpo-32517修复 macOS 10.12.2 上因KqueueSelector循环的 transport 未关闭导致的test_asyncio失败。bpo-32721修复test_hashlib在_md5模块未编译时不失败。bpo-32252修复faulthandler_suppress_crash_report()用于阻止测试崩溃时产生 core dump 文件getrlimit()成功时返回 0 需按此判断。bpo-31518Debian Unstable 已禁用 SSLv23_METHOD 的 TLS 1.0/1.1相关测试改用PROTOCOL_TLS或PROTOCOL_TLSv1_2以在 Debian 上通过。Buildbpo-32635修复系统提供 libxcrypt 而非 libcrypt 时 crypt 模块的段错误。这反映了 glibc 生态中 crypt 库拆分libxcrypt 独立成库对构建系统的影响相关适配可在仓库的 configure.ac 与 crypt 模块构建逻辑中追溯。Windows平台专项修复bpo内容摘要bpo-33016修复nt._getfinalpathname可能使用未初始化内存bpo-32903修复 Windows 上当前目录为 UNC 路径时os.chdir()的内存泄漏bpo-31966修复WindowsConsoleIO.write()写入空数据bpo-32409确保activate.bat能处理 Unicode 内容bpo-32457改进启动 Python 时对非规范化可执行路径的处理bpo-32370uuid 模块使用正确编码解析 ipconfig 输出补丁由 Segev Finer 提供bpo-29248修复os.readlink重解析数据缓冲区的PrintNameOffset字段此前被误当作字符数而非字节数补丁由 Craig Holmquist 和 SSE4 提供bpo-32588创建独立的_distutils_findvs模块这些修复集中在 NT 内核对象、重解析点、控制台 IO 与虚拟环境脚本编码四个方面反映了 Windows 平台 Python 长期维护的典型战场。macOS新安装器变体与三方库升级bpo-32726Provide an additional, more modern macOS installer variant that supports macOS 10.9 systems in 64-bit mode only. Upgrade the supplied third-party libraries to OpenSSL 1.0.2n, XZ 5.2.3, and SQLite 3.22.0. The 10.9 installer now links with and supplies its own copy of Tcl/Tk 8.6.8.3.6.5rc1 为 macOS 引入一个仅支持 64 位、面向 macOS 10.9 的更新安装器变体并同步升级自带三方库OpenSSL 1.0.2n、XZ 5.2.3、SQLite 3.22.0该安装器自带 Tcl/Tk 8.6.8 副本。这缓解了旧 macOS 版本上系统 Tcl/Tk 缺失或过旧导致 tkinter 不可用的问题。相关打包脚本可在 Mac/BuildScript 中查看。IDLE启动文件语义与 pyparse 清理bpo-32984IDLE 运行启动文件时设置__file__。与 Python 一致IDLE 在首个交互提示符前可运行一个启动文件-s运行IDLESTARTUP或PYTHONSTARTUP环境变量指定的文件-r file运行指定文件现在非-n模式下运行时IDLE 也会像 Python 一样在运行前设置__file__并在首个提示符前取消它。pyparse 模块系列清理bpo-32940 简化并重命名StringTranslatePseudoMapping、bpo-32916 将str改为code、bpo-32905 删除未用代码、bpo-32874 为 pyparse 添加测试。bpo-32837IDLE 的系统无关、位置无关文件不再使用随系统变化的默认编码打开。bpo-32826为 IDLE 的test_help_about中的open()添加encodingutf-8GUI 测试test_file_buttons()只检查初始 ASCII 行但在open()默认ascii的系统上readline()提前读入并解码到 CREDITS.txt 中的非 ASCII 字符导致失败。bpo-32765更新 configdialog General 选项卡 docstring加入新增控件。Tools/Demos 与 C APITools/Demosbpo-24960、bpo-32222bpo-249602to3 与 lib2to3 改用pkgutil.get_data()读取 pickle 语法文件而非探测文件系统使其可从 zipfile 中直接运行。bpo-32222修复 pygettext 无法提取带类型注解参数的函数 docstring补丁由 Toby Harradine 提供。C APIbpo-29084Undocumented C API for OrderedDict has been excluded from the limited C API. It was added by mistake and actually never worked in the limited C API.OrderedDict的未文档化 C API 被移出受限 C APIlimited C API——它当初是误加的且在受限 C API 中从未真正可用。这是 CPython 维护稳定 ABI如stable_abi.toml所定义的受限 API 边界过程中的一次纠偏避免 API 消费者误用从未生效的接口。结语从 3.6.5rc1 读 CPython 的维护哲学纵观 3.6.5rc1 变更日志可以提炼出 CPython 维护分支的几条准则安全优先两个安全公告CVE-2018-1060 / CVE-2018-1061和 Windows 缓冲区越界修复排在首位且采用最小侵入式补丁语义严格化__debug__编译期折叠、asyncio 锁的可重入修复、f_lineno跳转限制都在收紧此前宽松但危险的行为跨平台兜底Windows 重解析点、macOS 安装器、Cygwin/MinGW 的 ctypes ABI、glibc 的 libxcrypt/libnsl 迁移说明平台生态变化会被持续跟踪并修复变更可追溯每条记录都带有 bpo 编号与 contributor 署名为后续版本的回溯、测试与文档沉淀提供了完整线索。对于仍运行 3.6 分支的维护者这份 changelog 既是升级 3.6.5 的决策依据也是排查某行为为何改变时的第一手索引。【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻