Thay đổi EUID của quy trình đang chạy


12

Trên Linux, làm cách nào tôi có thể thay đổi EUID của quy trình đang chạy từ dòng lệnh (miễn là tôi có quyền truy cập root)?

Câu trả lời:


17

Nếu quy trình đang chạy với quyền root , bạn có thể đính kèm gdb vào quy trình và gọi seteuid từ bên trong quy trình đó.

Thí dụ:

[root@user-desktop ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

[root@user-desktop ~]# gdb /bin/bash $$
GNU gdb Fedora (6.8-27.el5)
# cut copyright & license statements
This GDB was configured as "x86_64-redhat-linux-gnu"...
# cut some initialization output    
0x00000036b0a99335 in waitpid () from /lib64/libc.so.6
(gdb) call seteuid(500)
$1 = 0 
(gdb) quit
The program is running.  Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/bash, process 29017

[root@user-desktop ~]# id
uid=0(root) gid=0(root) euid=500(user) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

3
+1 cho cách tiếp cận sáng tạo để hoàn thành nhiệm vụ ...
quack quixote

Wow ... vâng, đó là sáng tạo. Quả thực tôi đã không nghĩ đến việc gắn vào quy trình với trình gỡ lỗi. Với một chút tin tặc "mong đợi", người ta có thể thực hiện "cheuid <processID> <EUID>" sẽ hoạt động cho MỘT SỐ tình huống. Cụ thể tôi tin rằng cả người thực hiện gdb VÀ quá trình bị ảnh hưởng sẽ phải là root ... vì vậy đây là tiện ích hạn chế. AFAIK chỉ chạy gdb với quyền root, kết nối với tiến trình không root, seteuid sẽ thất bại, vì nó sẽ chạy với các đặc quyền của quá trình thực thi, không phải là riêng tư của trình gỡ lỗi.
pbr

2

Nếu bạn đang nói về một quá trình thay đổi EUID của riêng mình, có rất nhiều cách để làm điều đó.

  • setuid () - như một hiệu ứng phụ đặt EUID khi được sử dụng bởi một quy trình với EUID là 0
  • seteuid ()
  • setreuid ()

Tùy thuộc vào UID hiệu quả của chương trình và liệu có UID đã lưu hay không, bạn có thể chuyển đổi giữa hai giá trị EUID trong chương trình không root. Với một chương trình đặc quyền gốc, bạn phải cẩn thận - bạn phải quyết định xem liệu thay đổi có thể đảo ngược được không, và sử dụng đúng chức năng cho công việc. (Sử dụng setuid () làm root là không thể đảo ngược.)

Nếu bạn đang cố gắng thay đổi một quy trình đã chạy từ một quy trình riêng biệt, thì không có cách tiêu chuẩn nào để thực hiện - và tôi cũng không chắc có nhiều cách không chuẩn. Bạn có thể có thể nhận ra một số thông tin trong / dev / kmem, nhưng biểu hiện 'băng mỏng' xuất hiện trong tâm trí.


2

Không có cách nào để thực hiện việc này "từ dòng lệnh" đến bất kỳ quy trình đang chạy nào.

Tôi có thể nói rằng với một số chắc chắn; "có lẽ" duy nhất là / Proc và tôi chọc vào đó (theo nghĩa đen và qua google) và rơi vào ngõ cụt liên quan đến bất cứ điều gì trong / Proc cho phép thay đổi EUID. Bạn có thể TÌM HIỂU các cài đặt UID và GID trong / Proc / {pid} / status - nhưng bạn không thể thay đổi chúng bằng cách sử dụng bất cứ thứ gì trong / Proc, ít nhất là theo như tôi có thể nói.

Nhưng thật dễ dàng để làm cho một cái gì đó giống như vậy hoạt động - một cách để thay đổi EUID của một quy trình, từ dòng lệnh - nếu bạn kiểm soát mã nguồn của quy trình bạn muốn thay đổi. Bạn có thể triển khai trình xử lý tín hiệu để nói SIGUSR1 và có quy trình thay đổi EUID của chính nó tuy nhiên bạn cần khi nhận được tín hiệu đó. Sau đó, bạn chỉ cần gửi quy trình mà tín hiệu SIGUSR1, thông qua "kill" ... từ dòng lệnh, như bạn đã hỏi ... và nó sẽ thay đổi EUID cho bạn.

Đây có thể không phải là những gì bạn đã nghĩ đến, nhưng ... đó là một câu trả lời cho câu hỏi của bạn về cách thực hiện ... và đó là câu trả lời duy nhất tôi có thể nghĩ ra.

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.