การใช้อักขระ Unicode ที่มองไม่เห็นเพื่อซ่อนการกระทำในโค้ด JavaScript

ตามวิธีการโจมตี Trojan Source ซึ่งใช้อักขระ Unicode ที่เปลี่ยนลำดับการแสดงข้อความแบบสองทิศทาง มีการเผยแพร่เทคนิคอื่นสำหรับการแนะนำการดำเนินการที่ซ่อนอยู่ ซึ่งใช้ได้กับโค้ด JavaScript วิธีการใหม่นี้ขึ้นอยู่กับการใช้อักขระยูนิโค้ด “ㅤ” (รหัส 0x3164, “HANGUL FILLER”) ซึ่งอยู่ในหมวดหมู่ของตัวอักษร แต่ไม่มีเนื้อหาที่มองเห็นได้ หมวดหมู่ Unicode ที่มีอักขระนี้ได้รับอนุญาตตั้งแต่ข้อกำหนด ECMAScript 2015 สำหรับใช้ในชื่อตัวแปร 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 จะเป็นจริงเสมอ เนื่องจากไม่ได้ตรวจสอบความแตกต่าง แต่กำหนดค่าของ ENV_PROD ให้กับตัวแปร “environmentǃ” อักขระ Unicode อื่นๆ ที่ทำให้เข้าใจผิด ได้แก่ "/", "−", "+", "⩵", "❨", "⫽", "꓿" และ "∗"

ที่มา: opennet.ru

เพิ่มความคิดเห็น