輕松應對木馬源攻擊的三種方法
盡管木馬源攻擊的通用漏洞評分高達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說:“我們建議在擔心需要本地或物理訪問的源代碼級攻擊之前,優先考慮真正關鍵的補丁并防止服務和系統暴露。”