永远不要在你的 Downloads 下运行 Python!!

学习python的正确姿势

共 2604字,需浏览 6分钟

 · 2023-01-18

本文阅读需要约 4 分钟

7108b9f97615b0cdde6eced2e6272c89.webp 小帅b 

Hi,我是小帅b。

今天给大家分享一个关于使用 Python 时不太会注意到的安全隐患。

Python 的一大好处在于,你可以很容易的开始编写脚本——只需将一些代码怼到一个 .py 文件中,然后运行 python my_file.py。

同样的,模块化也很容易上手:将 myfile.py 拆分成 myapp.py 和 mylib.py,然后你可以从 myapp.py 导入 my_lib,并开始将你的代码组织成模块。

然而,使其起作用的机制细节会有一些令人惊讶的地方,有时甚至是非常关键的安全后果:你从不同的位置执行代码越方便,攻击者执行代码的机会也就越多...

Python 需要一个安全空间来加载代码

以下是关于 Python 安全的三个关键假设:

1,sys.path 里的每个路径都是一个安全的位置,从中执行任意代码是安全的。 

2,"main 脚本" 所在的目录总是在 sys.path 上 

3,直接运行 Python 的时候,当前目录为安全 main 位置,即使运行 Python 时传入 -c 或 -m。

如果你正在运行一个在你电脑已经正确安装了的 Python 程序。那么在你的 Python 或者 virtualenv 之外,唯一会被自动添加到 sys.path 位置的是可执行 main 文件或脚本的位置。

举个例子,如果你的 pip 安装在 /usr/bin 下,然后你运行 pip, 那么只有 /usr/bin 会被添加到 sys.path。在 /usr/bin 是个安全的地方,你可以在这里写入文件让你的系统运行一些东西。

然而,有一个新的惯例是我们更倾向于使用 python -m pip,以避免安装东西带来的错乱问题。

假设你从一个非 PyPI 的第三方网站下载一个 Python 包到 Downloads 文件夹下,由于你习惯使用 python -m pip,所以你会这么去安装:

6823b3e071cc87c0a13bbd1b46228a63.webp

这看起来似乎是一件合理的事,但你不知道的是,两周前你访问了一个带有 XSS Javascript 的网站,在它上面下载了一个带有恶意的 pip.py 到你的 Downloads 文件夹中。

Boom!!!!

这是攻击的演示:

bc88d44c4d7bd4e1de92a83d6da9ccb5.webp

也许你会说,我不把当前目录放到环境变量 $PYTHONPATH 上不就行了?

不见得哦,我们来模拟一个易受攻击的 Python 程序:

首先我们创建两个目录,分别是 installdir 和 attackerdir:

833b6a665175615bb7a02a07ca4b19ed.webp

在 install_dir 下写入 tool.py:

c29b0edd696924ce62dde77397659a19.webp

接着我们进入 attackerdir,把带有恶意脚本放进去,并把名称改为 tool.py 中导入的模块 optionextra:

ab21bc2c50d2fe97d369e20a30e4f763.webp

最后我们来运行一下 tool.py:

6a3003104c15ff7f4448439cd1de1d29.webp

到目前为止,情况都还好。

但这里有一个常见的错误,大多数都推荐像这样添加 PYTHONPATH :

export PYTHONPATH="/new/useful/stuff:$PYTHONPATH";

这样的用法会有缺陷,第一次调用时,如果 $PYTHONPATH 之前是空的或者没有设置,这时就会包含一个空的字符串,这个字符串解析为当前目录,让我们试试:

5eaf3235fdaaa696f7845fef7240c4bc.webp

Oh no!为了安全,可以把 $PYTHONPATH unset 一下:

1b5aecdf95c467552dac678ed85fcd83.webp

设置 PYTHONPATH 是设置 Python 环境的常用操作,不过 virtualenvs 可以更好的满足这一需求。当然如果你习惯使用 PYTHONPATH,可以这样操作:

export PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}newentry1" export PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}newentry2"

结果是这样的:

$ echo "${PYTHONPATH}" newentry1:newentry2

这样就可以保证 $PYTHONPATH 的安全。

最后,如果你仍在使用 $PYTHONPATH, 请确保使用绝对路径。

在任何地方运行 Python ~/Downloads/anything.py,它会将 Downloads 路径添加到 sys.path,使用 Jupyter Notebook 也是一样,运行 jupyter notebook ~/Downloads/anything.ipynb 也会存在安全隐患。

所以在运行下载下来的脚本之前,最好不要在 Downloads 下直接运行。

Downloads 文件路径并不特殊,它只是一个有可能潜入攻击者选择的地方,要注意的是其他地方是否也是如此。

如果你一定要在 Downloads 下运行 Python。

请使用:/path/to/venv/bin/pip。

而不是 /path/to/venv/bin/python -m pip。

最好是避免将 ~/Downloads 作为你当前的工作目录,并在启动前将你的脚本移到更适合的位置。

了解 Python 从哪里获取将要执行的代码是很重要的,给别人执行哪怕一行任意 Python 代码的能力,就等同于你给他们对你电脑的完全控制权。

翻自:

https://glyph.twistedmatrix.com/2020/08/never-run-python-in-your-downloads-folder.html

推荐阅读:

加入 VIP!

别再 pip install!

记得将我的公众号设为✨星标,觉得本文还不错的话就来个三连,谢啦~

我们下回见,peace!

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报