Có thể chạy 'unshare -n [chương trình]' với tư cách là người dùng không có quyền?


11

Tôi muốn chạy một chương trình mà không cần truy cập internet, vd

unshare -n ping 127.0.0.1.

Là một người dùng không có đặc quyền, nó trả về Operation not permitted, với tư cách là một người dùng đặc quyền, nó trả về mong muốn Network is unreachable.

Có cách nào để làm cho nó hoạt động cho người dùng không có đặc quyền không?

Câu trả lời:


10

Trong các phiên bản sau của linux-linux, unshaređã đạt được --map-root-usertùy chọn. Trích dẫn từ unshare(1)phiên bản 2.26.2:

-r, --map-root-user

Chỉ chạy chương trình sau khi ID người dùng và nhóm hiệu quả hiện tại đã được ánh xạ tới siêu người dùng UID và GID trong không gian tên người dùng mới được tạo. Điều này giúp có thể thuận tiện đạt được các khả năng cần thiết để quản lý các khía cạnh khác nhau của các không gian tên mới được tạo (chẳng hạn như định cấu hình giao diện trong không gian tên mạng hoặc gắn hệ thống tệp trong không gian tên gắn kết) ngay cả khi chạy không được ưu tiên. Là một tính năng tiện lợi đơn thuần, nó không hỗ trợ các trường hợp sử dụng phức tạp hơn, chẳng hạn như ánh xạ nhiều phạm vi UID và GID. Tùy chọn này ngụ ý --setgroups = deny.

Vì vậy, trên các hệ thống mới hơn, bạn có thể chạy:

unshare -n -r ping 127.0.0.1

Và điều này sẽ mang lại mong đợi Network is unreachable.


Tôi vẫn nhận được Operation not permittedvới~$ unshare -n -r ping 127.0.0.1
Arctic Kona

1
@ArcticKona hệ thống của bạn có thể được cấu hình khác với chúng tôi, xin lỗi tôi không thể giúp. Đối với một số trường hợp sử dụng, cũng có thể đáng để thử câu trả lời khác của tôi bwrap --unshare-net, nhưng hãy nhớ rằng ICMP (ping) đặc biệt không được hỗ trợ trong giải pháp đó.
Amir

2

Làm cho nó setuid(giả sử nó đã được sở hữu bởi root):

sudo chmod u+s "`which unshare`"

Từ unshare (1) :

GHI CHÚ Lệnh unshare giảm các đặc quyền tiềm năng trước khi thực hiện chương trình đích. Điều này cho phép setuid unshare.


2
cách khác: chạy nó trong một không gian tên người dùng trong đó người dùng đã được cấp quyền root.
mikeerv

2
Có một bản vá trong các phiên bản mới hơn của unshare giúp loại bỏ các thông tin cá nhân, vì vậy hãy cẩn thận nếu bạn đang nâng cấp.
Mrten

Trong phiên bản unshaređược cài đặt trên hệ thống của tôi (2.26.2), phiên bản này hoạt động như một người dùng không có quyền : unshare -n -r ping 127.0.0.1. (Lưu ý việc bổ sung -r, như @mikeerv đã đề xuất, điều chỉnh không gian tên người dùng để chạy quy trình với quyền root bên trong nó.)
Amir

Âm thanh như đặt chìa khóa dưới tấm thảm chùi chân và đặt một dấu hiệu trên cửa hiển thị biểu tượng chìa khóa và mũi tên chỉ xuống ...
TheDiveO

@TheDiveO số Unshare không cung cấp cho bạn đặc quyền. Nó cho phép bạn hạn chế chính mình. Nó cũng có thể là setuid root theo mặc định nhưng có lẽ không phải vì các chính sách phân phối ngu ngốc. Không có hại về bảo mật trong việc làm cho nó được thiết lập gốc, đặc biệt là vì nó có mã nguồn khá đơn giản cho phép bạn kiểm tra không có lỗ hổng bảo mật nào trong đó.
PSkocik

1

Bạn có thể sử dụng setcaptiện ích để thiết lập unshare.

sudo setcap cap_sys_admin+ep /usr/bin/unshare

Sau này, bạn có thể sử dụng unshare -n ping 127.0.0.1 Tôi không thể giải thích thêm nữa và tôi không biết liệu đây có phải là một ý tưởng hay không, nhưng nó hoạt động và whoamikhông hiển thị rootdưới dạng tên người dùng.


-1

Một cách khác để vào một không gian tên mạng mới, bên cạnh đó unshare -n, là sử dụng Bubblewrap ( bwrap --unshare-net) cấp cao hơn :

bwrap --bind / / --dev /dev --unshare-net -- your-program args …

Lưu ý: nếu your-program args …ping 127.0.0.1, bạn sẽ nhận thấy rằng ICMP không được hỗ trợ trong Bubblewrap, vì vậy ví dụ OP sẽ không hiển thị định hướng Network is unreachable.

Cũng thú vị để lưu ý là chương trình --unshare-net làm có được một giao diện loopback, nhưng đó là một mạng lưới không gian tên cô lập một.

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.