带你认识Python中黑客喜欢攻击的10个安全漏洞以及应对方法

前言
编写安全代码是一件很难的事情 。Python也不例外,即使在标准库中,也有记录在案的编写应用程序的安全漏洞 。下面是Python应用程序中最常见的10个安全陷阱以及相关解决办法 。

带你认识Python中黑客喜欢攻击的10个安全漏洞以及应对方法

文章插图
 
 
Input injectionInjection攻击非常普遍,有很多种类型的注入 。它们影响所有的语言、框架和环境 。
SQL injection是指直接编写SQL查询,而不是使用ORM并将字符串和变量混合 。我读过很多代码,其中“转义引号”被认为是一种修复方法 。然而它不是 。
命令injection是指任何时候你使用popen,子进程,os来调用一个进程 。系统从变量中获取参数 。当调用本地命令时,可能会有人将这些值设置为恶意的值 。
 
如何修复:
如果您正在使用web框架,那么可以使用web框架附带的实用工具来清理输入 。除非您有很好的理由,否则不要手工构造SQL查询 。
 
对于shell,使用shlex模块正确地转义输入 。
 
解析XML 
如果您的应用程序曾经加载并解析过XML文件,那么您很可能正在使用XML标准库模块之一 。通过XML有一些常见的攻击 。大部分是Dos风格的(用来崩溃系统而不是过滤数据) 。这些攻击很常见,尤其是在解析外部(即不受信任的)XML文件时 。
其中一个被称为“十亿个laugh”,因为有效载荷通常包含大量(数十亿)“lols” 。基本上,这个想法是您可以在XML中执行引用实体,因此当您的低调的XML解析器试图将这个XML文件加载到内存中时,它将消耗千兆字节的RAM 。如果你不相信,那就试试吧:-)
另一种攻击使用外部实体扩展 。XML支持从外部url引用实体,XML解析器通常会毫无顾虑地获取和加载该资源 。“攻击者可以绕过防火墙,访问受限制的资源,因为所有的请求都是由内部可靠的IP地址发出的,而不是来自外部 。”
另一种需要考虑的情况是依赖于解码XML的第三方包,比如配置文件和远程api 。您甚至可能没有意识到,您的某个依赖项可能会受到这些类型的攻击 。
 
解决办法:
使用defusedxml作为标准库模块的替代 。它增加了针对这类攻击的安全防护 。
 
Assert statements 
不要使用断言语句来防止用户不应该访问的代码段 。
举个简单的例子:
def foo(request, user):assert user.is_admin, “user does not have access”# secure code...在默认情况下,Python执行时使用的是_debug__作为true,但是在生产环境中,通常使用优化来运行 。这将跳过assert语句,直接进入安全代码,而不管用户是否为is_admin 。
 
解决办法:
仅使用assert语句与其他开发人员通信,如在单元测试中或在防止不正确的API使用中 。
 
计时攻击 
计时攻击本质上是一种通过计时比较所提供的值所花费的时间来暴露行为和算法的方法 。定时攻击需要精确性,所以它们通常不能在高延迟的远程网络上工作 。由于大多数web应用程序的延迟都是可变的,所以几乎不可能编写HTTP web服务器上的定时攻击 。
但是,如果您有一个命令行应用程序提示输入密码,那么攻击者可以编写一个简单的脚本来计算将它们的值与实际的密码进行比较所需的时间 。有一些令人印象深刻的例子,例如基于ssh的定时攻击是用Python编写的 。
解决办法:
使用在Python 3.5中引入的secret .compare_digest来比较密码和其他私有值 。
 
被污染的站点—包或导入路径Python的导入系统非常灵活 。当您试图为您的测试编写monkey-patch或重载核心功能时,这是非常棒的 。
但是,这是Python中最大的安全漏洞之一 。
在您的站点包中安装第三方包,无论是在虚拟环境中还是在全局站点包中(通常不建议这样做),都会暴露这些包中的安全漏洞 。
曾经出现过这样的情况:发布到PyPi的包的名称与流行的包类似,但执行的是任意代码 。幸运的是,并没有造成伤害 。
另一种需要考虑的情况是依赖项的依赖项(等等) 。它们可以包含漏洞,还可以通过导入系统覆盖Python中的默认行为 。
【带你认识Python中黑客喜欢攻击的10个安全漏洞以及应对方法】 
解决办法:
审查你的包 。看看PyUp 。io和他们的安全服务 。为所有应用程序使用虚拟环境,并确保全局站点包尽可能干净 。检查包签名 。
 
临时文件要在Python中创建临时文件,通常需要使用mktemp()函数生成一个文件名,然后使用该名称创建一个文件 。这是不安全的,因为在调用mktemp()和第一个进程随后尝试创建该文件之间的时间内,另一个进程可能会创建一个具有该名称的文件 。这意味着它可能欺骗您的应用程序加载错误的数据或暴露其他临时数据 。


推荐阅读