เข้าถึง /ส่วนตัว/ฯลฯ ด้วย c

นี่อาจเป็นคำถามง่ายๆ แต่ฉันจะ "ขอ" ระบบ / สิทธิพิเศษรูทจากผู้ใช้ในแอปพลิเคชันคอนโซล c ได้อย่างไร ฉันต้องเขียนถึง /Private/etc แต่ทำไม่ได้ นี่สำหรับ mac / unix

ฉันเคยเห็นมันถูกใช้ในคำสั่งคอนโซลอื่นเช่น เมื่อคุณรันคำสั่งต่อไปนี้: "sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder" Terminal จะขอรหัสผ่านจากคุณ ฉันจะทำอย่างไร?

ขอบคุณ JNK


person JNK    schedule 29.12.2010    source แหล่งที่มา
comment
ฉันพบวิธีแก้ไขโดยเพียงแค่รันคำสั่ง sudo /path/to/my/c/file...   -  person JNK    schedule 29.12.2010


คำตอบ (3)


ไม่มีการเรียกของระบบซึ่งจะทำให้กระบวนการได้รับสิทธิ์รูท คุณอาจคาดหวังว่า seteuid จะทำงานในลักษณะนี้ แต่สามารถใช้ได้โดยกระบวนการที่มีกระบวนการรูทเท่านั้น (กระบวนการที่ไม่มีสิทธิพิเศษสามารถตั้งค่า euid เท่ากับ uid เท่านั้น)

sudo เป็นพิเศษเนื่องจากไฟล์ปฏิบัติการมีสิทธิ์ setuid ซึ่งหมายความว่าเมื่อ sudo ถูกรัน มันจะรันในฐานะผู้ใช้ที่เป็นเจ้าของ (root) แทนที่จะเป็นผู้ใช้ที่รันมัน sudo สามารถยืนยันได้ว่าคุณมีสิทธิ์เข้าถึงรูทโดยการตรวจสอบรหัสผ่านของคุณและอ่านไฟล์การกำหนดค่า หากการตรวจสอบสำเร็จ ระบบจะเรียก fork และ execve เพื่อดำเนินการคำสั่งที่คุณร้องขอ

หากต้องการรับสิทธิ์รูทภายในแอปพลิเคชันที่ไม่มีสิทธิ์ คุณจะต้องข้ามขั้นตอนบางอย่างไป คุณสามารถใช้ fork/execve เพื่อเรียก sudo สำหรับคำสั่งของคุณเอง เมื่อตรวจสอบสิทธิ์แล้ว คุณจะมีกระบวนการลูกที่มีสิทธิพิเศษ คุณสามารถส่งอาร์กิวเมนต์พิเศษหรือตัวแปรสภาพแวดล้อมเพื่อให้กระบวนการย่อยสามารถข้ามไปยังโค้ดที่มีวัตถุประสงค์เพื่อให้ได้รับสิทธิพิเศษ กระบวนการหลักจะรอให้กระบวนการย่อยเสร็จสิ้น

person Jay Conrod    schedule 29.12.2010

วิธีทำสิ่งที่คุณต้องการบน Mac คือเขียน "แอปพลิเคชันแยกตัวประกอบ" ซึ่งประกอบด้วยส่วนที่รันโดยผู้ใช้และส่วนที่ทำงานพิเศษ ติดตั้งส่วนที่มีสิทธิ์ในระบบ launchd โดเมน และให้เครื่องมือผู้ใช้เรียกใช้งานที่ต้องการสิทธิ์พิเศษ

คุณต้องตรวจสอบให้แน่ใจว่ามีเพียงการใช้ตัวช่วยที่มีสิทธิพิเศษเท่านั้นที่ได้รับอนุญาต และคุณทำได้โดยใช้ บริการให้สิทธิ์ ในเครื่องมือผู้ใช้ คุณจะได้รับ "สิทธิ์" ซึ่งคุณจะแปลงเป็นรูปแบบภายนอกและส่งผ่านไปยังผู้ช่วย เครื่องมือช่วยเหลือควรตรวจสอบว่ามีสิทธิ์อย่างถูกต้องก่อนที่จะพยายามทำงานที่ได้รับสิทธิพิเศษ

อีกทางเลือกหนึ่งคือเขียนเครื่องมือทั้งหมดให้ล้มเหลวอย่างสวยงาม (ซึ่งคุณต้องทำไม่ว่าในกรณีใด) และขอให้ผู้ใช้เรียกใช้ผ่าน sudo หากพวกเขาต้องการการเข้าถึงแบบสิทธิพิเศษ นั่นคือวิธีการทำงานของ UNIX ที่เหลือ

person Community    schedule 29.12.2010

สำหรับระบบ UNIX คุณจะต้องมีแฟล็ก setuid บนโปรแกรมของคุณ และควรตรวจสอบ /etc/passwd และ /etc/shadow เพื่อดูข้อมูลรับรองที่ถูกต้อง ฉันเชื่อว่าฟังก์ชัน crypt(3) ใช้สำหรับการแฮชรหัสผ่าน ไม่แน่ใจเรื่องแม็กครับ

person atx    schedule 29.12.2010
comment
ไม่ต้องพูดถึงว่าสิ่งนี้ดูเหมือนจะไม่เกี่ยวข้องกับคำถามซึ่งเกี่ยวกับการแสดงกล่องโต้ตอบ sudo - person David Thornley; 29.12.2010
comment
อืม ฉันลืมบอกไปว่าคุณสามารถใช้ getpass() (ซึ่งเลิกใช้งานจริงแล้ว) เพื่อลบเสียงสะท้อนของอักขระที่ป้อนในเทอร์มินัลในขณะที่พิมพ์รหัสผ่าน - person atx; 30.12.2010