Akses /Private/etc dengan c

ini mungkin pertanyaan sederhana, tetapi bagaimana cara "meminta" hak istimewa sistem/root dari pengguna di aplikasi konsol c. Saya perlu menulis ke /Private/etc tetapi saya tidak bisa. Ini untuk Mac/Unix.

Saya pernah melihatnya digunakan di perintah konsol lain, mis. ketika Anda menjalankan perintah berikut: "sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder", Terminal menanyakan Kata Sandi Anda. Bagaimana saya melakukan ini?

terima kasih, JNK


person JNK    schedule 29.12.2010    source sumber
comment
Saya menemukan solusinya hanya dengan menjalankan perintah Sudo /path/to/my/c/file...   -  person JNK    schedule 29.12.2010


Jawaban (3)


Tidak ada panggilan sistem yang memungkinkan suatu proses mendapatkan hak akses root. Anda mungkin mengharapkan seteuid bekerja dengan cara ini, tetapi ini hanya dapat digunakan oleh proses dengan proses root (proses yang tidak memiliki hak istimewa hanya dapat mengatur euid sama dengan uid).

sudo istimewa karena file yang dapat dieksekusi memiliki izin setuid. Artinya ketika sudo dijalankan, ia dijalankan sebagai pengguna yang memilikinya (root) dan bukan sebagai pengguna yang menjalankannya. sudo dapat memverifikasi bahwa Anda memiliki akses root dengan memeriksa kata sandi Anda dan membaca file konfigurasi. Jika pemeriksaan berhasil, ia akan memanggil fork dan execve untuk menjalankan perintah yang Anda minta.

Untuk mendapatkan hak istimewa root dalam aplikasi yang tidak memiliki hak istimewa, Anda harus melewati beberapa rintangan. Anda dapat menggunakan fork/execve untuk memanggil sudo untuk perintah Anda sendiri. Setelah diautentikasi, Anda akan memiliki proses anak yang memiliki hak istimewa. Anda dapat memberikan argumen khusus atau variabel lingkungan sehingga proses anak dapat melompat ke kode yang dimaksudkan untuk mendapatkan hak istimewa. Proses induk hanya akan menunggu proses anak selesai.

person Jay Conrod    schedule 29.12.2010

Cara untuk melakukan apa yang Anda inginkan pada Mac adalah menulis "aplikasi yang difaktorkan", yang terdiri dari bagian yang dijalankan oleh pengguna dan bagian yang melakukan tugas istimewa. Instal bagian istimewa di domain sistem launchd, dan dapatkan alat pengguna untuk memanggilnya untuk pekerjaan yang memerlukan izin khusus.

Anda perlu memastikan bahwa hanya penggunaan resmi dari pembantu yang memiliki hak istimewa yang dapat terjadi, dan Anda melakukannya menggunakan Layanan Otorisasi. Di alat pengguna, Anda memperoleh "hak", yang kemudian Anda ubah menjadi bentuk eksternal dan meneruskannya ke pembantu. Alat pembantu harus memverifikasi bahwa alat tersebut memiliki hak yang benar sebelum mencoba melakukan pekerjaan istimewa.

Opsi lainnya adalah menulis seluruh alat agar gagal dengan baik (yang harus Anda lakukan dalam kedua kasus), dan meminta pengguna untuk menjalankannya melalui sudo jika mereka memerlukan akses istimewa. Begitulah cara kerja UNIX lainnya.

person Community    schedule 29.12.2010

Untuk sistem UNIX, Anda harus memiliki flag setuid pada program Anda, dan program tersebut harus memeriksa /etc/passwd dan /etc/shadow untuk kredensial yang valid. Saya yakin fungsi crypt(3) digunakan untuk hashing kata sandi. Tidak yakin tentang Mac.

person atx    schedule 29.12.2010
comment
Belum lagi hal ini tampaknya tidak relevan dengan pertanyaan tentang menampilkan dialog sudo. - person David Thornley; 29.12.2010
comment
Mmmm, ya, saya lupa menyebutkan bahwa Anda dapat menggunakan getpass() (yang sebenarnya sudah tidak digunakan lagi) untuk menghapus gema karakter yang dimasukkan di terminal, saat kata sandi diketik. - person atx; 30.12.2010