轻松应对木马源攻击的三种方法
尽管木马源攻击的通用漏洞评分高达9.8,但企业完全没必要惊慌失措。
剑桥大学研究人员发现的木马源(Trojan Source)攻击会诱使编译器读取隐藏的Unicode字符,并生成带有开发人员或安全分析师不知道的额外指令和后门的二进制文件。由于默认情况下特殊字符不可见,因此在代码审查期间难以发现恶意代码。
利用Unicode显示文本方式的攻击并不新鲜,但“木马源”更具威胁的原因是从公共站点(例如StackOverflow、GitHub和其他社区论坛)复制和粘贴的大量代码会直接进入源代码文件。如果有问题的Unicode字符隐藏在文件中,这些字符也会被复制进来。
nVisium高级应用程序顾问Jon Gaines表示:“这对源代码审查的能力是一次考验,当下建议暂时不要复制和粘贴代码,最好是自己重写一遍。”
方法一:“显影”Unicode字符
开发人员可以通过启用他们正在使用的IDE或文本编辑器来显示Unicode字符,从而检测潜在的恶意Unicode字符。或者可以使用命令行十六进制编辑器,例如HexEd.It,在文件中搜索特定的Unicode字符。
一些主要的源代码控制平台已经做出回应:GitHub、GitLab和Atlassian(用于 BitBucket)已经发布了针对Unicode BiDi字符的警报(CVE-2021-42574)。
对于容易遭受木马源攻击的文本编辑器Visual Studio Code ,一种可行的方法是将编码转换为非unicode。JFrog安全研究高级主管Shachar Menashe表示,这会将恶意的Unicode字符(对于BiDi字符)标记为损坏字符,在手动代码审查期间可以发现这些损坏的字符。
这是在Visual Studio Code中进行转换后 Unicode BiDi 的样子:
有些同形文字很难与合法字符区分开来。这是在Visual Studio Code中进行转换后这些字符的显示方式:
Visual Studio、Notepad++和Sublime Text实际上不受BiDi字符的影响,因为该行要么被破坏,要么整行显示为注释:
方法二:过滤字符
Menashe认为木马源攻击方法的威胁“在现实世界中影响有限”,因为常规源代码通常不包含研究人员列举的特殊Unicode字符(BiDi和同形文字)。它们“很容易被检测到、发出警报,甚至可能会自动过滤掉”。
下面的Linux命令可以警告或删除单个源代码文件中的所有Unicode字符:
- Alert:iconv-f utf-8 -t ascii input.cpp
- Strip:iconv-c -f utf-8-t ascii input.cpp-o filtered_output.cpp
或者,此Linux命令将检查文件列表并标记找到特殊字符的实例:
- for file in filelist;do hexdump-C “$file”|grep RTLcharacters;done
以下命令不仅可以发出警报,还可以仅从单个代码文件中删除木马源攻击针对的特定字符。
例如以下这两个Linux命令去除了Unicode BiDi字符CVE-2021-42574):
- CHARS=$(python-c’print u”\u202A\u202B\u202D\u202E\u2066\u2067\u2068\u202C\u2069″.encode(“utf8”)’)
- sed’s/[‘”$CHARS”‘]//g'<input.cpp>filtered_output.cpp
对于Unicode Homoglyph字符(CVE-2021-42694),这两个命令生成了仅用于剥离西里尔字母同形文字的部分列表:
- CHARS=$(python-c’print u”\u0405\u0406\u0408\u0410\u0412\u0415\u0417\u041D\u0420\u0421\u0422\u0425\u0430\u0440\u0441\u0443\u0445\u0455\u04AE\u04BB\u04C0″.encode(“utf8”)’)
- lsed ‘s/[‘”$CHARS”‘]//g'< /tmp/utf8_input.txt>/tmp/ascii_output.txt
方法三:更新工具
为编译器安装更新,这样可阻止木马源攻击。在应用得到更新前,自动检测和清理文件的命令也可以缓解这些问题。虽然可以在更改文本编辑器设置后执行手动源代码审核以查找这些特殊字符,但这将是“处理此问题的最糟糕方法”,Menashe指出,因为某些字符在某些情况下来自合法的拉丁字符。
“最好的解决方案是运行自动化工具来标记和/或删除这些字符,”Menashe说道。
在拥有大型代码库的组织中,对文件的单独审计很难大面积开展。Red Hat发布了一个简单的Python脚本(https://access.redhat.com/security/vulnerabilities/RHSB-2021-007#diagnostic-tools:)来识别整个代码库中的潜在问题。该脚本可以集成到持续集成/持续交付工作流中,或者作为预提交检查添加,以确保恶意代码不会进入生产环境。
Rapid7的首席安全数据科学家Bob Rudis还推荐了一个简单的缓解措施:“如果你只用英语或只用阿拉伯语编写代码,则可禁止在代码库中使用BiDi指令”。
尽管木马源攻击的通用漏洞评分高达9.8,但企业没必要惊慌失措。Rudis认为9.8分显然是“夸大了”,因为实施木马源攻击需要攻击者直接访问开发人员的工作站、源代码管理系统或持续集成管道。
“如果攻击者可以直接访问你的源代码管理系统,坦率地说,你可能会遇到比这次攻击更大的问题。”Rudis说:“我们建议在担心需要本地或物理访问的源代码级攻击之前,优先考虑真正关键的补丁并防止服务和系统暴露。”