推荐星级:
- 1
- 2
- 3
- 4
- 5
Python常见安全漏洞及修复方法
资料介绍
编写安全的代码很困难,当学习一门编程语言、一个模块或框架时,会学习其使用方法。在考虑安全性时,需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例。然而,许多Python开发人员却根本不知道这些。以下总结10个Python常见安全漏洞,排名不分先后。1.输入注入注入攻击影响广泛且很常见,注入有很多种类,它们影响所有的语言、框架和环境。SQL注入是直接编写SQL查询(而非使用ORM)时将字符串与变量混合。我读过很多代码,其中“引号字符转义”
部分文件列表
文件名 | 大小 |
Python常见安全漏洞及修复方法.pdf | 1M |
部分页面预览
(完整内容请下载后查看)计 算 机 与 网 络
防 火 墙
Python 常见安全漏洞及修复方法
■ 姜
唐
编写安全的代码很困难,当学习一门编程语言、一 个 模
块 或 框 架 时 ,会 学习其使用方法。在 考虑安全性时,需要考虑
如何避免代码被滥用,Python 也不例外,即使在标准库中,也
存在着许多糟糕的实例。然而,许多 Python 开发人员却根本
不知道这些。
其中一种攻击为“billion laughs”,因为加载的文件包含了
很多个(数十亿)“lols”。你可以加载 XML 实体文件,当 XML
解析器试图将这个 XML 文件加载到内存中时,会消耗很多
个
G
的内存。
另一种攻击使用外部实体扩展。 XML 支持从外部 URL
引用实体,XML 解析器通常会直接获取并加载该资源。“攻
击者可以绕开防火墙访问保密资源,因为所有请求都是由内
部可信的 IP 地址创建的,请求不是来自于外部。”
需要考虑的另一种情况是要依赖于第三方软件包来解
码
XML,例如配置文件,远程 API。有 时 甚至不知道自己的某
个依赖包已经暴露在攻击之下。
那么在 Python 中会发生什么?标准库模块 etree
xmlrpc 都容易遭受这些类型的攻击。
,DOM,
以下总结 10
1. 输入注入
个 Python 常见安全漏洞,排名不分先后。
修复方法
:
注入攻击影响广泛且很常见,注入有很多种类,它们影
响所有的语言、框架和环境。
直接用 defusedxml 替换标准库模块。它增加了针对这类
攻击的安全防护。
SQL 注入是直接编写 SQL 查询 (而 非使用 ORM)时将
字符串与变量混合。我读过很多代码,其中“引号字符转义”
被认为是一种修复,但事实并非如此,可以通过 SQL 注入所
有可能发生的方式。
3. Assert 语句
不要使用 assert 语句来防止用户访问特定代码段。例如:
命令注入有可能在使用 popen,subprocess,os.system 调
默认情况下,Python
以 _debug _ 为 true 来执行脚本,但
用一个进程并从变量中获取参数时发生,当调用本地命令
时,有 人 可 能 会将某些值设置为恶意值。
下面是个简单的脚本,使用用户提供的文件名调用子进
程:
在实际环境中,通常使用优化运行,这 将会跳过 assert 语句并
直接转到安全代码,而不管用户是否是 is_admin
修复方法:
。
仅在单元测试中使用 assert 语句。
4. 计时攻击
攻击者会将 filename 的值设置为“; cat /etc/passwd | mail
或者其他同样危险的值。
修复方法:
计时攻击本质上是一种通过计算比较提供值所需时间
来暴露行为和算法的方式。计时攻击需要精确性,所以通常
不能用于高延迟的远程网络。由于大多数 Web 应用程序涉
如果使用了 Web 框架,可以用附带的实用程序对输入进
行清理,除非有充分的理由,否则不要手动构建 SQL 查询, 及可变延迟,因此几乎不可能针对 HTTP Web 服务器编写计
大多数 ORM 都有内置的清理方法。
时攻击。
但是,如果应用程序有提示输入密码的命令行,攻击者
对于 shell,可以使用 shlex 模块正确地转义输入。
2. 解析 XML
就可以编写一个简单的脚本来计算将其值与实际密码进行
比较所需的时间。
如果应用程序加载并解析 XML 文件,可能你正在使用
一个 XML 标准库模块。有 一 些 针 对 XML 的常见攻击。大 多
数 为 DoS 风格(旨在破坏系统而不是盗取数据)。这些攻击很
常见,特别是在解析外部(即不可信任的)XML 文件时。
修复方法:
使用在 Python 3.5 中引入的 secrets.compare_digest 来比
较密码和其他私密值。
52
计 算 机 与 网 络
防 火 墙
5. 感染 site-packages 或导入路径
方 法 返 回 一 个 字 符串、或一个元组。攻击者可以使用它来引
用其中一个子进程模块,在 主 机上运行任意命令。
Python 的导入系统非常灵活。当为测试程序编写猴子补
丁,或 者 重 载 核 心 函 数时,会感觉非常方便。
这有一个在 Python2
子。更多利用 pickle 漏洞的方法请看这个。
修复方法
切勿用 pickle 反序列化不受信任或未经身份验证的数
据。改用另一种序列化模式,如 JSON
中 pickle 一个类并打开 shell 的例
但这也是 Python 最大的安全漏洞之一。
将第三方包安装到 site-packages 中,无论是在虚拟环境
中还是在全局 site-packages 中,你都将暴露在安全风险中。
有一些发布到 PyPi 的包与流行的包具有相似的名称,但
是却执行了任意代码。幸运的是,这 很 可 能 没 有 太 大 危害,只
会“明确表示”这个问题没有得到真正的解决。
需要考虑的另一种情况是多层依赖包。它们可能包含漏
洞,它们也可以通过导入系统重写 Python 默认行为。
:
。
修复方法
:
9. 使用系统自带的 Python 而不修补漏洞
可以利用 PyUp.io 这个网站提供的工具检查第三方包。
使用虚拟环境,确保全局 site-packages 尽可能干净,同时检查
包签名。
大多数可移植操作系统都自带 Python2,通常还是旧版
本。由于“Python”,即 CPython 是用
C 语言编写的,所以
Python 解释器本身存在漏洞。 语言中常见的安全问题与内
C
6. 临时文件
存分配有关,所以存在缓冲区溢出错误。
要在 Python 中创建临时文件,通常会使用 mktemp()函
数生成一个文件名,然后使用该名称创建一个文件。“这是不
安全的,因为另一个进程可能会在调用 mktemp()和随后尝
试通过第一个进程创建文件之间的空隙创建一个同名文
件。”这意味着应用程序可能加载错误的数据或暴露其他的临
时数据。
多年来 CPython 出现了多个溢出漏洞,每个漏洞都在后
续版本中进行了修复。也就是说,如果你修补了 Python 本身
的漏洞,你就是安全的。
修复方法
:
安装最新版本的 Python 并及时修补漏洞。
10. 不修补依赖包的漏洞
如果调用不正确,最新版本的 Python 会发出运行警告。
修复方法:
类似于修补 Python 本身的漏洞,还需要定期修补依赖包
漏洞。有人习惯于使用 PyPi 软件包的“固定”版本,这 种 做 法
很 可 怕 。 他们认为“这些是有用的版本”,所以每个人都对漏
洞置若罔闻。
如果需要生成临时文件,请使用 tempfile 模块并使用
mkstemp
。
7. 使用 yaml.load
上面提到的所有漏洞如果存在于你使用的包中,它们同
样很致命,所以这些软件包的开发人员无时无刻地在解决安
全问题。
引用 PyYAML 的说明文档:
警告:使用不可信源的数据调用 yaml.load 是不安全的!
yaml.load
和
pickle.load 一样强大,所以可以调用任何 Python
修复方法:
函数。
使用类似于 PyUP.io 这个网站提供的服务去检查更新,
向应用程序发送 pull/merge 请求,运行测试,让软件包保持更
新。使用 InSpec 这样的工具来验证真实环境中的安装版本,
并确保修补了最小版本或多个连续版本的漏洞。
在流行的 Python 项目 Ansible 中找到一个例子,可以将
此值提供给 Ansible Vault 作为有效的 YAML,它使用文件中
提供的参数调用 os.system
。
所以,从用户提供的值中加载 YAML 文件会让应用大门
洞开,很容易遭受攻击。
修复方法:
总是使用 yaml.safe_load,除非有其他更好的方法。
8. Pickle 漏洞
用
pickle 反序列化数据和 YAML 一样糟糕。在 pickle
对
象时,Python 类可以声明一个名为 _reduce_ 的魔术方法,该
53
全部评论(0)