Gần đây, nhóm chuyên gia VreT của công ty VSEC tại Việt Nam đã phát hiện ra một lỗ hổng trên bộ đệm (Buffer overlow) trên dòng thiết bị GPON Router cài hệ điều hành Linux nhân 2.6+. Lỗ hổng này cho phép thực thi mã lệnh từ xa và chiếm toàn quyền điều khiển thiết bị.
Hiện nay, thế giới và Việt Nam đang bước vào cuộc cách mạng 4.0, với hệ thống thiết bị IoT được phát triển mạnh mẽ. Việc đảm bảo an toàn thông tin cho thiết bị IoT và các hệ thống nhúng trở nên rất quan trọng. Một trong những thiết bị được sử dụng phổ biến để kết nối người dùng và Internet là modem. Tại Việt Nam, thiết bị modem thường được cung cấp và quản lý bởi các nhà cung cấp dịch vụ Internet (Internet Service Provider – ISP).
Lỗ hổng Buffer overflow
Buffer overflow là một lỗ hổng phổ biến trong khai thác lỗ hổng phần mềm trên máy tính. Lỗ hổng này xuất hiện khi lập trình viên máy tính không kiểm soát được kích thước của dữ liệu được ghi vào bộ nhớ đã được cấp phát, dẫn đến việc có thể bị lợi dụng để ghi đè dữ liệu sang một vùng nhớ khác, thay đổi dữ liệu một cách không mong muốn, hoặc thay đổi luồng thực thi của chương trình.
Với các modem dòng GPON Router, lỗ hổng bảo mật Buffer overflow có thể bị khai thác qua trình duyệt WebMgr - trình quản lý web portal của modem, xuất hiện trong portal_form của thiết bị, do lệnh sao chép dữ liệu tại đoạn mã: strcpy (&action_buffer, action_type) mà không kiểm tra độ dài của dữ liệu được gửi lên (POST).
Lỗ hổng bảo mật Buffer overflow được kích hoạt bởi yêu cầu kết nối từ người khai thác gửi lên thiết bị qua giao diện web như sau:
Dưới đây là mã poseudo-code của hàm xử lý portal_Form:
Hàm xử lý portal_Form hoạt động như sau:
1. Xử lý request được gửi lên bởi client, lấy giá trị của actiontype trong nội dung của request;
2. copy giá trị của actiontype sang một buffer thuộc khu vực .data (địa chỉ của buffer là 0x356e4);
3. Nếu giá trị của actiontype là “ping” hoặc “traceroute” và trạng thái của WAN là 1, thì gọi hàm diag_check. Ngược lại, sẽ trả về trạng thái “WAN NOT UP” hoặc một thông báo lỗi cho phía client;
4. Hàm diag_check nếu được gọi, sẽ thực hiện công việc ping hoặc traceroute bởi lệnh system();
5. Kết thúc, hàm xử lý portal_Form sẽ trả về kết quả của diag_check .
Lỗ hổng Buffer overflow xuất hiện do việc copy giá trị của actiontype mà không kiểm tra độ dài. Việc này dẫn tới một số giá trị có thể bị ghi đè và cho phép thực thi mã lệnh từ xa (remote code execution) trên thiết bị.
Nội dung của actiontype sẽ được sao chép vào vùng nhớ 0x356e4 bởi strcpy:
Dữ liệu được ghi đè sang các vùng nhớ khác, ta có thể thấy vùng nhớ 0x3577c đã bị ghi đè bởi chuỗi `cat /etc/passwd > /tmp/pwn`(vùng khoanh đỏ hình bên dưới).
Có thể nhận thấy hàm
diag_check thực hiện lệnh
system() với tham số truyền vào chính là ô nhớ có địa chỉ 0x3577c trong mã poseudo-code của hàm
diag_check dưới đây.
Với việc ghi đè vùng nhớ 0x3577c, có thể thực hiện lệnh qua lời gọi hàm hệ thống bởi modem và thực hiện lệnh trên modem với quyền cao nhất. Nhưng do chương trình kiểm tra giá trị của biến wan_state, nên cần phải thực hiện một số kỹ thuật để có thể khai thác và thực hiện thành công lệnh trên modem.
Thực thi lệnh từ xa qua khai thác lỗ hổng bảo mật Buffer overflow
Với lỗ hổng buffer overflow ở trên, vùng nhớ 0x3755c có thể ghi đè thành câu lệnh “cat /etc/passwd > /tmp/pwn” với request sau:
Nhưng với request trên thì giá trị của wan_state (nằm tại ô nhớ 0x35768) cũng bị ghi đè thành “AAAA”, dẫn tới lệnh không được thực thi bởi hàm system() trong hàm diag_check.
Để có thể thực hiện lệnh, ta cần thiết lập giá trị (layout) của bộ nhớ như sau:
Việc đòi hỏi giá trị wan_state = 0x00000001 sẽ tạo ra null-byte trong quá trình copy dữ liệu sử dụng hàm strcpy. Dựa trên đặc điểm static của vùng nhớ .DATA mà có thể sử dụng thủ thuật dưới đây để có thể cài đặt layout của bộ nhớ và thực hiện lệnh.
Ta gửi liên tục 4 request như sau:
Kết nối thứ 1: Thiết lập bộ nhớ và cài đặt lệnh cần thực thi:
Lúc này, giá trị của 0x3577c đã chứa nội dung lệnh cần thực hiện.
Kết nối thứ 2:
Ghi đè byte thứ 4 của ô nhớ 0x35768 về 0x00. Nội dung ô nhớ 0x35768 có giá trị 0x696969
Kết nối thứ 3:
Tiếp tục ghi đè byte thứ 3 về 0x00 với nội dung của request
với
Giá trị của wan_state = 0x6969
Kết nối thứ 4:
Kết nối cuối cùng hoàn tất việc ghi đè 2 byte đầu tiên của wan_state thành 0x0001
Với request thứ 4, ta đã có thể đặt nội dung của wan_state ở địa chỉ 0x35768 về 0x00000001. Và lệnh đã được thực hiện sau khi kết thúc kết nối thứ 4, nội dung của tệp tin /etc/passwd đã được đọc và ghi ra tệp tin /tmp/pwn.
Minh họa kẻ tấn công thực hiện khai thác lỗ hổng:
Nội dung tệp tin /tmp/pwn trên modem:
Như vậy, sau 4 kết nối đơn giản, modem đã thực hiện lệnh ‘
cat/etc/passwd>/tmp/pwn’ của người khai thác. Việc tấn công lên thiết bị này cho phép kẻ tấn công chiếm quyền điều khiển modem, từ đó mở rộng tấn công sang các thiết bị khác trong mạng.
Một số khuyến cáo của nhóm VreT, VSEC
Đối với người dùng: Hiện tại, người dùng cuối chưa có giải pháp triệt để có thể phòng tránh đối với việc khai thác tấn công lỗ hổng này. Giải pháp an toàn là hạn chế việc sử dụng mạng LAN đối với những người không đáng tin cậy và chờ đợi bản vá, cũng như cập nhật của ISP.
Đối với ISP: Thực hiện vá ngay lỗ hổng Buffer overflow bằng cách kiểm tra độ dài của dữ liệu được gửi lên hoặc sử dụng một hàm sao chép dữ liệu an toàn như: memcpy, strncpy; Tự động cập nhật thiết bị hoặc thông báo tới người dùng.