我一直坚信混淆本质上是没有用的。混淆后的代码并非不可能阅读,只会更难阅读。我相信熟练的攻击者能够将混淆后的代码带回可读性更高的状态。

,OWASP建议对移动客户端使用混淆,这让我想知道是否存在

因此,我的问题是:混淆会给您带来可衡量的安全性好处吗?具体来说,其好处超过了增加的成本,复杂性和降低的性能。


注意:当我说“混淆”时,我是在谈论为防止反向工程而采取的有意识步骤。编译器优化即使使程序集不那么容易阅读,也可以提高性能,而不是防止逆向工程。

评论

根据我的经验,在安全领域中没有大量的度量和经验证据。它主要是很多“应该这样工作”,轶事经历和外推法。就我个人而言,我认为代码混淆不只是安全性,还在于它试图保护业务利益和代码秘密。

混淆的一个小好处是信息破坏。诸如口头语言,编码习惯等之类的东西。该过程(最终是代码)可以重新理解,但是标识符会丢失。虽然,我无法想到一个合理的理由。此外,某些混淆处理(例如,时光倒流的Java)可能会在输出中引入无法使用当前技术/反编译器轻松重建的功能。这使得Java极难进行反编译。因此,甚至可以阻止有经验的用户推断代码。这是一个比竞争对手更好的困惑。

我发现令人着迷的是,去混淆的可能性在很大程度上取决于代码样式。就像变量名的重要性一样。该代码可以用较低级别的语言编写,并使用非常高级的模式。就像面向对象的类大致在Java级别上一样,所有类都根据需要部分实现。同样,使用设计模式,甚至跨越更长的代码区域。所有这些结构主要用变量名表示。相同类型的两个值可以属于不同的类别,以名称表示。不同的类甚至可以相同。

“ OWASP建议对移动客户端使用混淆处理”-可能仅是因为,例如,使JavaScript混淆程度最小化,但是真正的目的只是使其变得更小,传递更少的信息并加快Internet流量和网页加载时间

@Mawg但是OWASP并不特别建议混淆JavaScript

#1 楼

代码混淆有两个好处:


它清除了攻击者池的浅端。难以理解您的代码的脚本小子会去其他地方。
这会增加熟练的攻击者的工作量。不管混淆技术多么熟练,混淆处理都比去混淆处理便宜,并且结果通常比原始混淆的含义少(例如,在原始名称具有描述性的情况下,变量名称将保持通用)。

@SteveSether在他的评论中加倍正确-几乎无法找到实际的度量,并且出于专有原因*(而非安全性原因)混淆了许多代码库。

但是出于安全和专有的原因,代码混淆的价值与其不对称质量相关联-混淆的价格要比反混淆的价格便宜。


*由于“专有原因”,我的意思是“出于维护市场竞争优势的目的,希望使自己的代码和算法更加私密,或更难以复制。”公司和个人都容易出现这种趋势。

评论


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

– Jeff Ferland♦
19-10-14在23:56

#2 楼



只要我看到模糊的代码(主要是病毒和rootkit),就可以在请求,日志,文件传输中从Internet接收的所有潜在内容(邮件,ftp,web,dns等)上混淆代码),对代码进行充分模糊处理以找到基本信息(例如服务器地址,管理员ID和僵尸网络的哈希密码或敏感病毒的敏感字符串或库调用)所花费的时间通常以分钟计算。
因此就防止奇怪代码而言,这不是一件容易的事(如果不琐碎的话)。


另一方面,从这种代码构建可编辑源可能会花费很多时间(如果代码很大,则以几天,几周甚至更多的时间来计算。反混淆处理的进度越多,它们越有效率和效率,就像光来了一样)。 br />关于OWASP的建议,我同意:混淆意味着人力资源,因此它们代表了一些成本,使盗版吸引力降低。


关于measurablilitysecurity benefit ...对不起,但是我不能!总体来说,我自己的建议是:使用混淆本质上不是一个坏主意,但并不是这样。被视为对安全性的重大改进!
更清楚:永远不要考虑混淆代码以隐藏秘密键/函数,以使其比不混淆密钥/功能更安全!

评论


对于恶意软件而言可能确实如此,但是对于整个应用程序或游戏,代码变得更加难以逆向工程。当然不是几分钟的事。

–Hugo Zink
19-10-10在9:08

@HugoZink我认为他的意思是可以清晰地发现感兴趣的值。例如,必须将IP地址存储为值。基本上是gzip -d obfuscatedfile |字符串|减

– Volker Siegel
19-10-10在11:28

@VolkerSiegel我不同意。它可以通过算法生成,也可以从加密的字符串解密,从而迫使攻击者找出解密算法的机制以及密钥的存储位置等。

–乔恩·本特利
19-10-10在12:22



@JonBentley您可能拥有世界上最奇妙的混淆/加密/生成的IP地址,可能需要100名工程师的团队30年才能对其进行解密,但是最终软件必须将其未加密地提供给connect()这样的系统调用。至少在Linux上,这些系统调用很容易使用strace记录并使用gdb进行捕获。

– Iwillnotexist Idonotexist
19-10-11在5:52

@trognanders在使用strace,gdb,tcpdump跟踪操作时,运行混淆代码的简单方法将带来很多好处。由于几乎所有的字符串,地址,端口等都将变得可读。

– F. Hauri
19-10-11在9:52

#3 楼

模糊处理的另一点是,使攻击者更难拒绝其反向工程活动。

如果您有一个服务器允许任何向其发送“ Hello foobar”字符串的客户端,并且有人利用因此,可能很难在法庭上证明罪犯确实有攻击意图,而不仅仅是误解了您的许可协议并假定允许这样做。如果您的客户端使用混淆后的密钥(包含在客户端本身中)向服务器进行身份验证,则在安全性方面将得不到什么好处,但是利用服务器的人将很难证明他们是偶然获得了该密钥,而不是通过有意的逆向工程工作。

#4 楼

混淆极大地增加了对程序进行逆向工程的时间成本。尽管从混淆程序中提取一些小秘密可能很快,但是制作该程序的非混淆版本的工作仅是重写它的竞争对手。提取一种新颖的算法是可能的,但并非不重要。

可以对基本混淆的代码进行推理,但不能重用。

代码混淆是大量CS研究的主题...混淆本质上毫无价值的公理将引起争议。

我建议本书《秘密软件:软件保护的混淆,水印和防篡改》。由Christian Collberg和Nagra Jasvir创作。

评论


有时,即使使用编写得不好的源代码也很糟糕,您最好重写它。有时在原始源代码中理解某人的算法可能并非易事。使它变得更糟10或100倍(或更多)……OP最好将他们的房屋和车门解锁,并大开它们的贵重物品,因为锁不会使人们放慢代码混淆的速度。

–亚伦
19-10-11在15:52

#5 楼

当发现并利用您的软件中的可利用错误时,它会增加主动性高,资金充足的攻击者的可能性,这些攻击者专门针对您(或使用您软件的人),而不是skript小子,勒索软件等。

在大多数情况下,我认为您宁愿由whitehat或grayhat研究人员发现软件中的错误,并以skript kiddy和勒索软件为第二选择,并在州一级攻击者之类的情况最糟。但是您需要拨打电话。