Lisp 中存在恶意软件?现在你只是残忍
快速阅读: 《The Register》消息,研究显示,恶意软件作者正转向不常用于开发的编程语言(如Delphi、Haskell)以规避静态分析。通过使用较少人熟悉的语言和编译器,恶意软件的检测率降低,逆向工程难度增加。安全社区需加强对这些语言的检测工具研发。
为了躲避分析,恶意软件作者正在转向像德尔菲或哈斯克尔这样不太流行的编程语言。来自希腊比雷埃夫斯大学、雅典研究中心以及荷兰代尔夫特理工大学的计算机科学家们研究了近期的恶意软件,以更好地理解为何部分恶意软件能逃避静态分析——这是一种在不执行代码的情况下理解代码的软件测试技术。研究团队包括西奥多罗斯·阿波斯托洛普洛斯、瓦西利奥斯·库索科斯塔斯、尼古拉奥斯·托托西斯、康斯坦丁诺斯·帕塔萨基斯和乔治奥斯·斯马拉加迪斯。他们在一篇题为《用时髦的编程语言编写恶意软件以取乐与获利》的预印本论文中描述了他们的发现。
海量的恶意软件——仅在2025年就出现了近2600万个新的恶意代码实例,根据杀毒软件评估机构AV-TEST的数据。而识别恶意代码的主要手段之一便是静态分析。恶意软件作者知晓这一点,因此许多人努力混淆代码或应用反沙箱或反调试技术。一种方式是简单地使用一种不常用于恶意软件开发的编程语言。“多年来,勒索软件团伙一直在转向更新颖、非常规的语言,”作者观察到,“此外,各种威胁行为者都采用了这种方法,使用了广泛的编程语言和技术来混淆他们的恶意代码。”
一种方式是简单地使用一种不常用于恶意软件开发的编程语言。他们指出,安全研究人员讨厌Visual Basic 6二进制文件,因为反向工程软件的复杂性;2012年的Flame恶意软件中的Lua混淆层;以及包含汇编语言编写的Brainfuck解释器以生成密钥码的Grip病毒,作为例子。“尽管用C编写的恶意软件仍然是最普遍的,但恶意软件操作者,主要是已知的高级威胁组织如APT29,越来越多地在其工具集中加入非典型的恶意软件编程语言,”他们写道。“例如,APT29最近在其针对乌克兰的Masepie恶意软件中使用了Python,而在其Zebrocy恶意软件中,他们使用了Delphi、Python、C#和Go的混合体。同样,Akira勒索软件从C++转向Rust,BlackByte勒索软件从C#转向Go,Hive被迁移至Rust。”
在某种程度上,这不过是通过晦涩性实现安全性的一种变体——当较少人熟悉特定语言时,可以预见手动检测会减少,自动化工具也会有更少的样本。但是基于已识别恶意软件签名的自动化检测机制在恶意软件被改写成不同语言时将失效。研究人员指出,像Haskell和Lisp这样的语言所采用的执行模型不同于用C开发的恶意软件。其他语言,如Dart和Go,在其标准环境中可能会向可执行文件添加大量函数,使得即使是简单的程序也变得复杂。
为了更好地理解为何某些语言比其他语言更能抵抗分析,作者检查了来自Malware Bazaar的将近40万个Windows可执行文件。Oracle JDK 24出现在罕见的版本和功能计数对齐中。C++创建者呼吁帮助保护编程语言免受“严重攻击”。Linux之父支持采用Rust进行内核代码开发,称其崛起不可避免。是时候让C成为本世纪的COBOL了。
他们发现不仅使用的编程语言影响了恶意软件的检测率,选择的编译器也有所不同。“虽然人们可能会期望不太常用的编程语言,比如Rust和Nim,会有更差的检测率,因为样本稀疏不允许创建稳健的规则,但使用不太广泛使用的编译器,比如Pelles C、Embarcadero Delphi和Tiny C,对检测率有更大的影响,”他们表示。在查看了一个更有限的数据集,专注于APT(高级持续威胁)之后,研究人员说,显然,APT作者已经多样化了他们选择的编程语言和编译器。
专家们考察编程语言间恶意软件差异的方法之一涉及评估二进制文件抵抗壳码模式匹配的能力——即查找恶意指令集的过程。结果显示跨语言存在显著差异,并强调了为何在更常见的语言中更容易找到恶意软件。“用C和C++等语言编写的样本通常保留所有壳码字节按顺序排列,”作者说,“然而,其他语言表现出显著的字节碎片化和内存布局变化,使静态检测变得复杂。”
专家们考察编程语言间恶意软件差异的方法之一涉及评估二进制文件抵抗壳码模式匹配的能力——即查找恶意指令集的过程。他们提到Rust、Phix、Lisp和Haskell等语言,这些语言以不规则或非显而易见的方式分布壳码字节。还有其他原因使得不太受欢迎的语言可以使恶意软件更难以识别,例如执行的功能的复杂性、间接调用和跳转的数量以及生成的线程数量。
“恶意软件主要由C/C++编写,并使用微软的编译器,”作者总结道,“然而……我们的工作实际上表明,通过将代码库转移到另一种不太使用的编程语言或编译器上,恶意软件作者可以显著降低其二进制文件的检测率,但同时增加恶意软件分析师的逆向工程努力。”因此,作者认为,较少使用的编程语言中的代码应当在安全社区中获得更多重视,并且需要更多相关的检测工具。
(以上内容均由Ai生成)