What are the risks of running 'sudo pip'?

Occasionally I run into comments or responses that state emphatically that running pip under sudo is "wrong" or "bad", but there are cases (including the way I have a bunch of tools set up) where it is either much simpler, or even necessary to run it that way.

What are the risks associated with running pip under sudo?


Note that this is not the same question as this one, which, despite the title, provides no information about risks. This also isn't a question about how to avoid using sudo, but about specifically why one would want to.

57551 次浏览

The only thing "wrong" with sudo is that it, well, DOes as Super User ala root meaning you can potentially destroy an installation with the wrong command. As PIP is a package maintenance for a particular program you would need such access anyhow to make changes...

sudo运行 pip时,用 sudo运行 setup.py。换句话说,您以 root 用户身份从 Internet 运行任意的 Python 代码。如果有人在 PyPI 上放置了一个恶意项目,并且您安装了它,那么您就向攻击者提供了对您的机器的 root 访问权限。在最近对 pip和 PyPI 进行一些修复之前,攻击者还可以在下载可信任的项目时运行中间攻击的 man 来注入他们的代码。

这样使用 pip 意味着您对它的信任程度达到了允许它对您的系统进行任何操作的程度。不仅是 pip,还包括它将下载并执行的任何代码,这些代码可能来自您不信任的源,而且可能是恶意的。

而且 pip 不需要所有这些特权,只需要对特定文件和目录的写访问权。如果您不能使用系统的包管理器,并且不想使用虚拟环境方式,您可以创建一个具有 python 安装目录写权限的特定用户,并将其用于 pip。这样你就能控制 Pip 能做什么,不能做什么。你可以使用 sudo -u

除了在其他答案中提到的明显的安全风险(我认为当你安装你知道的软件时,实际上安全风险很低)之外,还有另一个原因。Python 是这个系统的一部分,当你想要管理这个系统的时候,你可以使用专门用于系统维护的工具,比如在安装/升级/卸载软件的时候使用软件包管理器。当您开始使用第三方工具(本例中为 pip)修改系统软件时,您无法保证系统的状态。还有一个原因是 sudo可以给你带来问题,否则你不会有机会或有一个非常小的机会。参见例子 Mismatch between sys.executable and sys.version in Python

发行版已经意识到这个问题,并尝试减轻它。例如 Fedora-确保 sudo pip 的安全和 Debian-Dist 软件包代替站点软件包

There are a few reasons that haven't been mentioned by other users but are still important.

pip包之间缺乏代码审查

第一个原因是 PyPI 包(可以通过 pip安装的包)没有像其他包管理器那样进行监视或代码审查。有许多案例的 恶意 PyPI 包正在发表,然后下载之前被删除的数以千计的用户。如果您碰巧以 root 用户身份下载了这些恶意软件包中的一个,那么您实际上就是在让恶意软件访问您的整个系统。虽然这不是每天都会发生,但它仍然是一个需要注意的攻击载体。你可以通过阅读 最少特权的概念来了解更多。

Running pip as root interferes with system-level packages

第二个也是更重要的原因是,使用 sudo运行 pip或作为根用户运行 pip会干扰系统级包,并可能破坏系统的功能。Piotr Dobrogost 的回答简要地提到了包管理器对系统状态的影响,但是我认为更深入的解释将帮助人们更好地理解为什么这种做法是有害的。

例如,一个 Linux 发行版附带了 Python 3.6和 Python 包 cryptography来执行加密操作。为了说明起见,假设系统使用 cryptography软件包版本1.0.0来散列密码并允许用户登录。如果同一个软件包的版本1.0.1引入了系统没有考虑到的回归,并且您通过运行 sudo pip3 install -U cryptography来升级全局 cryptography软件包,那么您就意外地破坏了用户在系统范围内登录的能力,因为您引入了系统依赖性回归。

这是一个人为的例子,实际上要比大多数情况下更容易追踪,但它肯定是一个可能的场景。在现实世界中,你很可能会弄坏一些不那么重要的东西,但教训是一样的。在某些情况下,这个例子会更容易撤销,因为当所有东西立即停止工作时,你会知道你究竟破坏了什么,但是你可能最终破坏了一些更难追踪的东西,你可能直到很久以后才发现,当你不记得你改变了什么。


Why would you want to run pip with sudo?

我还没有看到任何人在你的帖子中提出最后一个问题,所以我在这里解决它。有几个原因可以解释为什么有人想用 sudo运行 pip,但是这些原因要少得多。

人们愿意这样做的第一个原因是因为人们懒惰,这是一种强制系统安装所需软件包的快速方法。假设有人需要安装 coloredlogs软件包,因为他们的日志必须马上着色,而他们对安全系统一无所知。对于没有经验的用户来说,当 sudo不起作用时,往往更容易把它添加到所有事情的开头,因为“它只是起作用了”,而不是学习 为什么,因为它在第一次就不起作用了。

第二个原因,也是我能想到的唯一合理的原因,是管理员需要在系统范围内修补某些内容。假设在 pip版本20.0.0中引入了一个漏洞,并且在 20.0.1版本中有一个修复程序修复了这个问题。系统管理员可能不想等发行版为他们修补这个问题,而是想现在就修补以减轻问题。在这种情况下,我认为系统管理员使用 python3 -m pip install --upgrade pip来更新他们的版本是安全的,但是他们需要谨慎以确保没有意外后果。