不常见编程语言成攻击利器

编程语言安全
2年前

src1.png

  BlackBerry研究人员报告称,不常见编程语言,比如Go、Rust、Nim和DLang,逐渐成为恶意软件作者的心头好,被用于绕过安全防御措施或解决恶意软件开发过程中的薄弱环节。

  注意到使用上述四种编程语言的恶意软件家族数量越来越多之后,BlackBerry研究团队选择了这四种编程语言,深入研究其被用于恶意目的的情况。攻击者使用新的编程语言并不鲜见;但研究人员注意到,这些语言越来越成熟,预期会随着这一趋势的延续而使用量增加。

  采用新编程语言的原因多种多样:可以解决现有编程语言中的缺陷、语法更简单、更高效的内存管理,或者编程效率更高等等。研究人员指出,新语言可能也更适合其环境,比如物联网设备就使用低级语言。

  当攻击者开始寻求这些优势,防御者就面临挑战了。恶意软件分析工具并不总是支持不怎么为人所知的语言,而且,与C或C++等经典编程语言相比,用Go、Rust、Nim和DLang语言编写的二进制文件经混淆后会显得更加复杂。分析师可能不熟悉更新一些的语言,了解其复杂性需要一定的学习时间。

  研究人员指出,当下出现了一种新的趋势:攻击者采用以相对较不常见的语言编写的投放器或加载器,翻新此前用C++和C#等传统编程语言编写的“老”恶意软件。老恶意软件通常在第一阶段以加密形式存储,采用XOR、RC4、AES或其他加密和编码方法。

  一旦解密,二进制文件就被释放到磁盘上,或者注入到进程中载入内存。研究人员称,这种方法很受攻击者欢迎,因为可以免去重编程恶意软件的麻烦,可以用这些投送方法之一“包装”老恶意软件。

  使用著名恶意软件的释放器或加载器,或许可以在释放到磁盘或加载进内存时被基于特征码的安全工具捕获;但用另一种语言重新编写恶意软件就可以赋予恶意软件绕过防御机制的潜力,因为现有特征码不会有效。

  BlackBerry注意到,虽然一些著名的恶意软件是用Go、Rush、Nim和DLang编写的,但数量并不多,而且大多数都是用Go编写的。这些相对不常见的语言每一种都能给其开发商带来各种优势。

  Go语言是谷歌在2007年开发的,属于C语言家族,但语法更为简单。该语言课交叉编译到所有主流操作系统,以及Android、JavaScript和WebAssembly。Nim可以编译进多种语言,比如C、C++和JavaScript。DLang改进了C语言的语法,可以交叉编译,而且学起来比较容易。Rust开销低、性能高,可以帮助开发人员避开其他流行编程语言中的“痛点”。

魔高一尺道高一丈

  正如研究人员指出的,采用不常见编程语言的不单单是恶意软件作者,近年来安全社区也采用这些语言编写攻击性红队工具实现,其中很多工具都是开源或公开可用的。

  报告提到去年安全公司FireEye遭遇的数据泄露事件,这起事件中民族国家的攻击者盗走了FireEye公司的红队工具。FireEye发布了一份声明,并在GitHub放上了用于识别被盗工具的检测特征码。其GitHub存储库揭示FireEye红队一直在组合使用公开可用工具和内部构建的工具,这些工具以多种不同语言编写而成,包括Go、DLang和Rust。

  例如,Go语言是Blackberry名单上最年轻的语言,但广为红队采用,很多攻击性安全工具都用Go重写或专门为Go打造。FireEye的红队工具揭示其创建了一个多平台Go语言远程访问木马(RAT)。Bishop Fox的对手模拟工具Silver也用了Go语言。为实现原生跨平台,流行命令与控制框架Merlin完全用Go编写。

  研究人员发现,如果能得到几大安全公司点赞,编程语言或技术就可能成为主流。他们还指出,分析工具和技术通常并不由安全公司开发,除非使用新语言编写的恶意软件达到一定程度的饱和。

  相比更为普及和成熟的编程语言,用这些不太为人所知的语言编写的恶意软件,其检出率没那么高。目前,攻击者正在改进第一阶段的感染过程而非其攻击活动的核心部分,但安全团队需要讨论不常见编程语言的风险和对防御的影响。



参考阅读

【调查】编程语言安全漏洞一览

代码安全:从响应式安全转向主动式安全

过时开源代码带来巨大安全隐患 企业需要软件物料清单