Phát hiện gói thư viện độc hại đánh cắp thông tin Python

14:55, 31/03/2023

Các nhà nghiên cứu tại công ty bảo mật Phylum mới đây đã phát hiện một gói thư viện Python độc hại trong kho lưu trữ PyPI (Python Package Index - Chỉ mục gói Python), sử dụng Unicode như một kỹ thuật che giấu để tránh bị phát hiện đánh cắp thông tin đăng nhập từ các thiết bị bị xâm nhập.

Gói độc hại Python có tên là “onyxproxy”, đây là một trình đánh cắp thông tin nhắm mục tiêu thông tin đăng nhập của các nhà phát triển và mã thông báo xác thực, phần mềm độc hại này sử dụng kết hợp các phông chữ Unicode khác nhau (bao gồm các phông chữ đậm và nghiêng) trong mã nguồn để giúp nó vượt qua quá trình quét và bảo mật tự động xác định các chức năng độc hại tiềm ẩn dựa trên kết hợp chuỗi.

Hiện “onyxproxy” không còn khả dụng trên PyPI và đã bị xóa khỏi nền tảng này. Tuy nhiên, kể từ khi được tải lên PyPI vào ngày 15/3, gói độc hại đã có 183 lượt tải xuống, điều này đồng nghĩa có tới 183 nhà phát triển khác nhau có nguy cơ bị đánh cắp thông tin xác thực và danh tính.

Unicode là tiêu chuẩn mã hóa toàn cầu được sử dụng cho nhiều ngôn ngữ và chữ viết khác nhau, bao gồm hơn 100.000 ký tự. Với Unicode, mọi chữ cái, chữ số và ký hiệu đều có một giá trị số duy nhất không thay đổi, bất kể chương trình hoặc nền tảng đang được sử dụng. Phần mềm độc hại chứa gói "setup.py" với hàng nghìn chuỗi mã đáng ngờ sử dụng kết hợp các ký tự Unicode.

Phát hiện gói thư viện độc hại đánh cắp thông tin Python.

Mặc dù văn bản trong các chuỗi này, bên cạnh các phông chữ khác nhau, trông gần như không có vấn đề gì, nhưng nó tạo ra sự khác biệt lớn đối với trình thông dịch Python sẽ phân tích cú pháp và nhận ra các ký tự này về cơ bản là khác nhau.

Điều này có thể thực hiện được nhờ vào việc sử dụng các biến thể Unicode trông như cùng một ký tự để ngụy trang cho màu sắc thật của nó (ví dụ: self so với 𝘀𝘦𝘭𝘧) giữa các hàm và biến. Phylum giải thích rằng Unicode có 5 biến thể cho chữ “n” và 19 biến thể cho chữ “s” để sử dụng trong các ngôn ngữ, toán học khác nhau. Ví dụ: định danh "self" có 122.740 (19x19x20x17) cách để được biểu diễn bằng Unicode.

Việc Python hỗ trợ sử dụng các ký tự Unicode cho các mã định danh, tức là các biến mã, hàm, lớp, mô-đun và các đối tượng khác, cho phép các lập trình viên tạo các mã định danh trông giống hệt nhau nhưng trỏ đến các hàm khác nhau.

Trong trường hợp của “onyxproxy”, các tác giả đã sử dụng các mã định danh “__import__”, “sub process” và “CryptUnprotectData” với nhiều biến thể, khiến chúng trở nên dễ dàng để vượt qua các biện pháp phòng thủ dựa trên khớp chuỗi.