Tự tay viết Linux container chỉ với 500 dòng code

Phần mềm05 tháng 10, 2026·3 phút đọc

Một lập trình viên đã xây dựng lại cơ chế Linux container từ đầu trong khoảng 500 dòng code để hiểu rõ bản chất bảo mật của chúng. Bài viết phân tích chi tiết cách các cơ chế kernel như namespace, capability, seccomp, cgroup phối hợp với nhau — và những cạm bẫy tiềm ẩn khi cấu hình sai.

Tự tay viết Linux container chỉ với 500 dòng code

Nhiều lập trình viên dùng Docker hay Kubernetes hàng ngày mà không thực sự hiểu bên dưới chúng vận hành ra sao. Một bài viết kỹ thuật mới đây đã thử thách điều đó bằng cách tự xây dựng một runtime container tối giản chỉ với khoảng 500 dòng code C.

Mục tiêu của tác giả không phải tạo ra một sản phẩm thay thế Docker, mà là trả lời câu hỏi: đâu là tập hợp tối thiểu các ràng buộc cần thiết để chạy code không đáng tin cậy một cách an toàn?

Linux container thực chất là gì?

Container không phải là một công nghệ đơn lẻ. Nó là sự kết hợp của nhiều cơ chế kernel chồng chéo lên nhau:

  • Namespace: cô lập góc nhìn của tiến trình về hệ thống (mount, PID, network, hostname, IPC...)
  • Capability: chia nhỏ đặc quyền root thành các quyền riêng biệt
  • Seccomp: lọc các system call được phép gọi
  • Cgroup: giới hạn tài nguyên như bộ nhớ, CPU, số lượng tiến trình

Tác giả nhấn mạnh rằng namespace dành cho user (user namespace) là phần phức tạp nhất. Dù nó hứa hẹn thống nhất nhiều cơ chế bảo mật, nhưng việc bật nó trong kernel có thể thay đổi ngữ nghĩa của capability trên toàn hệ thống và đã dẫn đến nhiều lỗ hổng leo thang đặc quyền trong quá khứ.

Capability — chia nhỏ quyền root

Trên Linux, "là root" không phải là một khối quyền duy nhất mà được chia thành hàng chục capability khác nhau. Ví dụ:

  • CAP_NET_ADMIN: quản lý thiết bị mạng
  • CAP_DAC_READ_SEARCH: đọc file bất kỳ, kể cả vượt qua kiểm tra quyền Unix
  • CAP_SYS_ADMIN: quá nhiều quyền hạn đến mức được xem là "root mới"

Tác giả lần lượt loại bỏ từng capability nguy hiểm, giải thích lý do cụ thể. Chẳng hạn, CAP_FSETID cho phép sửa file setuid mà không xóa bit setuid — nghĩa là có thể vô tình để lại một binary setuid root nguy hiểm trên ổ đĩa, và bất kỳ người dùng nào cũng có thể khai thác.

Thật quan trọng khi biết được đâu là những quyền hạn tuyệt đối không an toàn.

Seccomp — chặn các system call nguy hiểm

Bên cạnh việc loại bỏ capability, tác giả còn blacklist một loạt system call. Đáng chú ý là userfaultfd — vốn không cần đặc quyền, nhưng có thể được lợi dụng để tạm dừng thực thi trong kernel giữa lúc kiểm tra quyền ghi file và lúc ghi file thật, một kỹ thuật quan trọng trong nhiều kernel exploit.

Nhiều system call khác như kexec_load, reboot, swapon đều bị chặn vì có thể ảnh hưởng đến toàn hệ thống, không chỉ trong namespace của container.

Cgroup — giới hạn tài nguyên để tránh tấn công từ chối dịch vụ

Các cgroup giúp ngăn tiến trình bên trong container "ngốn" hết tài nguyên của host. Điều này đặc biệt quan trọng với kernel out-of-memory killer: nếu một tiến trình trong container tiêu thụ nhiều bộ nhớ, host có thể chọn kill một tiến trình quan trọng như trình khóa màn hình thay vì nó.

Góc nhìn cho cộng đồng Việt Nam

Với các đội DevOps và kỹ sư bảo mật tại Việt Nam đang ngày càng triển khai nhiều workload container lên cloud, bài viết này là một tài liệu quý để hiểu sâu về bản chất bảo mật của container. Nhiều cấu hình mặc định của Docker tỏ ra khá chặt chẽ, nhưng không phải "phép màu" — chúng là kết quả của một chuỗi quyết định thiết kế cụ thể mà kỹ sư cần nắm rõ.

Nếu bạn đang chạy container trong môi trường đa người dùng, việc tự tay thử nghiệm một runtime tối giản như thế này có thể giúp bạn phát hiện những lỗ hổng cấu hình mà mình chưa từng để ý tới.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗