Gói độc hại Python có tên là “onyxproxy”, 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 tại, “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 bị lạm dụng trong Python
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.
Sử dụng kết hợp các ký tự Unicode
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.
Số lượng biến thể cho số nhận dạng đã sử dụng
Hỗ trợ Unicode của Python có thể dễ dàng bị lạm dụng để che giấu các kết quả khớp chuỗi độc hại, làm cho mã có vẻ như bình thường nhưng lại đang thực hiện các hành vi nguy hiểm. Trong trường hợp này, việc đánh cắp dữ liệu nhạy cảm và mã thông báo xác thực từ các nhà phát triển.
Mặc dù phương pháp che giấu này không đặc biệt tinh vi, nhưng thật đáng lo ngại khi thấy nó được sử dụng trên thực tế và có thể là dấu hiệu của việc lạm dụng rộng rãi hơn Unicode để che giấu Python.
Trước đây, các rủi ro của Unicode trong Python cũng đã được thảo luận rộng rãi trong cộng đồng ngôn ngữ Python. Các nhà nghiên cứu cũng đã từng đưa ra cảnh báo rằng hỗ trợ Unicode trong Python sẽ khiến ngôn ngữ lập trình này dễ bị tấn công bởi một loại khai thác bảo mật mới, khiến các bản vá và mã được gửi trở nên khó kiểm tra hơn.
Vào tháng 11/2021, hai nhà nghiên cứu Nicholas Boucher và Ross Anderson tới từ Đại học Cambridge đã trình bày một kỹ thuật tấn công có tên gọi là "Trojan Source", trong đó sử dụng các ký tự điều khiển Unicode để đưa các lỗ hổng vào mã nguồn, đồng thời khiến người đánh giá khó phát hiện ra những hành vi xâm nhập độc hại đó.
Bên cạnh “onyxproxy”, công ty an ninh mạng PyUp của Canada cho biết họ đã phát hiện ra ba gói thư viện Python lừa đảo mới, bao gồm “aiotoolbox”, “asyncio-proxy” và “pycolorz”, đã được tải xuống hơn 1.000 lần và được thiết kế để truy xuất mã bị xáo trộn (obfuscated) từ một máy chủ từ xa.