返回

关于Python的5个安全未知陷阱

发布时间:2022-04-19 16:05:08 345
# python# 网络安全

由于使用标准库和通用框架,Python开发人员相信他们的应用程序具有可靠的安全状态。但是,在Python中,与任何其他编程语言一样,某些功能可能会被开发人员误导或滥用。通常,只有很小的细微之处或细节才能让开发人员忽略并给代码库添加一个严重的安全漏洞。

在这篇文章中,我们分享了在实际Python项目中遇到的10个安全陷阱。我们选择了我们认为在开发者社区中鲜为人知的陷阱。通过解释每个问题及其影响,我们希望提高认识并加强您的安全意识。如果您正在使用这些功能中的任何一个,请务必检查您的Python代码!

1.优化断言

Python提供了以优化方式执行代码的能力。这使得代码运行得更快,占用的内存更少。当应用程序被大规模使用或者可用资源很少时,这种方法特别有效。一些预打包的Python应用程序提供了优化的字节码。然而,当代码被优化时,所有维护语句被忽略。这些有时被开发人员用来评估代码中的某些条件。如果一个维护被用作身份验证检查的一部分,这可能会导致绕过安全检查。

view.py

1    def superuser_action(request, user):
2        assert user.is_super_user
3        # execute action as super user

在本例中,第2行中的assert语句将被忽略,每个非超级用户都可以访问下一行代码。不建议使用assert语句进行与安全相关的检查,但我们在实际应用程序中确实可以看到它们。

2.MakeDirs权限

该函数用于操作系统。makedirs在文件系统中创建一个或多个文件夹。其第二个参数模式用于指定所创建文件夹的默认权限。在下面代码段的第2行中,文件夹A/B/C是使用rwx-----(0o700)权限创建的。这意味着只有当前用户(所有者)具有这些文件夹的读、写和执行权限。

view.py

1    def init_directories(request):
2        os.makedirs("A/B/C", mode=0o700)
3        return HttpResponse("Done!")

在Python<3.6中,文件夹A、B和C的创建权限都是700。但是,在Python>3.6中,只有最后一个文件夹C具有700权限,其他文件夹A和B使用默认权限755创建。因此,在Python>3.6的情况下,函数os。makedirs与Linux命令具有相同的属性:mkdir-m 700-p A/B/C。一些开发人员不知道两个版本之间的差异,它已经导致Django(CVE-2020-24583)中的权限升级漏洞,并以非常类似的方式导致WordPress中的强化旁路。

3.绝对路径连接

操作系统。路径join(路径,*路径)函数用于将多个文件路径组件连接到一个组合文件路径中。第一个参数通常包含基本路径,而每个进一步的参数作为一个组件附加到基本路径。然而,该函数有一个一些开发人员不知道的特性。如果其中一个附加组件以/开头,则所有以前的组件(包括basepath)都将被删除,并且该组件将被视为绝对路径。下面的示例显示了开发人员可能遇到的这个陷阱。

view.py

1    def read_file(request):
2        filename = request.POST['filename']
3        file_path = os.path.join("var", "lib", filename)
4        if file_path.find(".") != -1:
5            return HttpResponse("Failed!")
6        with open(file_path) as f:
7        return HttpResponse(f.read(), content_type='text/plain')

在第3行中,结果路径是使用操作系统从用户控制的输入文件名构建的。路径连接函数。在第4行中,将检查生成的路径,以查看它是否包含。防止路径遍历漏洞。但是,如果攻击者传递文件名参数/a/b/c.txt,则第3行中生成的变量file_path是绝对文件路径。包括基本路径在内的var/lib组件现在被操作系统忽略。路径加入,攻击者无需使用单个文件即可读取任何文件。性格尽管操作系统中描述了这种行为。路径join documentation过去它导致了许多漏洞(布谷鸟沙箱规避,CVE-2020-35736)。

4.任意临时文件

临时文件。NamedTemporaryFile函数用于创建具有特定名称的临时文件。然而,前缀和后缀参数容易受到路径遍历攻击(问题35278)。如果攻击者控制其中一个参数,他可以在文件系统中的任意位置创建临时文件。下面的示例显示了开发人员可能遇到的一个陷阱。

view.py

1    def touch_tmp_file(request):
2        id = request.GET['id']
3        tmp_file = tempfile.NamedTemporaryFile(prefix=id)
4        return HttpResponse(f"tmp file: {tmp_file} created!", content_type='text/plain')

在第3行中,用户输入id用作临时文件的前缀。如果攻击者通过有效负载//var/www/test作为id参数,将创建以下tmp文件:/var/www/test_ZDLJ17。乍一看,这听起来可能无害,但它为攻击者利用更复杂的漏洞提供了基础。

5.加长拉链

提取上传的文件存档是web应用程序中的一个常见功能。在Python中,函数是文件。取出所有的文件。extract很容易受到拉链滑动攻击。此时,攻击者会篡改存档文件中的文件名,使其包含路径遍历(../)字符。这就是为什么归档条目总是被认为是不可信的来源。拉链。提拔和拉链。提取函数清理zip条目,从而防止此类路径遍历漏洞。但是,这并不意味着ZipFile库中不会出现路径遍历漏洞。下面的示例显示了提取zip文件的代码。

view.py

4    def extract_html(request):
5        filename = request.FILES['filename']
6        zf = zipfile.ZipFile(filename.temporary_file_path(), "r")
7        for entry in zf.namelist():
8            if entry.endswith(".html"):
9                file_content = zf.read(entry)
10              with open(entry, "wb") as fp:
11                  fp.write(file_content)
12      zf.close()
13      return HttpResponse("HTML files extracted!")

在第6行中,从上传的用户文件的临时路径创建ZipFile处理程序。在第7-11行中,所有zip条目都以结尾。提取html。函数zf。第7行中的名称列表包含zip文件中的条目名称。请注意,只有zipfile。提取和zipfile。extractall函数清理条目,而不是任何其他函数。在这种情况下,攻击者可以创建文件名,例如..//var/www/html,包含任意内容。恶意文件的内容在第9行读取,并在第10-11行写入攻击者的受控路径。因此,攻击者可以在服务器上创建整个HTML文件。

如上所述,存档中的条目应被视为不可信。如果你不使用zipfile。提取器zipfile。提取您应该始终清理zip条目的名称,例如使用操作系统。路径基本名称。否则,它可能会导致严重的安全漏洞,如NLTK Downloader(CVE-2019-14751)中发现的漏洞。

以上介绍了5个Python安全陷阱,我们认为这些陷阱在开发人员中鲜为人知。每个细微的缺陷都很容易被忽略,并且在过去已经导致了现实世界应用程序中的安全漏洞。

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
活跃攻击下的关键Magento 0天漏洞 2022-04-19 15:41:06