चल रही प्रक्रिया की EUID बदलें


12

लिनक्स पर, मैं कमांड लाइन से रनिंग प्रक्रिया का EUID कैसे बदल सकता हूं (बशर्ते मेरे पास रूट एक्सेस हो)?

जवाबों:


17

यदि प्रक्रिया रूट-विशेषाधिकारों के साथ चल रही है , तो आप प्रक्रिया में gdb संलग्न कर सकते हैं और उस प्रक्रिया के भीतर से सेटआउट कह सकते हैं।

उदाहरण:

[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 ...
quixote

वाह ... हां, यह रचनात्मक है। वास्तव में मैंने डिबगर के साथ प्रक्रिया में संलग्न होने के बारे में नहीं सोचा था। हैकरी "उम्मीद" के एक बिट के साथ, कोई भी "cheuid <processID> <EUID>" को लागू कर सकता है जो कुछ स्थितियों के लिए काम करेगा। विशेष रूप से मेरा मानना ​​है कि gdb का निष्पादन और प्रभावित होने की प्रक्रिया दोनों को मूल होना चाहिए ... इसलिए यह सीमित उपयोगिता का है। AFAIK बस रूट के रूप में gdb चला रहा है, एक गैर-रूट प्रक्रिया से कनेक्ट हो रहा है, सेटाउइड विफल हो जाएगा, क्योंकि यह निष्पादन प्रक्रिया के निजी के साथ चलेगा, न कि डिबगर के निजी के साथ।
18

2

यदि आप अपने स्वयं के EUID को बदलने वाली प्रक्रिया के बारे में बात कर रहे हैं, तो ऐसा करने का एक तरीका है।

  • setuid () - साइड-इफेक्ट के रूप में EUID सेट करता है जब 0 की EUID के साथ एक प्रक्रिया द्वारा उपयोग किया जाता है
  • seteuid ()
  • setreuid ()

कार्यक्रम के प्रभावी यूआईडी पर निर्भर करता है, और क्या कोई बचा हुआ यूआईडी है, आप गैर-रूट प्रोग्राम में दो ईयूआईडी मानों के बीच स्विच करने में सक्षम हो सकते हैं। रूट विशेषाधिकार प्राप्त कार्यक्रम के साथ, आपको सावधान रहना होगा - आपको यह तय करना होगा कि क्या परिवर्तन अपरिवर्तनीय होना चाहिए, और नौकरी के लिए सही फ़ंक्शन का उपयोग करना चाहिए। (सेतु के रूप में) (जड़ के रूप में अपरिवर्तनीय है।)

यदि आप एक ऐसी प्रक्रिया को बदलने की कोशिश कर रहे हैं जो पहले से ही एक अलग प्रक्रिया से चल रही है, तो इसे करने का कोई मानक तरीका नहीं है - और मुझे यकीन नहीं है कि कई गैर-मानक तरीके हैं, या तो। आप / देव / किमीम में कुछ जानकारी डुबोने में सक्षम हो सकते हैं, लेकिन अभिव्यक्ति 'पतली बर्फ' स्प्रिंग्स को ध्यान में रखती है।


2

ऐसा करने का कोई तरीका नहीं है "कमांडलाइन से" बस किसी भी चलने की प्रक्रिया के लिए।

मैं कह सकता हूं कि कुछ सुर के साथ; एकमात्र "हो सकता है" / proc था और मैंने वहां (शाब्दिक रूप से और Google के माध्यम से) चारों ओर पोक किया और ईयूआईडी को बदलने की अनुमति देने वाली किसी भी चीज़ के बारे में / खरीद में एक मृत-अंत में भाग गया। आप यह जान सकते हैं कि यूआईडी और जीआईडी ​​सेटिंग्स / प्रोक / {पीआईडी} / स्टेटस में क्या हैं - लेकिन आप उन्हें इन / प्रू में कुछ भी उपयोग करके नहीं बदल सकते हैं, कम से कम जहां तक ​​मैं बता सकता हूं।

लेकिन उस काम की तरह कुछ बनाना आसान है - एक प्रक्रिया का EUID बदलने का एक तरीका, कमांडलाइन से - यदि आप उस प्रक्रिया के स्रोत कोड को नियंत्रित करते हैं जिसे आप बदलना चाहते हैं। आप SIGUSR1 कहने के लिए एक सिग्नल हैंडलर लागू कर सकते हैं और उस सिग्नल को प्राप्त करते समय प्रक्रिया को अपना EUID बदलना होगा। फिर आप बस उस प्रक्रिया को भेजेंगे जो SIGUSR1 सिग्नल, "मार" के माध्यम से ... कमांडलाइन से, जैसा कि आपने पूछा है ... और यह आपके लिए अपना EUID बदल देगा।

यह वह नहीं हो सकता है जो आप सोच रहे थे, लेकिन ... यह आपके प्रश्न का उत्तर है कि यह कैसे करना है ... और यह एकमात्र ऐसा उत्तर है जिसके बारे में मैं सोच सकता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.