标题中引用的侏罗纪公园场景以其对那些有技术素养的人的听起来多么可笑而声名狼藉。但这也说明了在我看来,Web安全(尤其是IoT设备)中的一个巨大漏洞-攻击者一旦发现服务器,摄像机或婴儿监视器正在运行linux,他们便立即了解其工作原理。他们知道诸如sudo之类的命令是多汁的目标,而且他们知道shell访问将带来诸如lscat之类的有用工具。

那么,为什么操作系统混淆不了呢?我不是在谈论只在Web标头中隐藏版本。与JavaScript压缩或混淆相似,我说的是在OS本身中更改二进制文件和文件路径的名称。如果操作系统使用ha7TrUORRI6e29命令而不是sudols,则整个攻击类别实际上都没有用吗?想象一个黑客以某种方式获得了远程root用户访问权限-如果他们不知道任何命令,他们甚至会做什么?

实现对于编译器来说将是相当容易的。以“重命名此函数及其所有调用”为最简单的情况。您可以为OS编译器和应用程序编译器赋予相同的随机名称,并且它们能够相互通信。但是,即使该应用程序的安全性较差并且容易受到bash注入的攻击,这种攻击也将是徒劳的。

显然,这种技术不能在所有情况下都使用。抛开诸如由人类系统管理员维护的服务器之类的方案,在我看来,任何由自动化管理的设备或服务器都是这种防御的主要候选对象。更具体:


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


评论

评论不作进一步讨论;此对话已移至聊天。

可以设计一个构建环境,该环境会在每次构建时自动对所有这些符号进行重命名并随机化。只要您拥有一切的来源,那将是新颖的,但很难进行研究。如果您曾经做过一次,那么它将永远拥有。调试将很困难。但是在某种程度上,我喜欢这个主意。这将与en.wikipedia.org/wiki/Address_space_layout_randomization类似,但在编译时而不是运行时,并且更具野心。我想得越多,就越尊重这个想法。它将增加嵌入式设备的安全性。 (没有银弹)。

#1 楼

在我把你的想法分解开之前,我要说这是一个非常有趣的想法,想起来非常有趣。

请继续思考,问一些有趣的问题!

好吧,让我们这样做吧!如果没有操作系统,而应用程序是用裸机代码编写的(想像arduino代码)怎么办?这样就不会有sudols甚至没有外壳供攻击者使用,对吧?

我不是专家,但我希望我们作为一个行业已倾向于将Linux可以在足以使开发人员方便地运行的任何大型计算机上运行:


减少开发时间:使用以下命令构建具有WiFi和蓝牙功能的网络管理的云同步自修补程序时,伴随着Android和iOS应用程序,Linux附带了您需要执行的所有库,实用程序和驱动程序。
提高可测试性:如果设备运行的是带有SSH端口的bash或busybox,则连接起来非常容易并找出在产品测试阶段出了什么问题。


要使混淆概念起作用,您不仅需要混淆命令行实用程序的名称,例如sudols ,还包括每个Linux内核API,以防止攻击者丢弃自己的已编译二进制文件,该二进制文件调用内核目录很好地因此,让我们再来看一下您的想法:


实现对于编译器而言相当容易。以“重命名此函数及其所有调用”为最简单的情况。您可以为OS编译器和应用程序编译器赋予相同的随机名称,并且它们彼此之间可以进行通信。否则有人可以在google上查找映射。

因此,您需要使用“混淆编译器”从源代码构建内核,以便只有您知道混淆内核API的映射。 (曾经从源头构建过Linux内核吗?肯定比docker pull alpine更为繁琐,这是开发文化似乎正在朝着这个方向发展。)但是,操作系统不仅仅是内核。您是否需要该微型PC设备随附的Broadcom BCM2837 wifi芯片的驱动程序?如果Broadcom甚至会为您提供源代码,则您需要使用编译器针对已发行内核构建该驱动程序。比您需要构建整个GNU wifi和网络软件堆栈。在拥有正常运行的OS之前,您还需要查找多少其他东西并添加构建管道?

哦,如果任何这些东西的上游仓库都发布了补丁,那么您现在负责重新构建它(假设您保存了与内核二进制文件匹配的编译器混淆映射文件),并且将其推送到您的设备,因为-根据设计-您的设备不能使用供应商生产的补丁二进制文件。 Whizpopper 1.4.7“的二进制文件,哦,不,您需要构建一个唯一的混淆版本,从发行版的每台设备的内核到内核。 :



描述的操作系统混淆是否被广泛使用,而我只是没有遇到过?




我认为答案是,如果您确实需要查找和构建,那么您描述的内容完全无法使用使用现有软件组件的目的。一切从来源。完全放弃操作系统,假装是1960年,然后直接用CPU微代码编写应用程序,实际上可能要花些功夫。

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

评论


您还需要重建使用这些命令和工具的每个工具,程序包和脚本,以便进行“混淆”调用。这是很多工作。

– Teun Vink
19/12/17在11:58

在Core i7上编译天数? CLFS的编译速度比这快得多:最多几个小时。如果您需要的只是kernel + busybox + several_small_utilities,甚至更快。真正需要时间的是重命名和syscall-number-mapping这个繁琐的函数,试图不破坏任何内容。为什么要从源代码构建Linux内核呢?您是否尝试避免使用其Makefile?

–俄罗斯
19/12/17在15:20



即使混淆了OS系统调用/ IOCTL,也可以使用已知的二进制代码来猜测混淆模式。如果我看到一个二进制文件,它调用了syscall 7551,然后使用看起来像stat的输出的格式字符串进行打印,则可以很合理地猜测它是stat二进制文件,而fstat或friends的syscall nr是7551。

– Nanofarad
19/12/17在20:32

我不同意您的说法,即Linux主要用于方便开发人员。从头开始为连接互联网的相机编写操作系统,将需要实现许多支持工具和库。任何层都难以实现,并且由于您不是所有这些层的专家,您自己开发的系统很可能会存在大量漏洞。使用轻量级的Linux并添加对自定义摄像头驱动程序的支持以及用于方便的Web配置的图层会更安全。 (仍然有许多公司无法以安全的方式进行配置!)

– Manziel
19/12/18在10:01

+1以鼓励保持不同的想法

–钟表
19/12/18在19:56

#2 楼

Mike的回答基本上说出了我从开发角度来看为什么这是个坏主意的一切内容(正如Ghedipunk的评论所述,无法使用的安全功能无法提供安全性)。因此,相反,我将谈论为什么从安全角度讲,您永远都不会这样做。每个笨拙的物联网设备(记住,“物联网”中的“ s”代表安全)都不会麻烦地实现这样的功能,以确保地狱不会采用您建议的方法。
整个想法只对限制系统调用无效。攻击者只需设置几个寄存器并调用操作码和繁荣,它们就在内核中执行所选择的系统调用。谁在乎它的象征名称?当然,您可以篡改syscall表以使其复杂化(如果您不介意重新编译所有内容并使调试自定义内核变成一种完全的地狱),但这就像混淆了正在使用的OS;无论如何,为什么要打扰候选人呢?即使攻击者不想对系统上的现有代码进行逆向工程,也应该可以采用蛮力手段,除非可用调用索引的搜索空间比我在嵌入式系统上看到的要宽。当仅使命令名称完全不可访问时,为什么还要混淆它们呢?如果您正在运行外壳程序,则chroot不适用于外壳程序内置程序,但对于其他所有功能都可以正常工作,实际上,为什么定制的单一用途的一体式应用程序运行外壳程序?我的意思是,出于测试目的,开发人员单元将安装一个,并且可能因为懒惰或认为您将再次需要它而无法在零售映像中删除。但是攻击者无法从其应用程序运行所在的上下文中运行它。一个简单的chroot(或更复​​杂的沙箱/监狱/容器)可能会使该程序无法运行-甚至无法访问其工作所需文件以外的任何文件。给他们?有许多沙箱系统可以限制调用流程(或流程的后代,甚至允许创建任何流程)的内容。请参阅https://stackoverflow.com/questions/2146059/limiting-syscall-access-for-a-linux-application



评论


而且,经过广泛测试的安全性方法(例如流行的Linux或OpenBSD发行版上的chroot)在野外可能比全新的,故意难以测试的方法更强大。关闭不需要的端口:也不错。

– O. Jones
19/12/17在23:58



+1表示“记住”,“物联网”中的“ s”代表安全的X ^ D

– ErikE
19/12/18在17:40

如果您控制发行版,则可以加扰内核syscall的顺序。您只需以编码方式重建glibc,依此类推。

–卡兹
19/12/20在7:59

关于问题1,PlayStation 4操作系统实际上是这样做的。它基于FreeBSD,系统调用号本身是随机的。当然,对于黑客来说,发现什么系统调用编号指的是什么系统调用并不困难,因为当给定各种参数时,每个系统调用具有或多或少的独特行为:cturt.github.io/ps4.html

–森林
19/12/21在11:33

#3 楼

如果您的目标是要剥夺lscat的攻击者,那么还有一个更好的替代方法:不用安装这些实用程序。它至少是工具。例如,考虑无发行版,这是其中几乎没有任何内容的docker映像的集合。他们中的一些人(如随身携带的人)实际上没有任何东西。在这样的容器中运行的系统受到的攻击无法获得外壳程序访问权限,因为没有任何外壳程序可以运行。然后是为了规避容器运行时,而该运行时正是为了防止这种情况发生。例如,lscat是Debian中coreutils软件包的一部分。您可以运行apt-get remove coreutils,并确信攻击者将无法使用lscat作为攻击的一部分。当然,这意味着您也不能使用它们,并且可能还有很多其他依赖于coreutils的东西也必须删除,但对于嵌入式设备或服务器而言,仅做一件事可能就可以了。

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

评论


可以说,如果我安装了带有ls,cat,docker的安装,而没有太多其他安装,那么我想删除以提高安全性的第一件事就是docker。大多数理智的IoT东西都使用busybox ls,如果安装了cat,则对每个工具都是相同的二进制文件。

–有资格
19/12/17在19:41

感谢您向我介绍一个新颖有趣的概念!

–ElectricWarr
19/12/18在15:09



当随机脚本因为找不到猫而中断时,祝您好运诊断问题...

– Federico Poloni
19/12/19在12:02

@FedericoPoloni:设置-euxo pipefail和shellcheck是一个很好的开始...而且tbh,大多数Unix脚本编写的猫科动物都是That Notorious Award的候选人。

– Piskvor离开了建筑物
19/12/19在12:48

多年前,布鲁斯·施耐尔(Bruce Schneier)在一次技术会议上发表了演讲,他解释说,他的公司在其客户网络上安装的系统运行的是精简的Linux内核,没有bash或攻击者可以使用的许多其他工具。他举了个比喻,有人在卧室的窗户下面放了一个工具箱,这对小偷来说很方便。基本规则是,如果不需要它,则无需安装它,从而减少了该工具箱的内容。

– Monty Harder
19年12月19日在20:50

#4 楼

因为混淆不是安全的,而且因为操作系统混淆基本上是胡说八道。如果您检测到我正在运行IIS或MSSQL Server,那么您就可以猜测其下运行的是什么操作系统。并掩盖了所有其他提示(指纹是一回事),我仍然赢不了什么。运行Debian 8并不会给您太多工作,我也不必担心。如果我经过适当的加固和修补,您将知道您想要什么。如果我的补丁程序级别已于昨天应用于软件博物馆,那么您通过一系列攻击就可以完全打破我的攻击,而混淆我的操作系统只会迫使您尝试一些无用的攻击。在自动攻击中,这会使您减速几秒钟。

混淆不起作用。人们可以扫描您的指纹,对您进行指纹识别,或者只是扔掉整个漏洞利用库,以查看有效的方法。

如果您浪费时间在本来可以用来加固的内容上,那实际上是在伤害您的安全性。

正确的加固工作。我在上面说过“您可以知道任何想要的东西”。我已经在安全会议上发表我的IP地址和root密码的演讲。 SSH,具有远程root登录和启用的一系列服务。认真硬化的SELinux机器。没有人曾经设法打断我的讲话,尽管曾经有人设法在我的策略还不完善时将文本文件拖放到根目录中。


附录:您的出发点是电影。混淆是一种很棒的电影设备,因为这样的启示会告诉观众英雄(或反派)找到了一些信息,因此正在取得进步。即使您仍然需要代码,它也等同于找出保险柜的位置。不管它是否正确,是否能够向听众传达正确的情感信息。

评论


您正在运行... Linux与Wine? 😉无论如何,JP系统并非故意被混淆;没有任何理由,除了故意混淆桌面操作系统之外。 JP中的安全性将依赖于身份验证(和物理安全性),就像在现代台式机系统上一样。

–马修
19/12/18在17:50

次要问题:SQL Server 2019实际上确实在Linux(以及Powershell和ASP.NET)上运行。我不知道有谁真正这样做过……但是有可能。

–GrandOpener
19/12/18在17:51

#5 楼

举一个非常普遍的例子,拥有自己的操作系统的英特尔管理引擎会执行类似的操作,即存在固件更新机制,但是固件必须采用非常特定的格式,其详细信息必须是机密的。它似乎涉及带有未知参数的霍夫曼编码。与您的建议类似(基本上是对固件进行对称加密),ME需要在固件准备时进行特定修改,并且在执行时与标准机制存在匹配偏差。

评论


混淆试图防止逆向工程,因此攻击者无法在实施过程中发现更多安全问题。

–eckes
19年12月17日在16:41

还是英特尔自己在做自己想隐瞒的事情是不可能的。

–罗马奥代斯基
19/12/17在17:40

值得一提的是,ME中存在许多安全漏洞,并且很可能仍然存在。而且,整个混淆过程也使安全研究人员更难进行分析。

–约瑟夫说恢复莫妮卡
19/12/18在11:28

Intel ME是个恶作剧

– John Doe
19/12/18在22:02

@johndoe我认为您从未听说过更新的英特尔“创新引擎”。 :P

–森林
19年12月21日在11:35

#6 楼

您所描述的称为“通过隐秘性进行安全性”,并且是众所周知的安全性反模式。意味着必须对未接受安全哲学的人们进行教育,以免落入其中。这不是一个新主意,而是一个古老的,糟糕的主意。 ,并认为模糊是一种有前途的策略。所有房屋都是在走廊和房间,带有门把手的门,电灯开关等外部建造的。由于这些都是众所周知的,您可能会认为这是不安全的,因为入侵者可以通过这些众所周知的建筑元素轻松地操纵房屋。您可能会尝试从头开始重新设计建筑原理,将门把手替换为魔方,将半高的天花板弄乱,以至于使入侵者感到困惑等。最终,您会发现一栋可怕的房屋,无法维护,因为没有承包商想要任何东西这样做,最糟糕的是什么都不做,因为任何入侵者一旦进入,都可以用他的眼睛环顾四周,并用他的大脑弄清楚它。黑客从根本上就是迷上了拼图的人。不想将您的黄金隐藏在一个秘密的通道中,因为最终Abbot和Costello会倚靠在那个烛台上并意外打开它。通过良好的秘密组合和篡改警报,将您的黄金放入保险箱。等效的计算机受到公用密钥加密的凭据访问的限制,有限的用户访问角色,监视系统,减少暴露的表面积,减轻进入威胁矢量的作用等。使您的系统离支持越来越远,更难获得安全补丁,更难以安全的方式使用。

编辑:有时,除了实际的安全性之外,通过隐晦的某种安全性也是可以接受的。一个常见的示例是在30000之类的高端口上运行SSH。 SSH是加密的,并且访问位于凭据身份验证的背后,这才是真正的安全性。但是,如果有人正在进行快速扫描,则将其放在较高的端口上只会使其不那么显眼。比这更令人费解的事情,例如试图混淆您的操作系统,只会使其成为操作上的噩梦,这将使实际的安全措施(例如更新补丁程序)更加困难。

评论


“通过模糊性实现某种安全性是可以接受的”:使用非默认端口的示例不是安全性,这很方便:在这种情况下,“我不希望我的ssh记录失败尝试的次数。”完全不涉及安全性。

– Piskvor离开了建筑物
19/12/19在12:38



你是对的。我的措辞不好。

–user1169420
19/12/19的16:41

有关通过隐蔽性实现安全性的更多讨论,请参阅不是所有的安全性都通过隐性实现吗?和模糊性的有效作用。这些评论在第二个链接上很有见地。关于更改默认端口,有一些警告,如我应该更改linux服务器上的默认SSH端口中所述。同样,评论中有一些有用的东西。

–灭火器
19年12月19日在17:22

@Piskvor使用非默认端口确实可以防止随意的即兴拉扯,从而有助于提高安全性。父亲在我很小的时候就教我:锁是为了保护普通人,而不是顽固的罪犯。他会接你的锁。打破它,粉碎窗户并以这种方式获得进入。话虽这么说,而不是更改服务器上的SSH端口,只是不要将SSH连接通过防火墙路由到它们(设计为面向Internet的SFTP服务器除外)。让合法管理员进入您的VPN以获得远程访问。

– Monty Harder
19/12/19在21:28

不要将SSH放在高端口上。当然,您可以将其放置在非默认端口上,但是将其放置在较高的端口上会导致非root用户本地进程使SSH服务器崩溃并绑定到该较高的端口。低端口对于服务器很重要,因为它需要绑定根(以及root附带的某些功能)。

–森林
19/12/21在11:36



#7 楼


如果操作系统具有ha7TrUO和RRI6e29命令而不是sudo和ls,则整个攻击类别实际上都没有用吗?想象一个黑客以某种方式获得了远程root用户访问权限-如果他们不知道任何命令,他们甚至会做什么?


更好的选择是根本不安装这些命令首先。我不认为您实际上需要运行Linux内核的外壳程序,尽管这意味着您的启动过程不是sysV-init或systemd之外的其他过程。这是安全性和易于开发之间的权衡。不幸的是,许多设备制造商比后者更关心后者。


实现对于编译器而言相当容易。以“重命名此函数及其所有调用”为最简单的情况。您可以为OS编译器和应用程序编译器赋予相同的随机名称,并且它们能够相互通信。但是,即使该应用程序的安全性较差且容易受到bash注入的攻击,这种攻击也将是徒劳的。我认为您可以通过修改链接器¹来实现此目的,以对所有符号名称应用随机化。可能仅将哈希函数与仅制造商已知的盐一起使用就足够了。我不确定您是否甚至需要源代码来执行此操作,即,我认为您可以将整改应用于已编译的代码。修改目标代码以替换符号名称,但这仍然更像汇编程序级别,也就是说,a)您并没有完成编译C / C ++ / etc的所有艰苦工作。代码和b)您不需要C / C ++ /任何源代码。 OTOH我不确定如果您的设备代码是类似Python的代码,那么您根本无法做这种事情。)

但是,仍有可能对流程进行逆向工程,而且,除非您不加盐,否则这可能会违反GPL²(尤其是GPLv3),这会破坏目的。因为有GPL”,这可能是您看不到这一点的主要原因;除了使每个设备不同之外,很难以一种实际上有用的方式来实现。 OTOH,这至少意味着攻击者只能针对特定的设备,而不能利用“运行Linux xyz的任何设备”上的漏洞。 “,但请注意,这通常甚至适用于LGPL的内容。)

请注意,GPL不需要您发布盐,因为您是“修改”了资源。如果符号名称随机化发生在编译时,则您尚未修改源。您之所以需要发布盐,是因为GPL要求用户可以替换自己的GPL库版本,除非他们知道盐,否则他们将无法发布。 (如前所述,您可以使用GPLv2来解决这个问题,但是技术效果类似于“仅运行签名的软件”,GPLv3是专门针对该软件编写的。)


最终,这里可能会有一些优势,但是您不会使任何特定的系统明显更安全(众所周知,“默默无闻的安全性”根本就不是安全性)。您可以实现的任务是,使通过单个向量定位多个系统变得更加困难。

评论


“我认为您可以将修改应用于已编译的代码。”这是一个非常有趣的想法,可能会影响此处给出的许多其他答案。我不熟悉将链接与编译分开的想法,至少在大学教室之外并不如此。

–土著
19/12/19在15:40

#8 楼

公平披露:我是一家以此为基础的公司的首席技术官。为您想要的一切消除偏见。

确实有可能完全构建系统内核,设备驱动程序,程序包,整个堆栈PER主机,每天多次,并且可以相当有效。这正是我们所做的,我们帮助客户做到了。我们并不是唯一的人-我们可以推断出至少Google也对所有机器都做到了(参考即将推出。)

现在,如果您能够从头开始重建每台机器,您可以更改哪些内容?

内核自我保护项目已经可以通过对内核结构进行随机重新排序来实现此目的:https://lwn.net/Articles/722293/。本文还指出了著名的交易所,Linus Torvalds将其称为安全剧院,但是该项目的作者(在Google工作的人)评论道:“那么,Facebook和Google不会发布其内核版本。 >
这使人相信至少Google会这样做并且认为它有用。我们可以对封闭集进行更多类型的加扰吗?从最根本的角度讲,为什么Windows病毒不能在Linux或Mac上运行?因为格式不同。底下全是x86,但是不一样。那么,如果两个Linux以相似的方式不同怎么办? Windows与Linux并不是“混淆”,仅仅是因为我们没有很多方法可以使Linux像Windows与Linux一样不同。但这并不是没有可能,甚至没有那么困难。采用KSPP的方法并将其应用于系统调用,然后根据这些系统调用重新编译所有内容。这将很难破解-至少不是以飞越的方式。

您的问题是关于符号重命名(可执行文件,库的名称等)的,这有两个方面:它有用吗? (b)能可靠地完成吗?

我们正在寻找一种能够一劳永逸地解决PHP代码注入的方法。尽管您会相信HackerNews,但是在Internet留言板之外,PHP代码注入并不是解决的问题。现实生活中的PHP开发人员,管理员和用户面临着无数次的代码注入。 polyverse / polyscripted-php

我们公开分享此信息以征求反馈,并且我们经营两个网站polyscripted.com和nonpolyscripted.com,它们根据您的名字准确地完成了您的期望。我们还雇用了渗透测试人员来尝试打破它。我个人认为这不会增加多少价值,但是会增加一点价值吗?我认同。因此,它涉及成本。如果您能以更低的成本获得很少的价值,为什么不这样做呢?这就是我们所有人都拥有ASLR的原因-这并不是切成薄片以来的最大防御方式,但是如果您已经拥有可重定位的代码,并且无论如何都要对其重新排序,为什么不将其推到极限并随机化呢?简而言之,您正在描述的方法正在被许多人(包括Google,Facebook,Linux内核等)以及“移动目标防御”领域的许多院士以及少数几个尝试。像我们这样的公司正在努力使它像ASLR那样易消耗。

评论


如果对其进行编辑,使其听起来听起来不像新闻稿,而更像是“我们有经验”的一般性回答,那么这种情况将得到改善。您是否可以将更多精力放在概念上,而不是将精力放在公司上?

– schroeder♦
19/12/20在7:17



#9 楼

认为有用性



尝试向您的新系统管理员解释,他必须击中ha7TrUOsudo而不是RRI6e29等,以此类推...您只需要学习翻译清单!

也不能浏览本地网络:您必须维护论文清单以保持整体视野!命令,您将必须驱动此命令以进行系统升级!

Nick2253注释掉,如果您尝试构建嵌入式系统,然后在发布最终产品之前进行混淆,则必须测试最终产品


您必须创建自制脚本来绑定所有内容以进行混淆。
如果出现问题,调试将变得棘手。
您必须创建自制脚本去混淆脚本,以便能够进行一些调试。
也必须对自定义反馈(带有日志文件)进行去混淆。进口蚂蚁可以解决新的潜在错误。

对于极少的安全改进,请参阅进一步的内容。





<<即使您尝试重命名文件,应用程序级别和操作系统级别的功能,所有这些都将使用标准库,如果攻击者发送二进制可执行文件,这些标准库将被直接调用。您甚至可以考虑混淆所有标准库! (包括文件系统,网络协议...)
尽管您使用未修改的内核,但它们将使用标准变量和名称空间。因此,您将必须创建混淆版本的内核...

...然后将所有内容绑定在一起!

好,即使所有内容都被混淆,应用程序也会
/>必须处理互联网。混淆不会阻止有关此问题的概念错误!

不透明性如果不是从各个层面来看,都不会提高安全性。

由于需要使用标准协议才能处理Internet,因此完全不可能完全掩盖。

请考虑使用许可证


如果您计划要分发GNU / Linux,您必须共享GNU通用公共许可证GPLv3和/或GNU LESSER通用公共许可证LGPLv3中所述的源代码(取决于所使用的应用程序和库)。这将意味着混淆方法以及每个分布式产品的发布。

严格回答您的两个问题:

我是专家,但是关注点很小。几年前,我在许多不同的小型企业基础架构上工作,做出了一些选择。进化和历史似乎证实了我的选择,但这只是我个人的观点。 br />
所以我真的不知道混淆的使用是广泛的,但是我并没有默默地使用安全性,也不建议这样做。


广泛使用,使用的实际或技术障碍是什么?


没有障碍!只是适得其反。时间成本迅速变得巨大,安全性的提高是诱人的。

当然,要做一些最小的事情:


不要开始ls服务器(如果不需要)
不要安装ssh,请使用正确的权限,组和一致的结构。
使您的全局基础结构保持最新!!!!!!


小样本sudo




固定when light come over obscurity:两种方式。




从22移动ssh端口至34567


轻巧迅速,但

如果攻击者找到了它们,他们可能会在很长时间内向该端口施加平稳的蛮力,直到用户会发现它们。


安装防火墙


更强大,需要更多知识,但是。

起来时更安全迄今为止。





评论


这并不能真正回答@OP的问题。他们专门搁置了人类维护的系统,因此可用性论点并没有真正适用。

– Nick2253
19/12/18在13:17

甚至嵌入式系统也可以维护,编辑和升级。

– F. Hauri
19/12/18在13:22

当然。根据OP的问题,我认为那些手动维护的系统将被排除在外。特别是,OP会针对此类混淆调用“由自动化管理”的系统。显然,人们在某种程度上参与了所有系统管理,但是我将其理解为是指由自动化直接管理的系统。或者换一种说法,自动化工具将管理抽象化到与操作系统级别混淆无关的地步。

– Nick2253
19/12/18在13:34

@ Nick2253我从观点出发添加了更多内容。

– F. Hauri
19/12/20在11:16

#10 楼

我会告诉我从黑客的角度看待它的方式。 />

如果我已经可以访问系统上的shell,则只需上传busybox(所有基本实用程序都在一个二进制文件中)或我需要用于基本操作的全套二进制文件。进一步升级特权,我可能需要寻找suid-root二进制文件,并且其中只有少数(sudo,mount等)。黑客无法上传此类文件(除非他已经是root)。我简单的小型linux系统只有24个suid二进制文件。手动尝试每种方法都非常容易。

但是无论如何,我同意,这会使破解该工具箱变得更加困难。使用(破解)该系统会很痛苦,但有可能。黑客在系统上工作了数小时,数天或数月……但是管理员/用户可能在系统上工作了数年,并且不记得ha7TrUO和RRI6e29名称。也许没有人甚至会尝试破解系统,但管理员每天都会遭受苦难。 。就像您强制使用包含20个以上字符的复杂密码一样,最有可能的密码将写在显示器的便利贴上。如果您要使系统变得如此模糊-对于良好的用户来说,将很难进行工作。他们将不得不做一些事情来使他们的生活更轻松。例如,他们可以上传其busybox二进制文件。暂时的。他们会忘记它或有意将其留在那儿(因为他们打算稍后再使用它。)

#11 楼

实际上确实发生了,因为ssh连接是加密的。更改某些核心二进制文件的名称仅能完成上述任务。同样会引起很多混乱:例如依赖这些实用程序的所有脚本都将变得不可用,或者您需要具有某种代理“反混淆器”,这肯定会最终成为攻击媒介。但是,我已经看到一些狂野的服务器不允许root登录,而不得不使用sudo。 sudoers的用户名仍然保密。我不确定它的安全性,但我不是专家。

#12 楼

为什么所有的门都没有十个钥匙孔,实际上只有一个能用于钥匙或锁匙?答:花费小偷的时间只花十秒钟是不值得的。但实际上,我们大约有四个独特的通用代码库-所有事件发生时机均会泄漏有关自身的信息,而对于一些低级OS功能,芯片制造商会提供规定的机器位代码序列来激活或访问某些cpu功能,它们所有可能都有包含完全相同代码的短序列。

#13 楼

编译器(实际上是链接器)已经这样做了。这是逆向工程很难的主要原因之一。

在您的源代码中,您可能具有以下功能:

void print_hello() {
    printf("Hello!\n");
}

void print_hello_twice() {
    print_hello();
    print_hello();
}


它们的外观如下将它们编译成程序后:

0x400582 push rbp
0x400583 mov rbp,rsp
0x400586 mov edi,0x400634
0x40058b call 0x400490
0x400590 nop
0x400591 pop rbp
0x400592 ret
0x400593 push rbp
0x400594 mov rbp,rsp
0x400597 call 0x400582
0x40059c call 0x400582
0x4005a1 nop
0x4005a2 pop rbp
0x4005a3 ret


您可以“清楚地看到”,print_hello现在称为0x400582printf现在称为0x400490print_hello_twice 0x400593。所有调用还被赋予相同的随机名称,以便函数可以相互调用。时间。

评论


编译不是混淆:混淆和反编译,混淆基于C的二进制文件以避免反编译。

– F. Hauri
19/12/20在13:11

@ F.Hauri它确实要求了问询者,不是吗?但是,仅在单个程序的范围内。

–user253751
19/12/20在14:56



这不是OP所要的。您的答案是“这已经完成”,如果实际上是正确的话,将使问题变得毫无根据。上下文是:“我正在谈论在OS本身中更改二进制文件和文件路径的名称”以及文章中提到的命令。

– schroeder♦
19/12/24在11:41

#14 楼

如果您在分发给公众的IoT设备上混淆了GNU / Linux,则由于该代码属于GPL之下,因此将被迫发布您的代码,或者将该设备退出市场。依赖保密性的策略-这是不可行的想法。

不知道为什么不赞成这样做;但是如果您的反对意见符合Charles的评论:仅重命名核心实用程序将不起作用(为简单起步,您必须编辑GPLed初始化脚本)。我强烈怀疑您还必须重新编译许多与其他二进制文件(如gcc编译器驱动程序,ld.so,sh / bash等)交互的二进制文件。所有shell脚本和许多配置文件都需要知道其名称和位置二进制文件,因此必须进行更改。

所有这些都是经过GPL处理的,您将不得不发布更改的源代码,脚本和配置文件,从而使混淆工作变得沮丧。如果仅在内部使用该设备,则没有义务发布源,但与此同时,混淆的情况要弱得多:您将自己感到沮丧。

评论


您当然不需要发布文件名-而且我从未见过有人声称,例如,出版someprog.tar.gz.sig的作者(即使有其他版权所有者)也需要发布其私有文件签名密钥,以使其他人重现签名。这样的要求会在法庭上被嘲笑。

–查尔斯·达菲(Charles Duffy)
19/12/18在21:33



...此外,如果您修补某些内容以仅在自己的数据中心中使用,则根本不需要发布该修补程序;这只是触发许可证要求的发行版。

–查尔斯·达菲(Charles Duffy)
19/12/18在21:36



@CharlesDuffy如果您更改了Linux内核和gnu工具的源代码以及GPL编写的shell脚本(如果我正确理解OP的话,这是必须做的),然后将其编译并放在您交付给客户的嵌入式设备上,当然,需要发布您的源代码,以显示所有费解的系统调用和gnu二进制文件。我认为我没有谈论签署密钥,也没有谈论OP。您不必发布更改的文件名,是的。但是使用该重命名二进制文件或脚本的任何脚本或程序都需要更改,并且其源代码必须发布。

–彼得-恢复莫妮卡
19/12/18在22:00



@CharlesDuffy如果只是简单地重命名了二进制文件或脚本,则可能不需要发布新名称。但必须修改任何呼叫者。如果程序或脚本从未在嵌入式设备上使用过,那么最好不要首先将其包含在随附的映像中。

–彼得-恢复莫妮卡
19/12/18在22:06



当然。 “运送给客户”与“内部使用”是不同的。即使未广泛实施并交付给外部客户,也可以广泛实施。

–查尔斯·达菲(Charles Duffy)
19/12/19在16:38