互联网上的自定义套接字服务器以 root 身份运行

信息安全 Web应用程序 开发 网络服务器 权限
2021-09-04 10:59:08

我们正在编写一个在高端口上运行的自定义套接字服务器。直到最近,它一直在企业防火墙后面运行。现在,已决定将服务器置于防火墙之外,并为互联网流量提供服务。今天写的,服务器直接mmap/dev/mem,需要root。

这感觉像是一个可怕的责任。

在不了解具体漏洞的情况下,除了用“最佳实践”、“最小特权原则”、“以 root 执行任意代码”或简单地说“这太疯狂了”之外,很难对这一决定提出令人信服的论据。”

我如何说服管理层我们需要以非 root 用户身份运行服务器,即使这意味着重大的代码更改和计划延迟?

4个回答

代码“以root身份运行”几乎是无关紧要的。根或非根是一种仅对机器本地有意义的区别,并且仅当您想要包含一些潜在的恶意代码(例如被劫持的服务器代码)而不关闭整个机器时才有意义。这是几十年前的大型机模型。那时,人们相信你可以拥有一个 Unix(或类 Unix)系统,这样非 root 进程就可以彼此分开,而没有任何可能逃避该遏制并到达同一台机器上的其他进程。

这种信念在今天几乎不成立。本地特权升级很多;在保持功能齐全的环境的同时将它们全部插入是非常困难的。一般来说,假设在任何用户下运行在机器上的任何恶意代码都能够控制整个系统是更安全的,除非应用了一些更强大的遏制措施,例如(随着复杂性和遏制水平的提高) chroot监狱虚拟机在任何情况下,调用 mmap() 的进程/dev/mem都可以完全控制本地机器(如果你走 VM 路,可能是虚拟机)。

所有这一切的结论是,如果你的机器被黑了,并且让它面向互联网肯定会增加这种可能性,那么你应该问问自己,如果它被敌对的外人颠覆会发生什么。将代码更改为不以 root 身份运行并且不以 mmap 身份运行/dev/mem并不会显着改变这里的情况。重要的是代码是否经过精心设计、审查、测试、记录和维护。

我必须说,直接mmap()开启/dev/mem发出了“这些家伙不应该被允许靠近键盘”的强烈信号。我不知道你为什么在你的服务器(*)中这样做,但这看起来很奇怪。在地址空间中映射物理 RAM 不是安全问题,除非您坚持使用过时的大型机模型;然而,做非常时髦的事情一个安全问题,因为它使设计、审查、测试、文档和维护变得更加困难。

(*) 我最好的猜测是,您的服务器与缺少特定内核驱动程序的自定义硬件进行交互,并通过在物理地址空间中映射其电路来执行 I/O,例如显卡。实际编写适当的内核驱动程序会更干净,因此也更安全。

坦率地说,相关的词是“以 root 身份运行并公开给公众的自定义代码”。

为了证明编码工作和延迟的合理性,您必须对被利用的代码的影响以及恶意行为者获得对其运行的服务器的 root 访问权限进行一些快速计算。如果违规的成本超过编码工作和调度延迟的成本,那么您有一个明确的指标可以提交给业务,他们可以就他们愿意承担的风险做出决定。

要考虑的一个重要因素是恶意行为者直接从您的自定义代码获得 root 访问权限的可能性,而不是获得对代码可能运行的非 root 用户的访问权限。您还需要考虑从非 root 用户升级到 root 的可能性。如果获得对非 root 用户的访问权与获得 root 访问权具有相同的影响,或者如果从非 root 用户升级到 root 是微不足道的,那么这两个用户之间没有区别。

与企业交谈可能非常困难,因为他们的观点与技术观点截然不同,他们必须平衡更多的问题而不仅仅是技术。找到一种共同语言,比如金钱,往往有助于提供一个共同点。

您可以尝试演示在经过良好测试的服务器中发生的服务器问题,并声称“如果在所有测试和检查之后它们是不安全的,我们怎么能期望做得更好?”

第一个出现在我脑海中的例子是Shellshock 错误来自 Apache Web 服务器的 CGI 结合使用时,它允许远程执行。这不是由于 Apache 中的错误,但 Apache 仍然容易受到攻击。如果您遵循最佳实践并以非特权用户身份运行 Apache,那么这只是一个严重的漏洞。如果您以 root 身份运行 Apache,这是一个致命的漏洞,会严重危害您的服务器以及与之连接的任何设备的安全。

PS:我同意说“这太疯狂了”。应该绰绰有余:)

提供可行的替代解决方案非常重要,而不仅仅是依赖于认为它是一个糟糕的技术解决方案的论点。例如,与重新开发代码以使用非特权用户相比,使用 VPN 设置是否是更好的选择?你能概括一下解决方案吗?例如,VPN 解决方案是否也会在其他领域提供更多和更安全的功能。不要只是争论这是一个坏主意,而是争论一个更好的主意,它可以为他们提供他们想要的解决方案。为此,您需要了解他们真正想要的是什么——不是他们要求什么,而是底层驱动程序是什么。通常你会发现他们要求的是错误的东西,但是他们想要的功能是必要的。了解这一点将使您能够确定他们会满意的更好的解决方案。

您需要做的另一件事是将业务成本/风险优先于技术成本/风险。您也可以包括基于技术的风险/成本,但不要专注于它们。一旦你开始谈论特权升级、CVE、数据加密、防火墙、端口等,你就会失去业务经理的兴趣。相反,谈论诸如失去销售/生产力、声誉受损、商业秘密或专有信息被盗、客户信心下降、政府和其他合规性等问题。本质上,用管理层可以理解的术语——商业术语来表达你的观点。

如果一切都失败了,请考虑进行渗透测试或外部审计。不幸的现实是,管理层经常不会听取内部技术建议,而是会在有声望的外部公司或顾问指出风险时立即采取行动。这有时是因为外部公司/顾问在用商业术语表达论点方面具有更好的技能,有时是因为他们更愿意以直率和清晰的方式陈述事实,而内部员工可能不愿意这样做,因为这可能是解释不正确或反映不佳。通常这个过程非常令人沮丧,因为外部公司/顾问会说出与您所说的完全相同的内容。不要担心——专注于最终目标,

归根结底,您所能做的就是识别和报告风险,并确保将它们尽可能清楚地传达给做出最终决定的人。他们得到了大笔的报酬来承担这些决定的责任,他们决定接受风险并继续前进实际上是非常合理的。您可能仍然认为这是一个坏主意,但这在很大程度上是无关紧要的。就您所知,可能还有其他策略或原因会改变风险等式,并使您选择继续采用您认为不好的解决方案,毕竟这是一个可行的选择。如果您已尽最大努力传达风险并提供可行的替代方案,那么您已经完成了所需的工作,现在需要利用所提供的资源以最佳方式实施最终决定。