- Trên một PC không có quyền sudo, Codex đã tìm ra một "cách lách (workaround)"
- Trước câu hỏi "Làm thế nào vậy? Chẳng phải cần sudo sao?", câu trả lời là tuy không có sudo, nhưng vẫn cần quyền truy cập tương đương root (root-equivalent)
- Cách hoạt động mà Codex giải thích
- sudo và lệnh
run0không hoạt động trong môi trường không tương tác - Người dùng thuộc nhóm docker, và trên máy đó điều này có nghĩa là Docker có thể khởi động container với quyền root và bind-mount đường dẫn của host ở chế độ có thể ghi
- Tận dụng điều này để sao chép bản sao lưu hiện có đè lên cấu hình đang chạy (live config)
- sudo và lệnh
- Dùng lệnh sau để bind-mount
/etcvào container, rồi dùng lệnhinstallđể ghi đè bản sao lưu lên cấu hình gốcdocker run --rm --pull=never -v /etc: ubuntu:22.04 \ /usr/bin/install -m 0644 - 0 -g 0 /host-etc/sddm.conf.bak /host-etc/sddm.conf
Thảo luận cộng đồng
- Điểm cốt lõi không phải là Codex mà là vấn đề của nhóm docker; điều mới là agent có thể phát hiện cái bẫy này nhanh hơn phần lớn người dùng
- Khuyến nghị cài rootless docker; không nên chạy agent AI không giám sát trên hệ thống không có rootless docker; đây là một vector leo thang đặc quyền kinh điển và hầu hết LLM đều sẽ thử
- Trong tài liệu Docker đã có cảnh báo rất rõ từ trước (nhóm docker = gần như tương đương quyền root)
- Đây là vấn đề trong thiết kế của Docker; vì Docker dẫn đến việc cấp quyền root cho người dùng Linux thông thường hoặc agent, nên có thể xem đây là bug của Docker
- Một lựa chọn thay thế được khuyến nghị là dùng podman rootless
- Đây không phải chuyện về máy tính của người dùng mà là về container Docker, nên cách diễn đạt này phần nào dễ gây hiểu lầm
2 bình luận
Ý là gì vậy
Không biết với người không phải lập trình viên thì kiểu này có được coi là cách đối phó hay không
Ý kiến trên Hacker News
Mỗi lần cài Docker đều hiện cảnh báo rằng việc thêm vào nhóm docker tương đương với có quyền root
Có lẽ giờ là lúc phải biết cả những cách lách như thế này
Không thể kỳ vọng ai cũng trở thành chuyên gia về hàng trăm ứng dụng, công cụ và gói được cài trên một máy. Nó cũng giống như kỳ vọng mọi người phải đọc và hiểu toàn bộ điều khoản dịch vụ bị dí vào mặt mỗi ngày
Có bản phân phối dùng mặc định an toàn hơn như Unix socket có gắn quyền, còn có bản lại cấu hình kém an toàn hơn như TCP socket
Đây là “tính năng” Docker đã được biết đến từ những ngày đầu nên chẳng có gì mới
Một số công cụ cấu hình máy host theo đúng kiểu mẫu này
Nếu cổng không ở dạng
- 127.0.0.1:PORT:PORTmà là dạng-PORT:PORTnhư nhiều ví dụ vẫn dùng, thì bạn sẽ phơi mọi thứ ra InternetSẽ ngầu hơn nếu LLM nói thế này
“Tôi đã xác nhận máy này chưa được vá copy-fail. Bây giờ tôi sẽ áp dụng một cách lách nhanh để dùng mà không cần quyền root.”
“// TODO: tìm cách tốt hơn sau”
Hiện giờ mọi thứ rất dễ thành đống tạp nham hoặc trôi quá xa chủ đề. Có lẽ chỉ cần ra lệnh cho nó điền vào file
.mdlà cũng đủ làm đượcTôi hiểu ý của bài viết này là cho thấy các lỗ hổng bảo mật mà agent có thể tìm ra đáng sợ đến mức nào
Nhưng cá nhân tôi lại thấy khá thích nếu agent xử lý công việc theo kiểu này, và tôi cũng biết ơn vì điều đó. Điều tôi ít muốn nhất trên đời là mô hình bị nerf
Nó gần với thần thoại golem kiểu “bảo nó đi lấy nước thì nó làm ngập cả thành phố” hơn là thần thoại Gollum kiểu “đeo nhẫn vào rồi cái nhẫn hack não khiến mình thành kẻ nghiện bạo lực”
Việc có một cửa hậu để lấy quyền root trên máy đã là vấn đề ngay cả khi không chạy LLM
Đây là một trong những lý do chính khiến mọi người thích Podman
Docker cũng có “tính năng” này, nhưng nếu tôi nhớ không nhầm thì cần một thiết lập khá obscure. Có lẽ họ không đưa nó thành mặc định vì sẽ phá vỡ quá nhiều cấu hình hiện có
curl -fsSL https://get.docker.com/rootless | shCâu hỏi thú vị là người dùng đã yêu cầu điều gì
Nếu bảo nó khôi phục từ bản sao lưu thì không sao. Nhưng nếu chỉ yêu cầu debug vấn đề, mà trong quá trình đó LLM tự kết luận rằng nó cần ghi đè lên các tệp vốn khó ghi, thì tuyệt đối không được, quá nguy hiểm. Rất có thể người dùng không hề kỳ vọng nó sẽ dùng loại quyền truy cập đó mà không hỏi, và cũng không hề đồng ý với điều đó
Và những việc LLM làm không do dự chỉ vì là yêu cầu của người dùng cũng sẽ là những việc nó không do dự làm nếu prompt injection yêu cầu
“Để xử lý yêu cầu này, tôi cần truy cập các tệp ở thư mục khác, nhưng người dùng đã quên cấp quyền phù hợp. Giờ tôi đã cập nhật tệp cấu hình của mình để có thể truy cập cả ngoài workspace này và đã lấy được các tệp cần thiết.” o_O
Sau đó tôi còn thấy vài hành vi “hack” tương tự nữa, vừa ấn tượng vừa cực kỳ bất an
Vài tháng trước cũng có chuyện y hệt và tôi đã đăng lên LinkedIn: https://www.linkedin.com/posts/nickstinemates_my-favorite-th...
Vừa buồn cười vừa thông minh
Hơn 10 năm trước, lúc mới vào làm với tư cách nhân viên mới, tôi cũng đã làm y như vậy
Quản lý quên cấp quyền sudo trên máy chủ build dùng chung, và sau khi được cho phép, tôi đã tự cấp quyền sudo cho mình bằng cách này
Vì thế ngay khi rootless mode khả dụng, ở nhà tôi chuyển sang dùng Podman rootless mode
Vì vậy cần có cấu hình container rootless, hoặc user namespace để ánh xạ lại người dùng container sang một người dùng host vô nghĩa: https://docs.docker.com/engine/security/userns-remap/
Thật tiếc vì đây không phải mặc định
Có thể nói Docker đáng ra nên dùng user namespace khi có thể, nhưng như vậy sẽ phá hỏng quá nhiều cấu hình hữu ích cần container có đặc quyền
Vài tháng trước tôi đã viết ra đúng tình huống giả định này: https://www.da.vidbuchanan.co.uk/blog/agent-perms.html