Kỹ thuật Userland Execution: Bypass 'noexec' để thực thi mã lén lút trên Linux
Một bộ công cụ mới mang tên "userland-exec" đã chứng minh khả năng chạy các tệp nhị phân ELF tùy ý trên hệ thống Linux được gia cố với các tùy chọn mount noexec, mà không cần gọi hệ thống execve. Kỹ thuật này hoạt động hoàn toàn trong không gian người dùng, giúp kẻ tấn công lách qua các cơ chế bảo mật như SELinux hay AppArmor.

Kỹ thuật Userland Execution: Bypass 'noexec' để thực thi mã lén lút trên Linux
Các quản trị viên hệ thống thường tự tin rằng họ đã bảo mật tốt máy chủ Linux khi áp dụng các biện pháp như gắn kết (mount) thư mục tạm với các tùy chọn noexec, nosuid, nodev, kết hợp với SELinux hoặc AppArmor ở chế độ thực thi nghiêm ngặt. Tuy nhiên, một bản chứng minh khái niệm (PoC) mới mang tên userland-exec vừa được công bố đã chứng minh rằng những biện pháp này có thể bị vượt qua một cách dễ dàng.
Bài viết này sẽ đi sâu vào cách thức kỹ thuật này cho phép thực thi mã từ xa (RCE) một cách lén lút mà không hề kích hoạt syscall execve(2) của nhân Linux.
Mô hình đe dọa thực tế
Triết lý "phòng thủ theo chiều sâu" (defense in depth) thường chỉ là tiếp thị cho đến khi bạn thực sự kiểm tra nó dưới góc độ của một kẻ tấn công. Quy trình tấn công điển hình diễn ra như sau:
- Kẻ tấn công khai thác lỗ hổng (stack smash, format string, use-after-free...).
- Mục tiêu là một hộp Linux được gia cố với SELinux/AppArmor và
/tmpđược mount vớinoexec. - Quy trình bị xâm chiếm, dẫn đến thực thi mã tùy ý.
- Userland-Exec tiếp quản: Thay vì gọi
execve, công cụ sẽ phân tích ELF trong không gian người dùng, sử dụngmmap/memfd_createđể ánh xạ bộ nhớ và nhảy trực tiếp đến điểm nhập của chương trình.
Kết quả là RCE (thực thi mã từ xa) đạt được một cách kín đáo, giữ nguyên tên và ngữ cảnh của quy trình gốc mà không để lại dấu vết audit nào về việc thực thi tệp mới.
Demo kỹ thuật Userland Exec
Userland Exec hoạt động như thế nào?
Thay vì giao quyền kiểm soát cho nhân thông qua execve, hàm userland_execv() thực hiện việc này theo kiểu "cypherpunk" hoàn toàn trong không gian người dùng:
- Phân tích và nạp ELF: Đi qua thủ công các header chương trình (PT_LOAD) của tệp nhị phân mục tiêu mà không cần sự hỗ trợ của libc.
- Ánh xạ bộ nhớ: Sử dụng
mmap()hoặc kết hợpmemfd_create+mmapđể đưa từng đoạn mã vào không gian địa chỉ của quy trình hiện tại. - Xử lý liên kết động: Xử lý các địa chỉ tái định vị (relocations) nếu payload cần thiết.
- Chuyển quyền điều khiển: Thực hiện một lệnh nhảy (jmp) trực tiếp đến điểm nhập (entry point) của ELF mới.
Điều này có nghĩa là hình ảnh quy trình được thay thế ngay tại chỗ. Các công cụ như ps, top hay /proc/<pid>/comm vẫn hiển thị tên tệp nhị phân gốc. Không có quy trình mới được tạo ra và không có đường dẫn thực thi nào đi qua nhân.
Bản demo RCE thực tế
Dự án đã cung cấp một máy chủ TCP có lỗ hổng cố ý (victim_server.c) để minh họa chuỗi tấn công:
- Lỗ hổng: Rò rỉ thông qua chuỗi định dạng (format-string) để phá vỡ ASLR và tràn bộ đệm stack (stack buffer overflow).
- Quy trình khai thác: Exploit sẽ sử dụng ROP chain để chuyển sang shellcode.
- Chế độ hoạt động của Payload:
- Disk mode: Ghi payload xuống đĩa (vẫn hoạt động ngay cả trên
noexecvì không dùngexecve). - Memfd mode: Sử dụng
memfd_createđể tạo payload hoàn toàn trong bộ nhớ, không để lại bất kỳ tệp nào trên hệ thống tệp (zero on-disk footprint).
- Disk mode: Ghi payload xuống đĩa (vẫn hoạt động ngay cả trên
Điểm hạn chế và Giải pháp giảm thiểu
Mặc dù bản demo này tắt các biện pháp giảm thiểu hiện đại như ASLR/PIE để dễ hình dung, nguyên lý cốt lõi vẫn cực kỳ nguy hiểm khi kẻ tấn công đã có được thực thi mã trong quy trình.
Để ngăn chặn lớp tấn công này, các biện pháp bảo mật thông thường như noexec là không đủ. Bạn cần các giải pháp mạnh mẽ hơn:
- PaX/GRsecurity TPE + RBAC: Được coi là giải pháp thực sự hiệu quả để ngăn chặn lớp tấn công này.
- Bộ lọc Seccomp nghiêm ngặt: Hạn chế
memfd_create, các mẫummapđáng ngờ và lạm dụng tín hiệu (signal abuse). - Sandbox chặt chẽ: Chạy các dịch vụ trong sandbox DAC/MAC với các quyền hạn chế tối thiểu.
Kết luận
Dự án userland-exec là bằng chứng rõ ràng cho thấy khi thực thi mã tùy ý đã xâm nhập được vào một quy trình, hầu hết các "sách lược gia cố Linux" phổ biến trở nên vô nghĩa. Các chính sách kiểm soát hệ thống tệp và noexec đều bị bypass hoàn toàn trong không gian người dùng mà không cần sự can thiệp của nhân.
Điều này nhắc nhở chúng ta rằng phòng thủ theo lớp (layered defense) luôn quan trọng hơn các giải pháp "viên đạn bạc" đơn lẻ.
"May your userland-exec payload not nuke your own cyber bunker."
– The crew



