Làm thế nào để vứt bỏ tù một quy trình mà không cần root?


26

Khi tôi root, tôi chỉ có thể tạo một người dùng / nhóm giả, đặt quyền truy cập tệp phù hợp và thực hiện quy trình như người dùng đó. Tuy nhiên tôi không phải, vậy có cách nào để đạt được điều này mà không cần root?


1
@alex: Tôi có một tập lệnh thực thi nhiều mô phỏng (trong các thư mục khác nhau) và muốn đảm bảo cho dù chương trình có tệ đến mức nào, họ chỉ có thể truy cập các tệp trong thư mục của riêng họ và không vô tình sửa đổi, ví dụ như đầu ra của các mô phỏng khác
Tobias Kienzler

2
@Tobias: Tôi có quan điểm của bạn. chroottự nhiên sẽ phù hợp ở đó, nhưng một lần nữa bạn không root.
alex

1
Tôi nghĩ rằng selinux, apparmor và grsecurance, thể có thể làm điều này, nhưng tôi không chắc chắn. nhưng sau đó nếu những người không có sẵn hoặc được cấu hình bởi quản trị viên hệ thống, bạn sẽ giải quyết vấn đề đó.
xenoterracide

4
Một câu hỏi như vậy đã là một cái gì đó để tôi tự hỏi trong nhiều năm. Nó dường như là một mong muốn tự nhiên: không cần root, để có thể chạy các quy trình với một số quyền của người dùng của bạn bị loại bỏ, tức là có thể giới hạn một quy trình cho "nhà tù" do người dùng thiết lập, sẽ cung cấp quy trình ngay cả ít quyền hơn người dùng của bạn có. Thật đáng tiếc khi các Unices thông thường không cung cấp tiêu chuẩn này!
imz - Ivan Zakharyaschev

2
Hãy thử yêu cầu quản trị viên hệ thống của bạn tạo cho bạn một tài khoản người dùng thứ hai.
LawrenceC

Câu trả lời:


23

Nhiều câu hỏi tương tự hơn với nhiều câu trả lời đáng chú ý hơn:

LƯU Ý: Một số câu trả lời chỉ ra các giải pháp cụ thể chưa được đề cập ở đây.

Trên thực tế, có khá nhiều công cụ bỏ tù với cách triển khai khác nhau, nhưng nhiều trong số chúng không an toàn theo thiết kế (như fakeroot, LD_PRELOADdựa trên cơ sở) hoặc không hoàn chỉnh (như fakeroot-ng, ptracedựa trên cơ sở) hoặc sẽ yêu cầu root ( chroothoặc plashđược đề cập tại fakechroot nhãn cảnh báo ).

Đây chỉ là những ví dụ; Tôi đã nghĩ đến việc liệt kê tất cả chúng cạnh nhau, với dấu hiệu của 2 tính năng này ("có thể tin cậy được không?", "Có yêu cầu root để thiết lập không?"), Có lẽ tại Triển khai ảo hóa ở cấp hệ điều hành .

Nói chung, các câu trả lời bao gồm đầy đủ các khả năng được mô tả và thậm chí nhiều hơn:

máy ảo / HĐH

phần mở rộng kernel (như SELinux)

  • (được đề cập trong các ý kiến ​​ở đây),

chroot

Các trình trợ giúp dựa trên Chroot (tuy nhiên phải là root setUID, vì chrootyêu cầu root; hoặc có chrootthể có thể hoạt động trong một không gian tên bị cô lập - xem bên dưới):

[để nói thêm một chút về họ!]

Các công cụ cách ly dựa trên chroot được biết đến:

  • hasher với nó hsh-runhsh-shelllệnh. ( Hasher được thiết kế để xây dựng phần mềm theo cách an toàn và có thể lặp lại.)
  • schroot được đề cập trong một câu trả lời khác
  • ...

ptrace

Một giải pháp cách ly đáng tin cậy khác (ngoài mộtseccomp giải pháp dựa trên cơ sở ) sẽ là việc ngăn chặn hoàn toàn tòa nhà thông qua ptrace, như được giải thích trong trang hướng dẫn cho fakeroot-ng:

Không giống như các triển khai trước đó, fakeroot-ng sử dụng một công nghệ khiến quá trình theo dõi không còn lựa chọn nào liên quan đến việc liệu nó có sử dụng "dịch vụ" của fakeroot-ng hay không. Biên dịch chương trình một cách tĩnh, gọi trực tiếp kernel và thao tác không gian địa chỉ của chính chúng là tất cả các kỹ thuật có thể được sử dụng một cách tầm thường để vượt qua sự kiểm soát dựa trên LD_PRELOAD đối với một quy trình và không áp dụng cho fakeroot-ng. Về mặt lý thuyết, có thể tạo khuôn fakeroot-ng theo cách để có toàn quyền kiểm soát quá trình truy tìm.

Trong khi về mặt lý thuyết là có thể, nó đã không được thực hiện. F. ng. Do đó, bạn được cảnh báo mạnh mẽ về việc sử dụng fakeroot-ng như một công cụ bảo mật. Bug báo cáo rằng một quá trình có thể cố tình (trái ngược với vô tình) thoát khỏi sự kiểm soát của root-ng sẽ bị đóng là "không phải là lỗi" hoặc được đánh dấu là mức độ ưu tiên thấp.

Có thể chính sách này sẽ được xem xét lại trong tương lai. Hiện tại, bạn đã được cảnh báo.

Tuy nhiên, như bạn có thể đọc nó, fakeroot-ngbản thân nó không được thiết kế cho mục đích này.

(BTW, tôi tự hỏi tại sao họ lại chọn sử dụng seccompphương pháp tiếp cận dựa trên Chromium thay vì ptracedựa trên ...)

Trong số các công cụ không được đề cập ở trên, tôi đã lưu ý Geordi cho chính mình, vì tôi thích rằng chương trình kiểm soát được viết bằng Haskell.

Các công cụ cách ly dựa trên ptrace được biết đến:

bí mật

Một cách được biết để đạt được sự cô lập là thông qua cách tiếp cận hộp cát seccomp được sử dụng trong Google Chromium . Nhưng phương pháp này cho rằng bạn viết một người trợ giúp sẽ xử lý một số (những người được phép) truy cập tệp "bị chặn" và các tòa nhà khác; và tất nhiên, cũng nỗ lực để "chặn" các tòa nhà và chuyển hướng chúng đến người trợ giúp (có lẽ, nó thậm chí còn có nghĩa là thay thế các tòa nhà bị chặn trong mã của quy trình được kiểm soát; vì vậy, nó không có âm thanh khá đơn giản, nếu bạn quan tâm, tốt hơn bạn nên đọc chi tiết thay vì chỉ câu trả lời của tôi).

Thông tin liên quan khác (từ Wikipedia):

(Mục cuối cùng có vẻ thú vị nếu một người đang tìm kiếm một seccompgiải pháp dựa trên tổng thể bên ngoài Chromium. Ngoài ra còn có một bài đăng blog đáng đọc từ tác giả của "seccomp-y tá": SECCOMP là một giải pháp Sandboxing ? .)

Hình minh họa của phương pháp này từ dự án "seccomp-y tá" :

                      nhập mô tả hình ảnh ở đây

Một seccomp "linh hoạt" có thể có trong tương lai của Linux?

Đã từng xuất hiện vào năm 2009 cũng có đề xuất vá nhân Linux để có seccompchế độ linh hoạt hơn với chế độ - để "có thể tránh được nhiều trò nhào lộn mà chúng ta cần hiện nay". ( "Acrobatics" đề cập đến những biến chứng của việc viết một helper mà đã thực hiện nhiều syscalls có thể vô tội trên danh nghĩa của quá trình bị bỏ tù và thay thế các syscalls có thể vô tội trong quá trình bị bỏ tù.) Bài viết Một LWN viết đến thời điểm này:

Một đề xuất được đưa ra là thêm một "chế độ" mới vào seccomp. API được thiết kế với ý tưởng rằng các ứng dụng khác nhau có thể có các yêu cầu bảo mật khác nhau; nó bao gồm một giá trị "chế độ" chỉ định các hạn chế sẽ được đặt đúng chỗ. Chỉ có chế độ ban đầu đã được thực hiện, nhưng những người khác chắc chắn có thể được thêm vào. Tạo một chế độ mới cho phép quá trình khởi tạo chỉ định các cuộc gọi hệ thống nào sẽ được phép sẽ giúp thiết bị trở nên hữu ích hơn cho các tình huống như hộp cát Chrome.

Adam Langley (cũng của Google) đã đăng một bản vá thực hiện điều đó. Việc triển khai "chế độ 2" mới chấp nhận một bitmask mô tả các lệnh gọi hệ thống nào có thể truy cập được. Nếu một trong số đó là prctl (), thì mã hộp cát có thể hạn chế hơn các cuộc gọi hệ thống của chính nó (nhưng nó không thể khôi phục quyền truy cập vào các cuộc gọi hệ thống đã bị từ chối). Tất cả đã nói, có vẻ như một giải pháp hợp lý có thể giúp cuộc sống của các nhà phát triển hộp cát dễ dàng hơn.

Điều đó nói rằng, mã này có thể không bao giờ được hợp nhất bởi vì cuộc thảo luận đã chuyển sang các khả năng khác.

"Seccomp linh hoạt" này sẽ mang các khả năng của Linux đến gần hơn để cung cấp tính năng mong muốn trong HĐH, mà không cần phải viết các trợ giúp phức tạp.

(Một bài đăng blog với nội dung cơ bản giống như câu trả lời này: http://geofft.mit.edu/blog/sipb/33 .)

không gian tên ( unshare)

Cô lập thông qua các không gian tên ( unsharegiải pháp dựa trên cơ sở ) - không được đề cập ở đây - ví dụ: các điểm gắn kết không rõ ràng (kết hợp với FUSE?) Có thể là một phần của giải pháp làm việc cho bạn muốn giới hạn truy cập hệ thống tệp của các quy trình không tin cậy của bạn.

Bây giờ, nhiều hơn về các không gian tên, vì việc triển khai của chúng đã được hoàn thành (kỹ thuật cách ly này cũng được biết đến trong "Bộ chứa Linux" hay "LXC" , phải không? ..):

"Một trong những mục tiêu chung của không gian tên là hỗ trợ triển khai các container, một công cụ để ảo hóa nhẹ (cũng như các mục đích khác)" .

Thậm chí có thể tạo một không gian tên người dùng mới, để "một quy trình có thể có ID người dùng không có đặc quyền bình thường bên ngoài không gian tên người dùng đồng thời có ID người dùng bằng 0 trong không gian tên. Điều này có nghĩa là quy trình có đặc quyền gốc đầy đủ cho các hoạt động bên trong không gian tên người dùng, nhưng không được ưu tiên cho các hoạt động bên ngoài không gian tên ".

Đối với các lệnh làm việc thực tế để làm điều này, xem câu trả lời tại:

và lập trình / biên dịch không gian người dùng đặc biệt

Tuy nhiên, tất nhiên, các đảm bảo "tù" mong muốn có thể được thực hiện bằng cách lập trình trong không gian người dùng ( không có hỗ trợ bổ sung cho tính năng này từ HĐH ; có lẽ đó là lý do tại sao tính năng này không được đưa vào vị trí đầu tiên trong thiết kế HĐH ); với các biến chứng nhiều hay ít.

Hộp cát được đề cập ptrace- hoặc seccompdựa trên có thể được xem là một số biến thể của việc thực hiện bảo đảm bằng cách viết một trình trợ giúp hộp cát điều khiển các quy trình khác của bạn, được coi là "hộp đen", các chương trình Unix tùy ý.

Một cách tiếp cận khác có thể là sử dụng các kỹ thuật lập trình có thể quan tâm đến các hiệu ứng phải không được phép. (Phải là bạn đã viết chương trình sau đó; chúng không còn là hộp đen nữa.) Để đề cập đến một ngôn ngữ lập trình thuần túy (sẽ buộc bạn phải lập trình mà không có tác dụng phụ) như Haskell sẽ tạo ra tất cả các hiệu ứng của chương trình rõ ràng, vì vậy lập trình viên có thể dễ dàng đảm bảo sẽ không có hiệu ứng không được phép.

Tôi đoán, có những phương tiện hộp cát có sẵn cho những chương trình đó bằng một số ngôn ngữ khác, ví dụ, Java.


Một số trang tích lũy thông tin về chủ đề này cũng được chỉ ra trong các câu trả lời ở đó:


Rootless GoboLinux cũng có thể là một lựa chọn ...
Tobias Kienzler

@tobias Nhưng Rootless Gobolinux có đảm bảo rằng chương trình được viết bởi người dùng sẽ không truy cập vào môi trường bên ngoài không? ..
imz - Ivan Zakharyaschev

1
Không thực sự - bằng cách nào đó tôi đã hiểu sai rằng nó cũng sẽ cho phép một người trở thành người dùng root "cục bộ" mà sau đó có thể tạo người dùng ảo cho một quá trình như vậy - mặc dù có thể sử dụng nó chroot, nhưng điều đó có thể vẫn cần đặc quyền root thực sự ...
Tobias Kienzler

8

Đây là một hạn chế cơ bản của mô hình cấp phép unix: chỉ root mới có thể ủy quyền.

Bạn không cần phải root để chạy máy ảo (không đúng với tất cả các công nghệ VM), nhưng đây là một giải pháp nặng.

Linux chế độ người dùng là một giải pháp ảo hóa Linux-on-Linux tương đối nhẹ. Nó không phải là dễ dàng để thiết lập; bạn sẽ cần phải cư một phân vùng gốc (trong một thư mục) với ít nhất ở mức tối thiểu cần thiết để khởi động (một vài tập tin trong /etc, /sbin/initvà phụ thuộc của nó, một chương trình đăng nhập, một vỏ và tiện ích).


1

Tôi đoán bạn có thể có một số may mắn LD_PRELOADđể chặn truy cập vào một số tệp nhất định, nhưng điều này có thể thực sự khó khăn.


Hộp cát seccomp của Google Chromium thực hiện một điều đáng tin cậy hơn - đánh chặn tòa nhà, một cách hiệu quả. - unix.stackexchange.com/questions/6433/ Google
imz - Ivan Zakharyaschev

Sự khác biệt giữa việc chỉ cố gắng chặn thứ gì đó và sanboxing (như trong trường hợp của Chromium) là sự đảm bảo cho sự cô lập.
imz - Ivan Zakharyaschev

1
Đánh chặn thông qua LD_PRELOADkhông thể tin cậy (có thể bị phá vỡ), nhưng đánh chặn thông quaptrace có thể.
imz - Ivan Zakharyaschev

1
Một ví dụ đơn giản được trình bày ở đây < joey.kitenet.net/blog/entry/fakechroot_warning_label > cho thấy LD_PRELOADcác giải pháp dựa trên không thể tin cậy như một biện pháp bảo mật.
imz - Ivan Zakharyaschev

0

Từ danh sách đầy đủ tôi chỉ cần thêm:

  • fakeroot (từ người bảo trì gói debian): nó nhằm mục đích xây dựng gói với các công cụ "thân thiện". Đây không phải là một sự cô lập hoàn toàn, nhưng nó giúp xây dựng các gói với người dùng khác nhau và các thiết bị giả mạo và các tệp giả đặc biệt khác.

  • fakechroot (sử dụng fakeroot). Chương trình này có nhiều lỗi. Ví dụ: "/ etc / hosts" được mã hóa cứng trong glibc: bạn không thể thay đổi nó thông qua công cụ này.

  • qemu: bạn cần biên dịch kernel linux, nhưng kết quả rất nhanh và đây là một máy "giả" (tức là ảo) với các đặc quyền root thực sự. Bạn có thể xây dựng và gắn kết bất kỳ hình ảnh khởi động.


0

Firejail là công cụ tuyệt vời để bỏ qua bất kỳ quy trình nào, có hoặc không có quyền truy cập root với rất nhiều tùy chọn và rất linh hoạt:


2
Một chi tiết hơn về cách sử dụng firejail sẽ được hoan nghênh. Sau khi liên kết đó chết, nội dung thông tin câu trả lời của bạn sẽ chuyển sang tên của các tiện ích. (bao gồm ở đây nếu nó là các gói có sẵn trên các bản phân phối, làm thế nào để sử dụng nó, v.v.).
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.