Các lỗ hổng nghiêm trọng trong OpenVPN có nguy cơ dẫn đến RCE và LPE

Các lỗ hổng nghiêm trọng trong OpenVPN có nguy cơ dẫn đến RCE và LPE

Các nhà nghiên cứu bảo mật của Microsoft gần đây đã xác định được nhiều lỗ hổng có mức độ nghiêm trọng Medium trong OpenVPN, một công cụ được tích hợp vào hàng triệu router, phần cứng, PC, điện thoại trên toàn thế giới. Kẻ tấn công có thể khai thác hàng loạt lỗ hổng để tạo thành attack chain nhằm thực hiện Remote Code Execution (RCE) và Local Privilege Escalation (LPE).

1. OpenVPN là sản phẩm gì?

OpenVPN là một hệ thống mạng riêng ảo (VPN) tạo ra kết nối point-to-point hoặc site-to-site riêng tư và an toàn trên Internet. OpenVPN là một dự án open-source, được sử dụng phổ biến rộng rãi trên toàn thế giới, bao gồm Mỹ, Ấn Độ, Pháp, Brazil, Vương quốc Anh, Đức,.... Dự án này hỗ trợ nhiều nền tảng khác nhau và được tích hợp vào hàng triệu thiết bị trên toàn cầu.

OpenVPN cũng chính là tên của giao thức tunnel mà nó sử dụng, chính là Secure Socket Layer (SSL) để đảm bảo rằng dữ liệu được chia sẻ qua internet vẫn ở chế độ riêng tư, sử dụng mã hóa AES-256. Vì sản phẩm là mã nguồn mở nên các lỗ hổng có thể dễ dàng được xác định và sửa chữa.

2. Phân tích các lỗ hổng trong OpenVPN

CVE-2024-1305

Các nhà nghiên cứu bảo mật đã xác định được một lỗ hổng trong dự án tap-windows6 liên quan đến việc phát triển Terminal Access Point (TAP) mà OpenVPN sử dụng. Trong thư mục /src của dự án, tệp device.c chứa code của thiết bị TAP và hướng dẫn khởi chạy thiết bị đó.

Trong tệp device.c, phương thức CreateTapDevice khởi tạo một dispatch table với câu lệnh callbacks cho các phương thức quản lý Input/Output Controls (IOCTLs) cho thiết bị. Một trong những phương pháp này là TapDeviceWrite, xử lý việc ghi IOCTL.

Screenshot of code depicting where the wild kernel overflow vulnerability is located

Phương thức TapDeviceWrite thực hiện một số thao tác và cuối cùng gọi TapSharedSendPacket. Sau đó phương thức này lần lượt gọi NdisAllocateNetBufferAndNetBufferLists hai lần. Trong một trường hợp, nó gọi hàm này với tham số fullLength, được định nghĩa như sau:

Screenshot of code depicting the integer overflow

Cả PacketLengthPrefixLength đều là các tham số được truyền từ hàm TapDeviceWrite và đều có thể bị kẻ tấn công chỉnh sửa. Nếu các giá trị này đủ lớn, tổng của chúng (fullLength) có thể bị tràn (32-bit unsigned integer). Điều này dẫn đến việc lỗi phân bổ kích thước bộ nhớ, gây ra sự cố memory overflow.

CVE-2024-27459

Lỗ hổng thứ hai được phát hiện nằm trong cơ chế giao tiếp giữa tiến trình openvpn.exe và dịch vụ openvpnserv.exe. Cả hai đều giao tiếp thông qua pipe có tên:

Screenshot of code depicting the size being read from a named pipe

Dịch vụ openvpnserv.exe sẽ đọc message size trong một vòng lặp vô hạn từ tiến trình openvpn.exe và sau đó xử lý message nhận được bằng cách gọi phương thức HandleMessage. Phương thức HandleMessage đọc và phân loại các byte đã đọc thành các mục tương ứng:

Screenshot of code depicting the stack overflow vulnerability location

Cơ chế giao tiếp này gây ra sự cố stack overflow khi chuyển số byte mà người dùng cung cấp thành cấu trúc “n bytes” ở trên stack.

CVE-2024-24974

Lỗ hổng thứ ba liên quan đến việc unprivileged access vào tài nguyên hệ thống. Dịch vụ openvpnserv.exe tạo ra một tiến trình openvpn.exe mới dựa trên các yêu cầu của người dùng thông qua đường dẫn có tên \openvpn\service. Lỗ hổng này cho phép truy cập từ xa vào đường dẫn trên, cho phép kẻ tấn công tương tác và khởi chạy các hoạt động trên đó.

CVE-2024-27903

Lỗ hổng cuối cùng mà các nhà nghiên xác định được trong lần hunting này là trong cơ chế plugin của OpenVPN. Lỗ hổng này cho phép tải plugin từ nhiều đường dẫn khác nhau trên endpoint. Hành vi này có thể bị kẻ tấn công khai thác để tải các plugin có hại từ các đường dẫn này.

3. Xâu chuỗi và khai thác các lỗ hổng

Tất cả các lỗ hổng trên có thể bị khai thác chỉ khi kẻ tấn công giành được quyền truy cập vào tài khoản OpenVPN của người dùng.

Điều này có thể thực hiện được bằng cách sử dụng kỹ thuật đánh cắp thông tin xác thực, chẳng hạn như mua thông tin bị đánh cắp trên dark web, sử dụng phần mềm độc hại để đánh cắp thông tin hoặc đánh sniffing network traffic để nắm bắt NTLMv2 hash và sau đó sử dụng các công cụ bẻ khóa như HashCat hoặc John the Ripper để giải mã chúng.

Sau đó, các lỗ hổng có thể được kết hợp với nhau để tạo thành một attack chain được phân tích như bên dưới đây:

Khai thác RCE

Đầu tiên, kẻ tấn công có thể khai thác Remote Code Execution (RCE) bằng cách sử dụng CVE-2024-24974CVE-2024-27903.

  1. Để khai thác thành công các lỗ hổng này và thực hiện RCE, kẻ tấn công trước tiên phải có được thông tin đăng nhập của một người dùng OpenVPN. Thiết bị của kẻ tấn công sau đó cần khởi chạy lệnh NET USE với thông tin đăng nhập của nạn nhân để truy cập từ xa vào tài nguyên hệ thống và cho phép kẻ tấn công truy cập vào các đối tượng named pipe.

  2. Tiếp theo, kẻ tấn công có thể gửi một request "connect" tới named pipe \openvpn\service để khởi chạy một phiên bản mới của openvpn.exe thay cho kẻ tấn công.

    Screenshot of code depicting the initialization of OpenVPN from a remote location

  3. Trong request đó, đường dẫn đến một tệp cấu hình (ví dụ \DESKTOP-4P6938I\share\OpenVPN\config\sample.ovpn) được chỉ định nằm trên thiết bị do kẻ tấn công kiểm soát. Một đường dẫn ghi log cũng được cung cấp, nơi plugin đã tải sẽ ghi lại log của nó.

  4. Tệp cấu hình được cung cấp có hướng dẫn để tải plugin độc hại, ví dụ:

    Screenshot of code depicting the malicious plugin loading directive from a remote location

  5. Sau khi khai thác thành công, kẻ tấn công có thể đọc các log được ghi trên thiết bị do kẻ tấn công kiểm soát.

    Screenshot of the plugin log on the attacker-controlled device

Khai thác LPE

Tiếp theo, các nhà nghiên cứu điều tra cách kẻ tấn công khai thác local privilege execution (LPE) bằng cách sử dụng CVE-2024-27459CVE-2024-27903.

  1. Kẻ tấn công kết nối với thiết bị cục bộ thông qua một named pipe (ống dẫn được đặt tên) có tên \openvpn\service và gửi lệnh cho openvpnserv.exe để khởi động openvpn.exe với một file cấu hình độc hại được cung cấp bởi kẻ tấn công.

    Screenshot of code depicting initializing OpenVPN from a local configuration

  2. File cấu hình độc hại sẽ bao gồm dòng lệnh để tải plugin độc hại từ đường dẫn cục bộ, ví dụ như hình dưới đây:

    Screenshot of the malicious plugin loading directive from the local location

  3. Để plugin độc hại có thể giao tiếp thành công với openvpnserv.exe, kẻ tấn công cần chiếm quyền điều khiển handle mà openvpn.exe sử dụng để giao tiếp với named pipe kết nối giữa tiến trình openvpn.exe và dịch vụ openvpnserv.exe.

  4. Kẻ tấn công có thể thực hiện việc này bằng cách phân tích cú pháp các tham số dòng lệnh để lấy Thread ID (TID) của tiến trình openvpn.exe.

    Screenshot of code depicting parsing command line arguments to extract the thread ID

  5. Khi openvpn.exe khởi động, nó sẽ nhận TID như một tham số dòng lệnh, và nếu named pipe bên trong được tạo ra có tên là \openvpn\service_1234, thì openvpn.exe sẽ được khởi động với tham số bổ sung là 1234.

    Screenshot of code depicting the thread ID being passed as a command line argument

  6. Sau đó, kẻ tấn công có thể khai thác lỗ hổng stack overflow bằng cách gửi dữ liệu lớn hơn kích thước MSG structure. Mặc dù có các cơ chế bảo vệ như "stack canaries", nhưng việc khai thác vẫn có thể thực hiện được.

    Screenshot of code depicting the stack overflow being triggered

  7. Sau khi openvpnserv.exe bị crash, kẻ tấn công có một khoảng thời gian ngắn để chiếm quyền điều khiển named pipe \openvpn\service.

  8. Nếu thành công, kẻ tấn công có thể mạo danh thành phía server của named pipe, và mọi kết nối tới named pipe sẽ trở thành kết nối với kẻ tấn công.

  9. Nếu một người dùng có quyền cao (như SYSTEM hoặc Administrator) kết nối với named pipe này, kẻ tấn công có thể mạo danh người dùng đó và bắt đầu tiến trình với quyền hạn cao, thành công đạt được LPE.

    Screenshot of code depicting impersonation of a privileged user

Xâu chuỗi các lỗ hổng

Kẻ tấn công có thể kết hợp ít nhất ba trong bốn lỗ hổng đã phát hiện để tạo ra một chuỗi tấn công mạnh mẽ, giúp thực hiện RCE và LPE. Sau khi đạt được LPE, kẻ tấn công có thể sử dụng các kỹ thuật khác như Bring Your Own Vulnerable Driver (BYOVD) để kiểm soát tốt hơn hệ thống, vô hiệu hóa các biện pháp bảo vệ và chỉnh sửa các quy trình trong hệ thống, từ đó củng cố quyền kiểm soát và tránh bị phát hiện.

4. Khuyến nghị

Phía FPT Threat Intelligence khuyến nghị tổ chức một số cách để phòng chống:

  • Cập nhật phần mềm: Lỗ hổng được tìm thấy trong OpenVPN phiên bản trước 2.5.10 và 2.6.10. Vậy nên cách tốt nhất để giảm thiểu rủi ro là cập nhật phần mềm lên phiên bản mới nhất.

  • Vô hiệu hoá OpenVPN tạm thời: Đảm bảo các máy OpenVPN client được ngắt kết nối Internet và các vùng mạng nội bộ.

  • Phân quyền người dùng: Giới hạn quyền truy cập vào máy OpenVPN client chỉ dành cho người dùng được ủy quyền.

5. Tham khảo

  1. Chained for attack: OpenVPN vulnerabilities discovered leading to RCE and LPE