Kỹ thuật Userland Execution: Bypass 'noexec' để thực thi mã lén lút trên Linux

13 tháng 4, 2026·4 phút đọc

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

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:

  1. Kẻ tấn công khai thác lỗ hổng (stack smash, format string, use-after-free...).
  2. Mục tiêu là một hộp Linux được gia cố với SELinux/AppArmor và /tmp được mount với noexec.
  3. Quy trình bị xâm chiếm, dẫn đến thực thi mã tùy ý.
  4. 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ụng mmap/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 ExecDemo 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ợp memfd_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 noexec vì không dùng execve).
    • 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).

Đ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ẫu mmap đá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

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗