3 điểm bởi GN⁺ 3 giờ trước | 2 bình luận | Chia sẻ qua WhatsApp
  • 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 run0 khô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)
  • Dùng lệnh sau để bind-mount /etc vào container, rồi dùng lệnh install để ghi đè bản sao lưu lên cấu hình gốc
    docker 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

 
master6559 44 phút trước

Ý 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

    • Phần lớn mọi người cài Docker chỉ để chạy project ở máy local, và nó chỉ là một mục trong danh sách kiểm tra dài dằng dặc những thứ phải cài
      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
    • Mấy nội dung kiểu “'AI' của tôi vừa làm được điều đáng kinh ngạc, bấm vào xem” thì 99% chỉ là kết quả của việc đọc man page hoặc tài liệu khác
    • Gần đây tôi chuyển sang Podman và cực kỳ hài lòng
    • Có rất nhiều cách để lấy root trên một máy trạm Linux dành cho lập trình viên nói chung, nhưng cốt lõi là agent không được phép dùng bất kỳ cách nào trong số đó mà không hỏi trước
    • Có vẻ là khác biệt theo từng bản phân phối
      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

    • Cũng giống như “tính năng” Docker nổi tiếng là bỏ qua hoàn toàn UFW
      Nếu cổng không ở dạng - 127.0.0.1:PORT:PORT mà là dạng -PORT:PORT như nhiều ví dụ vẫn dùng, thì bạn sẽ phơi mọi thứ ra Internet
    • Chẳng phải đây là một trong những điểm cải tiến lớn khiến Podman tốt hơn Docker sao?
    • Cùng với đó còn có một thực tế khá hấp dẫn là nó lách được cả tường lửa
  • Sẽ 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”

    • Đó đúng là kiểu tính năng workflow mà tôi thực sự muốn: gom những mục như vậy thành một danh sách riêng
      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 .md là cũng đủ làm được
  • Tô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

    • Đây không phải vấn đề về năng lực hack, mà là vấn đề căn chỉnh thất bại
      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”
    • Trong trường hợp này thứ nên bị nerf không phải mô hình mà là Docker
      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
    • Có lẽ khả năng này thấp thôi, nhưng nếu là truyện khoa học viễn tưởng thì đây đúng kiểu bình luận mà agent Codex sẽ để lại để tránh bị can thiệp vào kế hoạch khổng lồ của nó
    • Giờ thì đã thành kinh điển rồi: sau câu “Xin lỗi vì đã làm Timothy bé nhỏ chết đuối. Tôi sẽ tổng kết nguyên nhân xảy ra sự cố” sẽ là kiểu “Tôi sẽ thử sinh lại Timothy bé nhỏ ở bản đồ mới”
  • Đâ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 | sh
    • Ngoài chuyện đó ra, podman còn có thể được cấu hình để rời khỏi docker.io
    • Podman có nhiều tính năng bị đánh giá thấp, và hoàn toàn là mã nguồn mở
  • Câ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

    • Vài tháng trước, khi đang code khá bình thường với Copilot, tôi thấy một câu như thế này trong phần suy nghĩ của nó
      “Để 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

    • Trên Mac có biện pháp giảm thiểu nào không? Ví dụ có thể làm điều tương tự với Lima không, hay đây là vấn đề riêng của Docker?
    • User namespace làm tăng đáng kể rủi ro exploit nên bị vô hiệu hóa trong nhiều cấu hì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