Python 3.5.4 安全修复解析:ftplib.FTP.putline() 拒绝含 CR/LF 的命令(bpo-30119)

发布时间:2026/9/11 14:27:12

Python 3.5.4 安全修复解析:ftplib.FTP.putline() 拒绝含 CR/LF 的命令(bpo-30119) Python 3.5.4 安全修复解析ftplib.FTP.putline() 拒绝含 CR/LF 的命令bpo-30119【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython本篇技术指南以 CPython 仓库中 Misc/NEWS.d/3.5.4.rst 记录的一条安全修复为切入点深入讲解ftplib.FTP.putline()对包含 CR\r或 LF\n的命令抛出ValueError的改动包括其背后的 FTP 命令注入防护原理、源码实现细节、完整调用链、测试覆盖以及如何在当前仓库中验证该行为。读完本文你将能准确理解这条 NEWS 条目的技术实质并掌握从 NEWS 片段回溯到源码与测试的阅读方法。一、NEWS 条目本身一条标准的安全修复记录Misc/NEWS.d/是 CPython 维护变更记录changelog的分片目录每个片段文件对应一条独立变更最终由工具合并进Misc/HISTORY等发布说明。3.5.4.rst全文如下.. bpo: 30119 .. date: 2017-07-26-15-11-17 .. nonce: DZ6C_S .. release date: 2017-08-07 .. section: Library ftplib.FTP.putline() now throws ValueError on commands that contains CR or LF. Patch by Donghee Na.这些.. 字段:形式是 reStructuredText 注释指令构成 NEWS 条目的元数据bpo: 30119—— 关联的 Python bug 跟踪编号当时托管于 bugs.python.org后续版本改用 GitHub issue 编号30119 即本次安全改动的原始问题单date / nonce—— 提交补丁的本地时间戳与随机唯一标识用于合并去重release date: 2017-08-07—— 该条目随 Python 3.5.4 正式发布的时间section: Library—— 变更所属类别此处为标准库ftplib属于标准库模块其他常见取值还有 Core and Builtins、Security、Tests 等正文则用一句话描述行为变更并署名补丁作者 Donghee Na。值得注意的是同期相邻的 Misc/NEWS.d/3.5.5.rst 明确写着 “There were no new changes in version 3.5.5.”说明 bpo-30119 是 3.5.x 系列该阶段最重要的修复之一。二、为什么需要这个修复CRLF 注入与 FTP 命令伪造FTP 是行文本协议客户端与服务器之间的每条命令如USER、PASS、RETR、STOR都以 CRLF\r\n结尾作为分隔符服务器按行解析。这带来一个经典安全隐患——CRLF 注入 / 命令拼接攻击若调用方在命令字符串中混入\r或\nftplib拼接行尾 CRLF 后发送攻击者即可通过换行伪造出多条服务器命令例如在一条参数中注入\r\nCWD /etc\r\n之类的额外指令这类注入可用于探测服务器行为、绕过访问控制甚至配合 FTP Bounce 攻击用 FTP 服务器作为跳板扫描内网端口实施更深层的攻击。在 bpo-30119 修复之前putline()对命令内容不做任何换行校验修复之后任何包含\r或\n的命令都会在发送前被拒绝。当前仓库中Lib/ftplib.py的实现正是这一修复的最终形态见下文源码分析。三、修复实现的源码级解析putline() 的防御逻辑当前仓库 Lib/ftplib.py 中putline()的实现如下# Internal: send one line to the server, appending CRLF def putline(self, line): if \r in line or \n in line: raise ValueError(an illegal newline character should not be contained) sys.audit(ftplib.sendcmd, self, line) line line CRLF if self.debugging 1: print(*put*, self.sanitize(line)) self.sock.sendall(line.encode(self.encoding))逐行解读入口校验防御核心先用if \r in line or \n in line检查待发送字符串一旦发现任一换行字符立即抛出ValueError错误信息为an illegal newline character should not be contained。由于该检查位于方法最顶部任何途径进入putline()的命令都会被拦截审计钩子sys.audit(ftplib.sendcmd, self, line)触发 CPython 审计事件允许上层应用通过sys.addaudithook()记录或拦截 FTP 命令发送行为该钩子为后续版本新增与 bpo-30119 同属安全加固方向协议行尾拼接line line CRLF其中CRLF \r\n定义在 Lib/ftplib.py对应字节版本B_CRLF b\r\n供数据通道使用调试输出与发送调试级别大于 1 时打印脱敏后的命令sanitize()会把pass/PASS开头的密码替换为星号见 Lib/ftplib.py最后self.sock.sendall(line.encode(self.encoding))编码后发送。四、调用链哪些操作会触发新校验putline()是ftplib.FTP发送所有命令的唯一出口通过putcmd()中转FTP.sendcmd() / FTP.voidcmd() / FTP.voidresp 相关路径 │ ▼ FTP.putcmd(line) # 可选调试打印见 Lib/ftplib.py#L205-L207 │ ▼ FTP.putline(line) # ★ 新增 ValueError 校验见 Lib/ftplib.py#L195-L202 │ ▼ sock.sendall(line CRLF)因此本次修复实际覆盖了ftplib的全部命令面包括但不限于sendcmd(cmd)Lib/ftplib.py——发送任意命令并读取响应是login()、voidcmd()等的基础voidcmd(cmd)Lib/ftplib.py——期望 2xx 响应的命令发送login(user, passwd, acct)Lib/ftplib.py——内部通过sendcmd(USER user)、sendcmd(PASS passwd)发送认证命令因此注入到用户名或密码中的换行同样会被拦截数据传输命令retrbinary、retrlines、storbinaryLib/ftplib.py 起等它们最终都经由ntransfercmd()Lib/ftplib.py把RETR/STOR/LIST等命令送入putcmd()→putline()主动/被动模式命令sendport()、sendeprt()Lib/ftplib.py同样经由voidcmd()走同一路径。从源码结构看这一设计保证了只要绕过校验就会在字节真正写入 socket 之前被阻断属于“发送前校验”而非“发送后检查”杜绝了任何通过既有 API 构造畸形命令的可能性。五、测试验证仓库如何守护该行为CPython 为本次修复配套了回归测试位于 Lib/test/test_ftplib.py 的test_exceptionsdef test_exceptions(self): self.assertRaises(ValueError, self.client.sendcmd, echo 40\r\n0) self.assertRaises(ValueError, self.client.sendcmd, echo 40\n0) self.assertRaises(ValueError, self.client.sendcmd, echo 40\r0) self.assertRaises(ftplib.error_temp, self.client.sendcmd, echo 400) ...测试用三种注入形态覆盖了完整换行组合\r\nCRLF、单独的\nLF与单独的\rCR全部断言抛出ValueError同段测试还验证了正常但返回 4xx/5xx 响应的命令仍按协议抛出ftplib.error_temp/error_perm等业务异常确保新校验不影响原有错误语义。该测试基于FtpServer/FtpClient模拟服务器框架test_ftplib.py顶部定义不依赖真实 FTP 服务即可运行。六、动手验证在当前仓库复现与运行测试仓库源码与测试可直接验证该行为仓库只读仅用于查看与运行1. 运行回归测试需要已构建的解释器或使用系统 Python 指向仓库路径cd /data/web/disk1/git_repo/GitHub_Trending/cp/cpython ./python -m test test_ftplib -v # 使用仓库内构建的解释器 # 或仅运行单个用例 ./python -m unittest Lib.test.test_ftplib.FTPTest.test_exceptions2. 直接复现异常不连接任何服务器即可触发因为校验发生在网络 I/O 之前 from ftplib import FTP ftp FTP() # 未连接也可测试 putline ftp.putline(USER admin\r\n) Traceback (most recent call last): ... ValueError: an illegal newline character should not be contained ftp.putline(USER admin) # 合法命令通过校验进入发送流程3. 结合源码阅读对照 Lib/ftplib.py 与 Lib/test/test_ftplib.py可以确认校验逻辑与测试断言完全一致。七、版本与影响范围小结修复内容ftplib.FTP.putline()对包含\r或\n的命令抛出ValueError从源头阻断 FTP 命令注入发布版本Python 3.5.4release date 2017-08-07补丁作者 Donghee Na当前主分支与后续所有版本均继承该行为适用前提本文示例基于当前仓库源码Lib/ftplib.py共 975 行审计钩子sys.audit(ftplib.sendcmd, ...)为后续新增特性3.5.4 原始补丁仅包含换行校验部分对开发者而言若你的代码依赖ftplib发送拼接命令务必在调用前自行剔除或转义换行字符否则在 3.5.4 及以后的版本中会直接收到ValueError——这正是本次修复希望强制的正确用法。这条 NEWS 片段虽短却完整展示了 CPython 处理安全问题的标准流程问题登记bpo-30119→ 最小化修复putline入口校验→ 回归测试test_exceptions→ 发布说明NEWS 条目。沿着 Misc/NEWS.d/3.5.4.rst → Lib/ftplib.py → Lib/test/test_ftplib.py 这条链路即可复现 CPython 维护者对该问题的完整思考与落地。【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/11 14:27:12

如何把 LoRA 权重合并进基础模型:swift 模型合并完整指南

如何把 LoRA 权重合并进基础模型:swift 模型合并完整指南 【免费下载链接】swift Use PEFT or Full-parameter to CPT/SFT/DPO/GRPO 600 LLMs (Qwen3.6, DeepSeek-V4, GLM-5.1, InternLM3, Llama4, ...) and 300 MLLMs (Qwen3-VL, Qwen3-Omni, InternVL3.5, Ovis2.5…

2026/9/11 15:22:22

小尺寸二维码打印识别率优化方案与实践

1. 项目背景与挑战去年接手公司仓储管理系统升级时,我们遇到了一个看似简单却异常棘手的问题——小尺寸二维码的打印识别率。系统需要在不干胶标签上打印5mm5mm的二维码,用于标识微小零件。初期采用基于Canvas的qrcode.js方案,在屏幕上显示完…

2026/9/11 15:22:22

在线教育大数据分析:Django+Spark+爬虫+Vue实战指南

简介:这是一套基于Django的线上教育平台大数据分析毕设项目,以Python 3.8为基础,整合Spark、爬虫与Vue,面向毕业设计、课程设计、大作业或工程实训场景,既适合入门小白,也适合需要完整工程参考的进阶学习者…

2026/9/11 15:17:21

0.3 TOPS如何重塑端侧AI芯片设计范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码