为什么操作系统混淆防御是针对“这是一个 Unix 系统!” 没有广泛实施?

信息安全 攻击预防 操作系统
2021-08-09 23:42:25

标题中提到的侏罗纪公园场景因对那些有技术知识的人来说听起来多么荒谬而臭名昭著。但它也说明了在我看来,网络安全存在一个巨大的漏洞,尤其是物联网设备——一旦攻击者发现服务器、摄像头或婴儿监视器正在运行 linux,他们就会立即知道它是如何工作的。他们知道像这样的命令sudo是多汁的大目标,他们知道 shell 访问将带来大量有用的工具,如lscat.

那么为什么操作系统混淆不是更多的事情呢? 我不是在谈论只是将版本隐藏在网络标题中。与 JavaScript 缩小或混淆类似,我说的是在操作系统本身中更改二进制文件和文件路径的名称。如果操作系统有ha7TrUOandRRI6e29命令而不是sudoand ,那么整个攻击类别是否实际上是无用的ls想象一下,一个黑客以某种方式获得了远程 root 访问权限——如果他们不知道任何命令,他们甚至会做什么?

对于编译器来说,实现将相当容易。以“重命名此函数及其所有调用”为例。您可以为操作系统编译器和应用程序编译器指定相同的随机名称,并且它们可以相互通信。但是即使应用程序的安全性很差并且容易受到 bash 注入,这种攻击也是徒劳的。

显然,这种技术不能在所有场景中都使用。撇开人工系统管理员维护的服务器等场景不谈,在我看来,任何由自动化管理的设备或服务器都是这种防御的主要候选者。

我想问题需要更具体一点:

  1. 描述的操作系统混淆是否被广泛使用而我只是没有遇到过?
  2. 如果没有广泛使用,使用的实际或技术障碍是什么?
4个回答

在我撕开你的想法之前,让我说这是一个非常有趣的想法,而且思考起来非常有趣。

请继续跳出框框思考并提出有趣的问题!

好吧,让我们这样做吧!


让我们退后一步,问一下为什么婴儿监视器首先运行 Linux?如果没有操作系统并且应用程序是用裸微控制器代码编写的(想想 arduino 代码)怎么办?那么攻击者将没有sudols什至没有外壳可以使用,对吗?

我不是这里的专家,但我希望我们,作为一个行业,已经倾向于将 Linux 放在任何足够大的东西上,以便在很大程度上为开发人员提供便利:

  1. 减少开发时间:在构建支持 WiFi 和蓝牙的网络管理的云同步自修补 whizpopper 以及配套的 Android 和 iOS 应用程序时,Linux 附带了您需要执行此操作的所有库、实用程序和驱动程序。
  2. 提高可测试性:如果设备使用 SSH 端口运行 bash 或 busybox,那么在产品测试阶段连接并找出问题所在非常容易。

为了使您的混淆想法起作用,您不仅需要混淆命令行实用程序(如sudoand )的名称,ls还需要混淆每个 Linux 内核 API,以防止攻击者放入他们自己编译的直接调用内核的二进制文件。所以让我们再看看你的想法:

对于编译器来说,实现将相当容易。以“重命名此函数及其所有调用”为例。您可以为操作系统编译器和应用程序编译器指定相同的随机名称,并且它们可以相互通信。

您需要自己进行随机编译;否则有人可以在谷歌上查找映射。

因此,您需要使用“混淆编译器”从源代码构建内核,这样只有您知道混淆内核 API 的映射。(曾经从源代码构建过 linux 内核吗?这肯定比docker pull alpine开发文化的发展方向更加繁琐)

但是操作系统不仅仅是内核。你想要那个 mini-pc 设备上的 Broadcom BCM2837 wifi 芯片的驱动程序吗?如果 Broadcom 甚至会为您提供源代码,您将需要使用编译器针对您的混淆内核构建该驱动程序。然后,您需要构建整个 GNU wifi 和网络软件堆栈。在你拥有一个正常运行的操作系统之前,你还需要为你的构建管道寻找源代码并添加多少其他东西?

哦,如果任何这些东西的上游存储库发布了补丁,那么您现在负责重新构建它(假设您保存了与您的内核二进制文件匹配的编译器混淆映射文件)并将其推送到您的设备,因为 -按照设计 - 您的设备不能使用供应商生产的补丁二进制文件。

哦,为了挫败黑客,不会有“这是 Whizpopper 1.4.7 的二进制文件”,哦不,你需要为每个设备的内核构建一个独特的混淆版本你发货。


所以对于你的问题:

  1. 描述的操作系统混淆是否被广泛使用而我只是没有遇到过?
  2. 如果没有广泛使用,使用的实际或技术障碍是什么?

我认为答案是,如果您需要从源代码中查找和构建所有内容,那么您所描述的内容几乎完全违背了使用预先存在的软件组件的目的。实际上,完全放弃操作系统,假装是 1960 年,直接用 CPU 微码编写应用程序可能会更省力。

我比大多数开发人员更喜欢安全性,但喜欢f* that

Mike 的回答基本上说明了我必须提供的所有内容,说明为什么从开发的角度来看这是一个坏主意(而且,正如 Ghedipunk 的评论所说,一个不可用的安全功能无法提供安全性)。因此,相反,我将讨论为什么从安全角度来看,您永远不会这样做。

答案实际上非常简单:这是浪费时间,而且有更好的选择。每个愚蠢的物联网小玩意儿(记住,“物联网”中的“s”代表安全)都不会费心实现这些功能,因为地狱不会采用您建议的方法。

  1. 整个想法不适用于限制系统调用。攻击者可以只设置几个寄存器并调用操作码和繁荣,他们在内核中执行他们选择的系统调用;谁在乎它的象征性名称是什么?当然,您可以篡改系统调用表以使其复杂化(如果您不介意需要重新编译所有内容并使调试自定义内核成为一种彻头彻尾的地狱形式),但这就像混淆正在使用的操作系统一样;既然候选人这么少,为什么还要麻烦呢?即使攻击者不想对系统上的现有代码进行逆向工程,暴力破解应该是可能的,除非可用调用索引的搜索空间比我在嵌入式系统上看到的要宽。
  2. 当您可以使命令名称完全无法访问时,为什么要混淆命令名称?如果您正在运行 shell , Achroot将不适用于 shell 内置程序,但它适用于其他所有内容,实际上,为什么您定制的单一用途应用程序盒中的应用程序会运行 shell?我的意思是,出于测试目的,开发单元会安装一个,并且可能不会在您的零售图像中删除,因为您很懒惰或认为您会再次需要它。但是攻击者将无法从其应用程序运行的上下文中运行它。一个简单的(或更复杂的沙箱/监狱/容器)可以使程序无法运行 - 甚至无法访问 - 超出其工作所需的任何文件。chroot
  3. 当您可以删除对内核 API 的访问权限时,为什么还要混淆它们呢?有许多沙盒系统可以限制调用进程(或其后代......如果它甚至允许创建任何)可以进行的操作。请参阅https://stackoverflow.com/questions/2146059/limiting-syscall-access-for-a-linux-application

如果您的目标是剥夺攻击者的lsand cat,那么还有一个更好的混淆替代方法:只是不要安装这些实用程序。

虽然我不会说这是一种广泛实施的方法,但它至少是实施的。例如考虑distroless,一个 docker 镜像的集合,其中几乎没有任何内容。其中一些(比如 for go)实际上什么都没有。对在这种容器中运行的系统的攻击无法获得 shell 访问权限,因为没有任何 shell 可以运行。

然后通过攻击这样的容器中的应用程序来获得 shell 访问权限的唯一方法是绕过容器运行时,该运行时旨在防止这种情况发生。

虽然我给出了一个 docker 镜像的例子,但同样的概念通常可以应用于操作系统。例如,lscatcoreutilsDebian 软件包的一部分。您可以运行apt-get remove coreutils并确信攻击者将无法使用lscat作为攻击的一部分。当然这意味着你也不能使用它们,而且可能还有很多其他依赖于coreutils它的东西也必须被删除,但是对于嵌入式设备或只做一件事情的服务器来说可能没问题。

一般原则是减少“攻击面”:目标拥有的“东西”越多,就越容易妥协。这些东西可能是开放的网络端口、代码行或安装的二进制文件。如果提高安全性是目标,那么删除所有不必要的“东西”是一个好的开始。

因为混淆不是安全,因为操作系统混淆基本上是无稽之谈。

只有这么多常见的操作系统,并且有这么多方法可以做出有根据的猜测。如果您检测到我正在运行 IIS 或 MSSQL Server,您就会猜到下面运行的是什么操作系统。

即使我以某种方式设法运行了一个堆栈,该堆栈对我的底层操作系统一无所知,并且还掩盖了它的所有其他提示(指纹是一件事),我仍然没有赢得太多。

安全方面,您知道我正在运行 Linux,甚至知道我正在运行 Debian 8,不会让您有太多工作要做,我也不必担心太多。如果我得到适当的强化和修补,你可以知道你想要的任何东西。如果我在昨天应用到软件博物馆的补丁级别,你的攻击套件将通过尝试所有这些来打破我的开放,并且混淆我的操作系统只会迫使你尝试更多无用的漏洞。在自动攻击中,它会减慢你几秒钟的速度。

混淆不起作用。人们可以扫描你,给你指纹,或者只是扔掉他们的整个漏洞库,看看什么是有效的。

如果您将时间浪费在本可以花在实际加固上的事情上,那么您实际上是在损害您的安全性。

适当的硬化工程。我在上面说过“你可以知道任何你想要的”我已经在我发表演讲的安全会议上发布了我的 IP 地址和root 密码SSH 与远程 root 登录并启用了一堆服务。严重硬化的 SELinux 机器。没有人能打断我的演讲,尽管当我的策略还不完善时,有人曾设法将一个文本文件放到根目录中。


附录:你的出发点是一部电影。混淆是一种很棒的电影装置,因为这样的启示告诉观众英雄(或反派)发现了一些信息,因此正在取得进展。计算机相当于找出保险箱在哪里,即使您仍然需要密码。事实是否正确并不重要,它是否向观众传达了正确的情感信息。