特洛伊木馬原始碼攻擊會對開發人員不可見的程式碼進行更改

劍橋大學的研究人員發布了一種技術,可以將惡意程式碼悄悄插入經過同行評審的原始程式碼中。 準備好的攻擊方法(CVE-2021-42574)以“Trojan Source”的名稱出現,並且基於對於編譯器/解釋器和查看程式碼的人來說看起來不同的文字形式。 針對 C、C++(gcc 和 clang)、C#、JavaScript (Node.js)、Java (OpenJDK 16)、Rust、Go 和 Python 提供的各種編譯器和解釋器示範了此方法的範例。

此方法基於在程式碼註解中使用特殊 Unicode 字元來變更雙向文字的顯示順序。 借助此類控製字符,文字的某些部分可以從左到右顯示,而其他部分可以從右到左顯示。 在日常實踐中,此類控製字元可用於將希伯來語或阿拉伯語的程式碼行插入檔案中。 但是,如果使用指定的字元將具有不同文字方向的行合併到一行中,則從右到左顯示的文字段落可能會與從左到右顯示的現有常規文字重疊。

使用此方法,您可以在程式碼中添加惡意構造,然後透過在以下註釋中或從右到左顯示的文字字元中添加,使具有此構造的文字在查看程式碼時不可見,這將導致完全惡意插入時疊加了不同的字元。 此類代碼在語義上將保持正確,但將以不同的方式解釋和顯示。

特洛伊木馬原始碼攻擊會對開發人員不可見的程式碼進行更改

在審查程式碼時,開發人員將面臨字元的視覺順序,並且會在現代文字編輯器、Web 介面或 IDE 中看到無可疑的註釋,但編譯器和解釋器將使用字元的邏輯順序,並且將按原樣處理惡意插入,而不關注評論中的雙向文字。 該問題影響各種流行的程式碼編輯器(VS Code、Emacs、Atom)以及用於查看儲存庫中程式碼的介面(GitHub、Gitlab、BitBucket 和所有 Atlassian 產品)。

特洛伊木馬原始碼攻擊會對開發人員不可見的程式碼進行更改

利用該方法實現惡意操作的方式有多種:新增隱藏的「返回」表達式,導致函數提前完成; 註解掉通常作為有效構造可見的表達式(例如,停用重要檢查); 分配其他字串值導致字串驗證失敗。

例如,攻擊者可能會提出包含以下行的變更: if access_level != "user{U+202E} {U+2066}// Check if admin{U+2069} {U+2066}" {

會在審核介面顯示為 if access_level != “user” { // 檢查是否為 admin

此外,還提出了另一種攻擊變體(CVE-2021-42694),該變體與同形文字的使用相關,即外觀相似但含義不同且具有不同unicode 代碼的字符(例如,字符“ɑ”類似於「 a」、「ɡ」-「g」、「ɩ」-「l」)。 在某些語言中,函數和變數的名稱中可能會使用類似的字元來誤導開發人員。 例如,可以定義兩個具有無法區分的名稱的函數來執行不同的操作。 如果不進行詳細分析,無法立即明確在特定位置呼叫了這兩個函數中的哪一個。

特洛伊木馬原始碼攻擊會對開發人員不可見的程式碼進行更改

作為一項安全措施,如果註釋、字串文字或更改輸出方向的標識符中存在不成對的控製字元(U+202A、 U+202B、U+202C、U+202D、U+202E、U+2066 、U+2067、U+2068、U+2069、U+061C、U+200E 與U+200F)。 程式語言規格中也應明確禁止此類字符,並且在程式碼編輯器和儲存庫介面中應尊重此類字符。

附錄1:已為GCC、LLVM/Clang、Rust、Go、Python、binutils準備了漏洞修補程式。 GitHub、Bitbucket 和 Jira 也修復了這個問題。 GitLab 的修復正在進行中。 若要辨識有問題的程式碼,建議使用指令: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068u2069]

附錄 2:Plan 9 作業系統和 Go 程式語言的開發者之一 Russ Cox 批評對所描述的攻擊方法的過度關注,這些攻擊方法早已為人所知(Go、Rust、C++、Ruby)並且沒有被認真對待。 Cox表示,問題主要涉及程式碼編輯器和Web介面中資訊的正確顯示,這可以透過在審查時使用正確的工具和程式碼分析器來解決。 因此,與其關注推測性攻擊,不如將重點放在改進程式碼和依賴項審查流程上。

Ras Cox 也認為,編譯器不是解決問題的正確場所,因為透過在編譯器層級禁止危險符號,仍有大量工具可以接受這些符號的使用,例如建置系統、彙編器、套件管理器和各種配置解析器和數據。 作為範例,給出了 Rust 項目,該項目禁止在編譯器中處理 LTR/RTL 程式碼,但沒有對 Cargo 套件管理器添加修復,從而允許透過 Cargo.toml 檔案進行類似的攻擊。 同樣,BUILD.bazel、CMakefile、Cargo.toml、Dockerfile、GNUmakefile、Makefile、go.mod、package.json、pom.xml 和requirements.txt 等檔案也可能成為攻擊來源。

來源: opennet.ru

添加評論