กระบวนการ superuser สามารถเปลี่ยน ID ผู้ใช้จริงและ ID กลุ่มของกระบวนการไม่ตรงกับในไฟล์รหัสผ่าน?


11

จาก APUE

ID ผู้ใช้จริงและ ID กลุ่มจริงของกระบวนการระบุว่าเราเป็นใคร ทั้งสองฟิลด์นี้นำมาจากรายการของเราในรหัสผ่านเมื่อเราเข้าสู่ระบบโดยปกติค่าเหล่านี้จะไม่เปลี่ยนแปลงในระหว่างการเข้าสู่ระบบแม้ว่าจะมีวิธีสำหรับ กระบวนการ superuser ในการเปลี่ยน

กระบวนการ superuser สามารถเปลี่ยน ID ผู้ใช้จริงและ ID กลุ่มจริงของกระบวนการดังนั้นความสัมพันธ์ระหว่าง ID ผู้ใช้จริงและ ID กลุ่มจริงไม่ตรงกับที่อยู่ในไฟล์รหัสผ่านหรือไม่ ตัวอย่างเช่นหากผู้ใช้Timไม่ได้เป็นสมาชิกของกลุ่มoceanต่อไฟล์รหัสผ่านกระบวนการ superuser สามารถเปลี่ยน ID ผู้ใช้จริงและ ID กลุ่มจริงของกระบวนการเป็นTimและoceanตามลำดับได้หรือไม่?


5
การชี้แจงที่สำคัญอย่างหนึ่งที่นี่: กระบวนการที่ทำงานด้วยสิทธิ์ผู้ใช้ระดับสูงมีความสามารถในการเปลี่ยนUID และ GID ของตัวเองไม่ใช่ของกระบวนการอื่น
filbranden

ที่เป็นประโยชน์ - stackoverflow.com/questions/8499296/...
slm

ฐานข้อมูลข้อมูลผู้ใช้เป็น userland อย่างแท้จริง เคอร์เนลสนใจเฉพาะเกี่ยวกับ UID และ GID ไม่ใช่ฐานข้อมูลผู้ใช้หรือกลุ่ม
炸鱼薯条德里克

คำตอบ:


15

ใช่กระบวนการ superuser สามารถเปลี่ยน ID ผู้ใช้จริงและ ID กลุ่มจริงเป็นค่าใด ๆ ที่ต้องการ ค่าใน/etc/passwdและ/etc/shadowเป็นการกำหนดค่าสำหรับค่าที่ควรตั้งค่า แต่ไม่ จำกัด เฉพาะค่าที่เป็นไปได้

แก้ไข # 1

หมายถึงโปรแกรมที่ชอบloginอ่านค่าจากไฟล์ดังนั้นไฟล์จึงเป็นไฟล์กำหนดค่าหรือไฟล์อินพุต พวกเขาไม่ได้มีข้อ จำกัด ในสิ่งที่โปรแกรมสามารถทำได้ กระบวนการ superuser สามารถส่งผ่านค่าใด ๆ ไปยังเคอร์เนลและเคอร์เนลจะไม่ตรวจสอบไฟล์ใด ๆ

โปรแกรมสามารถโทรได้

setgid (54321);
setuid (12345);

และสิ่งนี้จะใช้งานได้แม้ว่าจะไม่มีการกล่าวถึง id ในไฟล์ใด ๆ ก็ตาม


9

ไฟล์รหัสผ่านและไฟล์กลุ่มไม่ได้อ่านพวกเขาจะอ่านโดยกระบวนการเข้าสู่ระบบเพื่อตั้งค่า ID ผู้ใช้จริงและรหัสกลุ่มจริง

ไม่มีสิ่งใดในเคอร์เนลที่กล่าวถึงไฟล์เหล่านี้ เข้าสู่ระบบจะต้องเปิดไฟล์ประมวลผลและตั้งค่าทั้งสอง ID สามารถเขียนต่างกันเพื่อรับรหัสเหล่านี้จากที่อื่น เช่นจากฐานข้อมูลเครือข่าย

กระบวนการใด ๆ ที่มีความสามารถ CAP_SETUID สามารถตั้งค่า ID เหล่านี้ได้รูทมีความสามารถนี้

โมเดลความปลอดภัยใน Unix เป็นส่วนที่นำมาใช้ในเคอร์เนลและส่วนที่นำมาใช้ในกระบวนการที่ทำงานด้วยความสามารถในการยกระดับ (เช่นเป็นราก)


โปรดทราบว่า/etc/passwdและ/etc/groupยังมีการอ่านโดยls, psและโปรแกรมอื่น ๆ ที่ตอบสนองความต้องการในการแปลชื่อผู้ใช้ / กลุ่ม / จากผู้ใช้รหัสกลุ่ม / (พวกเขาอาจทำสิ่งนี้ผ่านห้องสมุดมากกว่ารู้เกี่ยวกับวิธีการอื่นในการจัดเก็บรายละเอียดเหล่านี้)


1
พวกเขา ( /etc/passwd, /etc/groups) นอกจากนี้ยังมีการอ่านโดยกระบวนการที่ต้องการที่จะแสดงหรือชื่อผู้ใช้กระบวนการแทนภายในตัวเลขรหัสเช่นและps ls
Jonas Schäfer

3

เหนือสิ่งอื่นใดวัตถุประสงค์ของการ/etc/passwdคือการแปลของผู้ใช้ชื่อไปยังผู้ใช้UID หากคุณไม่สนใจว่า UID ของ bob คืออะไรคุณไม่จำเป็นต้องใช้ไฟล์นั้น หากคุณเพียงต้องการเปลี่ยนเป็น UID / GID เองให้ใช้ syscalls ที่เกี่ยวข้อง:

int setuid(uid_t uid);
int setgid(gid_t gid);

โปรดทราบว่ากระบวนการที่มีสิทธิพิเศษพร้อมกับCAP_SETUIDและCAP_SETGID ความสามารถ (ซึ่งโดยทั่วไปกระบวนการรูท) สามารถเปลี่ยน UID และ GID ของตัวเองได้เท่านั้นไม่ใช่กระบวนการทำงานอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.