Tự tay viết Linux container chỉ với 500 dòng code
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ạngCAP_DAC_READ_SEARCH: đọc file bất kỳ, kể cả vượt qua kiểm tra quyền UnixCAP_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.
Bài viết liên quan
Công nghệ
Điểm tin Java tuần này: JobRunr 9 và OpenXava 8 chính thức phát hành, Quarkus và LangChain4j cập nhật, ra mắt Lathe
05 tháng 10, 2026
Công nghệ
F1 Bahrain 2026 gặp sự cố phần mềm: Nửa đoàn đua bị loại trước khi xuất phát
05 tháng 10, 2026

Công nghệ
Windows 11 26H2 dính lỗi âm thanh mới: ứng dụng dùng bộ giải mã AC-3 có thể bị treo
05 tháng 10, 2026