Python 中的 10 个常见安全漏洞,以及如何避免(下)
简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你需要考虑如何避免被滥用,Python
也不例外,即使在标准库中,也存在用于编写应用的不良实践。然而,许多 Python 开发人员却根本不知道它们。
接上篇
- 解析 XML(Parsing XML)
如果你的应用程序要加载、解析 XML 文件,则你可能正在使用 XML 标准库模块。通过 XML 的攻击大多是 DoS 风格(旨在使系统崩溃而不是泄露数据),这些攻击十分常见,特别是在解析外部(即不可信任的)XML 文件时。
其中有个「billion laughs」,因为他的 payload 通常包含很多(十亿)「lols」。基本上,这个原理是可以在 XML 中使用参照实体,所以当解析器将这个 XML 文件加载到内存中时,它会消耗数 G 大小的内存(RAM)。
试试看,如果你不相信我的话 :-)
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>
&lol9;
另一些攻击使用外部实体扩展。XML 支持从外部 URL 引用实体,XML解析器通常会毫无疑问地获取并加载该资源。「攻击者可以规避防火墙并访问受限制的资源,因为所有请求都是由内部可信的 IP 地址创建的,而不是来自外部。」
需要考虑的另一种情况是依赖的第三方软件包需要解码 XML ,例如配置文件、远程 API。你甚至可能不知道某个依赖关系会将这些类型的攻击置之不理。
修复:
使用 defusedxml 替换标准库模块,它增加了针对这些类型攻击的安全防护。
- 受污染的 site-packages 或 import 路径
Python 的 import 系统非常灵活,当你想要为测试写猴子补丁或重载核心功能时,这是非常棒的。
但这却是 Python 中最大的安全漏洞之一。
安装第三方软件包,无论是在虚拟环境中还是全局(通常不鼓励)都会让你看到这些软件包中的安全漏洞。有一些发布到 PyPi 的软件包与流行的软件包具有相似的名称,但是却执行了任意代码。
需要考虑的另一种情况是依赖的依赖,他们可能包含漏洞,他们也可以通过导入系统覆盖Python 中的默认行为。
修复:
看看 http://PyUp.io 及其安全服务,为所有应用程序使用虚拟环境,并确保全局的 site-packages 尽可能干净,检查包签名。
- 序列化 Pickles
反序列化 pickle 数据和 YAML 一样糟糕。Python 类可以声明一个 reduce 方法,该方法返回一个字符串,或一个可调用的元组以及使用 pickle 序列化时调用的参数。攻击者可以使用它来包含对其中一个子进程模块的引用,以在主机上运行任意命令。
修复:
切勿使用 pickle 反序列化不受信任或未经身份验证来源的数据。改用另一种序列化模式(如JSON)。
- 使用系统 Python 运行时并且不修复它
大多数 POSIX 系统都自带有一个 Python 2 版本(通常是旧版本)。
有时候 Python(即 CPython 是用 C 语言编写的) 解释器本身存在漏洞, C 中的常见安全问题与内存分配有关,所以大多是缓冲区溢出错误,CPython 多年来一直存在一些溢出漏洞,每个漏洞都在后续版本中进行了修复。也就是说,如果及时升级 python 运行时,就很安全。
修复:
为生产应用程序安装最新版本的 Python,并及时安装修复更新!
- 不修复依赖关系
类似于不修补 python 运行时,还需要定期修补依赖关系。
在 PyPi 的软件包中「钉住」 Python 软件包版本的做法是很糟糕的,目的是「这些是能正常工作的版本」,所以每个人都不升级它。
上面提到的代码中的所有漏洞在第三方包中存在时同样重要,这些软件包的开发人员每时每刻都在修复安全问题。
修复:
使用像 PyUp.io 这样的服务来检查更新,向应用程序提出 pr,并运行测试以保持软件包是最新的。
原文:10 common security gotchas in Python and how to avoid them
Python 中的 10 个常见安全漏洞,以及如何避免(下)的更多相关文章
- Python 中的 10 个常见安全漏洞,以及如何避免(上)
简评:编写安全代码很困难,当你学习一个编程语言.模块或框架时,你会学习其使用方法. 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践.然而 ...
- 简单谈谈Python中的几种常见的数据类型
简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python中list列表的常见操作
Python的list是一个列表,用方括号包围,不同元素间用逗号分隔. 列表的数据项不需要具有相同的类型.(列表还可以嵌套,即列表中的列表) 每个元素都有一个索引(表示位置),从0开始:可以用索引-1 ...
- 19.python中os模块的常见用法
常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows,它是'nt', 而对于Linux/Unix用户,它是'posix'. os. ...
- Python中实用却不常见的小技巧
https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247489061&idx=2&sn=65cec7fa471b1e ...
- Python 中的 os 模块常见方法?
os.remove() 删除文件 os.rename() 重命名文件 os.walk() 生成目录树下的所有文件名 os.chdir() 改变目录 os.mkdir/makedirs 创建目录/多层目 ...
- 一文了解Python中的循环(for while break continue 嵌套循环...)
循环 目标 程序的三大流程 while 循环基本使用 break 和 continue while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 —— 从上向下,顺序执行 ...
- python中的循环以及,continue和break的使用
循环 目标 程序的三大流程 while 循环基本使用 break 和 continue while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 —— 从上向下,顺序执行 ...
随机推荐
- spark属性
应用属性 属性名 缺省值 意义 spark.app.name (none) The name of your application. This will appear in the UI and i ...
- UIImage分类,设置边框
#import "UIImage+image.h" @implementation UIImage (image) + (UIImage *)imageWithBorder:(CG ...
- IDEA05 mybatis插件之MyBatisCodeHelper-Pro
前提准备: >IDEA专业版本 1 安装MyBatisCodeHelper-Pro IDEA提供了插件安装功能,可以根据开发需要安装适合的插件 >help -> find actio ...
- C++细节理解
1.为什么static类外初始化不需要static关键字 答:因为类外static变量或函数表示限定在此源文件中才能使用,而类中的static变量或函数表示由本类及其所有对象共享,如果在类外初始化或定 ...
- [模板]割点(tarjan)
洛谷P3388 注意:记得tarjan的打法 注意割点的判断条件:子节点个数>2并且为根节点 当它不为根节点时并且low[to]>dfn[u] 判断时是在子节点未被记录的时候 #incl ...
- PHP发红包程序限制红包的大小
我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...
- QT学习之多线程
[为什么要用多线程?] 传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作.如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应.这个问题可以 ...
- C# 静态类的使用
静态类与非静态类基本相同,但存在一个区别:静态类不能实例化.也就是说,不能使用 new 关键字创建静态类类型的变量.因为没有实例变量,所以要使用类名本身访问静态类的成员. static class C ...
- SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo
使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...
- 理解Javascript的Prototype
在Javascript中创建对象主要分为三种方式 1. var catA = {name: "Fluffy", color: "White", age: 0}; ...