运行'sudo pip'有哪些风险?

116
偶尔我会遇到一些评论或回应,强调在sudo下运行pip是“错误”或“不好的”,但有些情况(包括我设置了一堆工具的方式)需要以这种方式运行。运行pip时与sudo相关的风险是什么?
请注意,这不是与此问题相同的问题,尽管标题相似,但没有提供有关风险的信息。 这也不是一个关于如何避免使用sudo的问题,而是关于为什么要使用它的特定原因。

这回答了你的问题吗?在sudo下运行pip install是否可接受和安全? - Milan
5个回答

119
当您使用sudo运行pip时,您会使用sudo运行setup.py。换句话说,您会以root权限从互联网运行任意Python代码。如果有人在PyPI上发布了恶意项目并且您安装了它,则会为攻击者提供root访问权限。在一些最近的pip和PyPI修复之前,攻击者还可以运行中间人攻击,以在您下载可信赖的项目时注入他们的代码。

3
这个威胁仅适用于pip期间还是适用于安装后的任何后续运行? - orome
4
无论我在使用pip时是否使用sudo,这个说法都是正确的,对吗?一旦安装了它,我们都会面临风险,无论它是如何进入系统的。 - orome
2
@raxacoricofallapatorius 这个问题让我感到有些不舒服,不是因为我没有任何想法(我有一种直觉并且可以给出理由),而是因为众所周知,像这样的看似微小的更改如何影响整体安全性是极其难以预测的。此外,通过在其他地方安装软件包(例如在虚拟环境中),通常可以非常简单地避免不仅 sudo,还有这些权限问题。即使忽略所有安全问题,这样做可能会更好、更可靠。 - user395760
2
根据精确的写入权限和目录布局,我担心更复杂的恶意软件会覆盖其他更可信赖的代码,例如由作为root运行的系统实用程序使用的代码。 - user395760
5
这个答案很奇怪。当你使用sudo来运行某些东西时,你给予它 root 权限;这就是 sudo 的全部意义,并且肯定不是特定于 pip 的。 - user4953825
显示剩余8条评论

27
除了其他答案中提到的明显的安全风险(我认为当您安装自己知道的软件时,这种风险实际上很低)之外,还有另一个原因。随系统附带的Python是该系统的一部分,当您想要管理系统时,您会使用专门用于系统维护的工具,例如在安装/升级/卸载软件的情况下使用软件包管理器。当您开始使用第三方工具(例如此处的pip)修改系统软件时,您无法保证您的系统状态。另一个原因是sudo可能会给您带来问题,否则您将没有机会或者机会非常小。例如,请参见Python中sys.executable和sys.version之间的不匹配 发行版意识到了这个问题,并试图缓解它。例如,Fedora - 使sudo pip安全和Debian - 使用dist-packages而不是site-packages

7
使用这种方式的pip意味着你信任它的程度足以允许它对系统进行任何操作。不仅仅是pip,还有任何它从你不信任的来源下载和执行的代码都可能是恶意的。
而且pip并不需要所有这些权限,只需要对特定文件和目录具有写访问权限即可。如果你不能使用系统的软件包管理器并且不想使用虚拟环境的方法,可以创建一个具有写权限的特定用户来使用pip。这样你就可以更好地控制pip能够做什么,不能做什么。你可以使用sudo -u来实现这一点!

那么我所需要做的就是,例如,允许自己对site-packages拥有写入权限? - orome
1
@raxacoricofallapatorius 不仅如此,一些软件包还会安装辅助脚本(例如 pip 本身、IPython、django、pygments 等),因此您还需要访问它们自己安装的目录。 - MattDMo
是的和不是。我不是安全专家,但我认为如果运行脚本的用户没有写权限会更好。因此,我建议使用单独的用户。 - Cilyan
@MattDMo:是的,那很有道理;但是如果没有适当的权限,这些情况可能很容易被发现。如果真的这样做了,那不是最安全的方式吗?总之,无论如何运行任何东西,我的系统整体上可能遭受的最坏情况都是什么?唯一的区别是我可能会以自己的身份潜在地破坏我的Python安装,而不是必须要su才能这样做,对吧? - orome
我该如何创建这样一个用户,仅用于使用 pip(不需要对系统进行其他更改,例如新的主目录等)?之后,我假设只需将 site-packages 的所有者更改为该用户,是吗? - orome
这取决于你的系统。假设是Linux,你可以执行以下命令:groupadd python; useradd -M pipuser -g python -d /tmp; passwd -l pipuser 然后 chgrp -R python site-packages; chmod -R g+w site-packages 最后 sudo --user pipuser pip install ...。我不了解Mac系统。 - Cilyan

3

有一些其他用户没有提到但仍然很重要的原因。

pip软件包缺乏代码审查

第一个原因是PyPI软件包(可以通过pip安装的软件包)不像其他软件包管理器那样受到监控或代码审查。已经发生了许多恶意PyPI软件包被发布,然后被数千个用户下载,然后才被删除。如果您作为root下载其中一个恶意软件包,那么您实际上是在给恶意软件访问整个系统的权限。虽然这不是每天都会发生的事情,但它仍然是需要注意的攻击向量。您可以通过阅读最小权限概念来了解更多信息。

以root身份运行pip会干扰系统级软件包

第二个,也是更重要的原因是,使用sudo或作为root用户运行pip会干扰系统级别的包,可能会破坏系统的功能。Piotr Dobrogost's answer简要提到了软件包管理器对系统状态的影响,但我认为更深入的解释将有助于人们更好地理解为什么这种做法可能会有害。
以一个Linux发行版为例,该发行版附带Python 3.6和Python软件包来执行加密操作。为了说明问题,想象一下,系统使用版本1.0.0的cryptography软件包来散列密码并允许用户登录。如果同一个软件包的版本1.0.1引入了一个系统没有考虑到的回归,并且您通过运行sudo pip3 install -U cryptography升级全局cryptography软件包,您意外地破坏了用户通过系统依赖项进行登录的能力。
这是一个人为制造的例子,实际上比大多数情况更容易追踪,但它确实是可能发生的情况。在现实世界中,你很可能会破坏一些不太重要的东西,但教训是相同的。在某些情况下,这个例子可能更容易撤销,因为当一切突然停止工作时,你会知道你破坏了什么,但你可能会破坏一些更难追踪的东西,直到很久以后才发现,而那时你已经没有记忆了。

为什么要使用sudo运行pip

我没有看到任何人回答您帖子中的最后一个问题,因此我会在这里回答。有一些原因会让某些人想要使用sudo运行pip,但这种情况非常罕见。

人们之所以想用这种方式运行pip的第一个原因是因为懒惰,这是一种快速强制系统安装所需软件包的方法。假设有人需要安装coloredlogs软件包,因为他们绝对必须立即将其日志变成彩色,并且他们不知道如何保持系统安全。对于缺乏经验的用户来说,通常更容易在每个命令前加上sudo,因为“它就能工作”,而不是学习为什么第一次没有成功。

第二个原因,也是唯一一个我能想到的合理原因,是如果管理员需要对整个系统进行补丁修复。比如说,在 pip 版本 20.0.0 中引入了一个漏洞,而在版本 20.0.1 中有一个热修复程序可以解决这个问题。系统管理员可能不想等发行版为他们打补丁,而是想立即修复它以缓解问题。在这种情况下,我认为系统管理员使用 "python3 -m pip install --upgrade pip" 更新他们的 pip 版本是安全的,但他们需要小心确保没有意外后果。

2

sudo唯一的问题是它以超级用户(root)身份执行命令,这意味着你可能会因为错误的命令而破坏安装程序。而由于PIP是特定程序的包维护工具,你需要这样的访问权限来进行更改...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接