Lỗ hổng chèn lệnh BatBadBut ảnh hưởng đến nhiều ngôn ngữ lập trình
Lỗ hổng này có tên gọi là BatBadBut, được GitHub gắn mã định danh là CVE-2024-24576 (điểm CVSS 10.0), cho thấy mức độ nghiêm trọng tối đa. Nhà nghiên cứu bảo mật RyotaK tới từ công ty an ninh mạng Flatt Security (Nhật Bản) là người đã phát hiện và báo cáo lỗ hổng này cho Trung tâm Điều phối CERT (CERT/CC).
Lỗ hổng tồn tại do hệ điều hành Windows tạo ra tiến trình cmd[.]exe khi thực thi các tệp batch có chức năng “CreatProcess” và các ngôn ngữ lập trình không thoát khỏi (escape) các đối số một cách chính xác khi gọi các tệp batch (với phần mở rộng bat và cmd) trên Windows bằng lệnh API.
Hầu hết các ngôn ngữ lập trình đều bao bọc chức năng CreatProcess để cung cấp giao diện thân thiện hơn với người dùng. Trên Windows, CreatProcess() ngầm tạo ra tiến trình cmd[.]exe khi thực thi các tệp batch, ngay cả khi ứng dụng không chỉ định chúng trong dòng lệnh.
Vấn đề là cmd[.]exe có các quy tắc phân tích cú pháp phức tạp cho các đối số dòng lệnh và thời gian chạy (runtime) ngôn ngữ lập trình không thể thoát khỏi các đối số lệnh một cách chính xác.
Khai thác lỗ hổng này, kẻ tấn công có thể kiểm soát phần đối số lệnh của tệp batch để từ đó chèn lệnh vào các ứng dụng Windows. Tuy nhiên, theo nhà nghiên cứu bảo mật RyotaK, việc khai thác thành công lỗ hổng BatBadBut chỉ xảy ra khi đáp ứng các điều kiện sau:
- Ứng dụng cần thực thi một lệnh trên Windows.
- Ứng dụng không được chỉ định phần mở rộng của tệp lệnh hoặc phần mở rộng tệp là .bat hoặc .cmd.
- Lệnh đang được thực thi có đầu vào (input) do người dùng kiểm soát.
- Thời gian chạy của ngôn ngữ lập trình không thể thoát khỏi các đối số dòng lệnh với tiến trình cmd[.]exe một cách chính xác.
RyotaK lưu ý rằng hầu hết các ứng dụng không bị ảnh hưởng bởi lỗ hổng này và có một số biện pháp giảm thiểu. Hơn nữa, một số ngôn ngữ lập trình được thông báo về lỗ hổng đã thực hiện các bước để giải quyết nó, chẳng hạn như thêm một cơ chế escape khác cho các tệp batch.
“Để ngăn chặn việc thực thi các tệp batch không mong muốn, người dùng nên cân nhắc việc di chuyển các tệp batch sang một thư mục không có trong biến môi trường PATH. Trong trường hợp này, các tệp batch sẽ không được thực thi trừ khi đường dẫn đầy đủ được chỉ định, do đó có thể ngăn chặn việc thực thi các tệp không mong muốn”, RyotaK khuyến nghị.
Cho đến nay, thư viện Haskell, Rust, Node.js, PHP và yt-dlp được biết là bị ảnh hưởng bởi lỗ hổng BatBadBut. Nhưng thực tế là không phải mọi ngôn ngữ lập trình đều giải quyết được vấn đề, hiện mới chỉ có Haskell, Rust và yt-dlp đã công bố các bản vá cập nhật, do đó các nhà phát triển được khuyến nghị nên thận trọng khi thực hiện các thao tác lệnh trên Windows.
Hải Yến
(Tổng hợp)