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