有时我必须使用一些我不信任的专有软件,甚至是预编译的开源软件,我不知道它们是否已编译为它们的源代码。
假设我们在/opt/software中安装了一个专有应用程序,然后我们以普通用户身份运行它(没有 sudo、gksudo 等)。
- 我知道当我们运行一个程序时,它能够连接到 Internet、监控 X、击键、收集用户数据等等。
- 它不能改变系统中任何重要的东西或感染系统,(因为Linux权限系统)。
- 程序可以向用户的浏览器添加一些插件/扩展(因为浏览器配置文件在用户主目录中可用)。
- 关闭程序并重新启动后,它不能再做任何事情了。错了,因为:
- 程序可以将自己添加到执行自动启动过程的外壳/文件/目录中,因此它将在任何登录时运行。
- 如果我们认为自动启动过程干净,则无需重新启动程序的进程仍有可能处于活动状态。
- 程序可以删除或修改用户主目录中的任何文件(或用户具有写入权限的任何其他文件)。
那么我们应该怎么做呢?
- 我认为运行专有程序的唯一安全方法是以另一个用户身份运行它。
- 如果无法以某种方式以其他用户身份运行程序,那么我们应该更改自动启动文件权限,以便只有 root 可以更改它们。然后在关闭程序后重新启动将完成这项工作。
我对吗?有什么我想念的吗?
作为新用户运行不受信任的软件是一个好的开始,但这可能还不够。
您可能认为敏感的许多文件和设备都是全球可读的。即使作为非特权用户,您也可以从系统中提取大量信息(通常您可以先阅读
/etc
)。您可能没有正确配置自己的东西。例如,您是否绝对确定这个“super-secret-passwords.txt”文件不是每个人都可以阅读的?那么这个以你自己或 root 身份运行的有缺陷的旧软件呢?你确定它没有写任何对磁盘敏感的东西吗?
运行的代码
nobody
可以在 Internet 上运行并下载任务,在您的系统上执行代码。有时,用于进程间通信的本地系统上的套接字(unix 域套接字)可能无法正确保护(有时是有充分理由的),并且任何进程都可以对其进行读写。
实际上,您可以做一些事情。
您绝对可以检查程序在启动时没有启动任何东西。这会很乏味,但您需要非常了解您的系统。有很多方法可以自动启动服务。(注意:如果该程序曾经以 root 身份运行,那么所有的赌注都将被取消,因为它可能已经修改了 init 系统以隐藏自己)
运行糟糕软件的重要提示
如果您可以完全避免它,请不要运行任何您无法信任的东西。至少要确保你做出了合理的权衡。复杂性是安全的敌人。唯一可以保证安全的代码行是您从未运行过的代码行。:)
设置虚拟机非常简单(如果您不想设置任何虚拟化基础架构,VirtualBox 非常棒)。这意味着您将拥有一台不包含敏感数据的机器(您需要将它放在那里),并且您可以控制它使用的资源。当然,这并不能为您提供完整的保护(它可能会做一些事情,例如用请求淹没您的 Web 服务器,通过 telnet 登录到您的灯泡等等,而且让恶意软件逃离虚拟机的错误并不常见,但有时确实会发生)。
容器(LXD、Docker)为在本地机器上运行代码提供了一些安全性。它们并不完美。但是一个非特权容器为你的程序提供了文件系统隔离,这很重要。正确保护容器是一门艺术和一门科学,但它正变得越来越容易。
这与您的问题略有相关,但您有时可以通过使用第三方服务来避免运行旧的、糟糕的软件或复杂且难以正确保护的软件。电子邮件就是一个很好的例子。我不相信自己有耐心和空闲时间来托管和维护自己的电子邮件服务器。保证这样的事情安全需要做很多工作。
作为最后的手段,如果您觉得值得权衡,请使用专门为此目的创建的新用户帐户运行该程序。我使用我信任的软件来做到这一点。
选项 1 是最好的。:)
一般建议