Bagaimana cara menonaktifkan Perlindungan Integritas Sistem (SIP) AKA “tidak menentu” di macOs [OS X]

157

Apple telah memperkenalkan Perlindungan Integritas Sistem , juga dikenal sebagai "tidak menentu", dengan OS X 10.11, El Capitan. Saya mengerti ini adalah langkah untuk perlindungan umum terhadap malware, tetapi sebagai pengembang saya perlu akses tulis ke beberapa file yang dikunci.

Bagaimana cara menonaktifkan perlindungan ini?

bdnchr
sumber
2
Meskipun Anda dapat memperbaiki semua aspek SIP, ada banyak entri untuk ini - ingat bahwa dengan mengkompromikan sistem, Anda sedang membangun hal-hal yang mungkin tidak berjalan di mesin klien Anda, di mana SIP dihidupkan, dan pengguna tidak akan menerima mematikannya
Motti Shneor
5
@Motti Shneor - Namun, dalam beberapa kasus ini perlu diubah hanya untuk memiliki akses tulis untuk menginstal beberapa SDK untuk tujuan pengembangan. Ini tidak akan mengharuskan klien untuk melakukan hal yang sama.
defaultNINJA
Saya berasal dari latar belakang unix, mencoba memahami logika rootless: apakah karena komputer lebih cenderung mesin pengguna tunggal, semuanya akan diinstal di direktori home user, sehingga tidak perlu dipusingkan dengan direktori sistem seperti / usr / share / vim /.
Kemin Zhou

Jawaban:

148

Dokumentasi Apple mencakup penonaktifan SIP, Tentang Perlindungan Integritas Sistem di Mac Anda dan Konfigurasi Perlindungan Integritas Sistem .

Artikel di lifehacker.com mencantumkan langkah-langkah ini:

  1. Reboot Mac Anda ke Mode Pemulihan dengan menyalakan kembali komputer Anda dan menahan Command+ Rhingga logo Apple muncul di layar Anda.
  2. Klik Utilitas> Terminal.
  3. Di jendela Terminal, ketik csrutil disabledan tekan Enter.
  4. Mulai ulang Mac Anda.

Anda dapat memverifikasi apakah file atau folder dibatasi dengan mengeluarkan lsperintah ini menggunakan huruf besar O (dan bukan nol 0) untuk mengubah tanda daftar panjang:

ls -lO /System /usr 

Cari teks terbatas untuk menunjukkan di mana SIP diberlakukan.

Secara default (= SIP diaktifkan), folder berikut dibatasi (lihat halaman Dukungan Apple ):

/System
/usr
/bin
/sbin
Apps that are pre-installed with OS X

... dan folder berikut ini gratis:

/Applications
/Library
/usr/local
Mike Scott
sumber
1
Saya melihat dari berjalan ls -lO /usr/localtidak ditandai dibatasi. Saya juga chownd /usr/local/secara rekursif. Tapi saya terus melihat root mengambil kepemilikan /usr/local/bindan /usr/local/shareyang berdampak pada homebrew. Apakah ini pekerjaan SIP juga?
SaxDaddy
1
@SaxDaddy Selama /usr/localtidak dibatasi, Anda dapat memperbaiki izin "di bawah" direktori ini dengan mudah. Homebrew sebenarnya merekomendasikan untuk menjalankan sudo chown -R $(whoami) /usr/local(saat sedang login sebagai pengguna admin) untuk memperbaiki masalah izin.
nohillside
4
@ MaxDaddy Apakah Anda menggunakan Sophos Anti-Virus, kebetulan? Ada masalah yang diketahui dengan Sophos di mana ia mengubah izin pada direktori tersebut. Menurut utas di forum komunitas mereka , itu harus diselesaikan dalam pembaruan karena "segera".
ND Geek
1
@NDGeek: +1: Brilliant, terima kasih! Anda menyebutnya dengan benar. Dan saya melihat bahwa SAV 9.4.1 (dirilis 18nov15) memperbaiki masalah. Saya telah menginstal versi itu dan mengonfirmasi bahwa /usr/localsekarang izin telah ditetapkan dengan benar.
SaxDaddy
1
@andro The -O bendera tidak masih bekerja di 10.11.6. Jika tidak berhasil untuk Anda, itu masalah terpisah dan Anda harus mengajukan pertanyaan baru.
Mike Scott
105

Dimungkinkan untuk menonaktifkan SIP dengan menjalankan boot ke Recovery HD dan menjalankan perintah berikut:

csrutil disable

masukkan deskripsi gambar di sini

Dimungkinkan juga untuk mengaktifkan perlindungan SIP dan secara selektif menonaktifkan aspek-aspeknya, dengan menambahkan satu atau lebih tanda pada csrutil enableperintah. Semua harus di-boot dari Recovery untuk mengaturnya:

Aktifkan SIP dan izinkan pemasangan ekstensi kernel yang tidak ditandatangani

csrutil enable --without kext

masukkan deskripsi gambar di sini

Aktifkan SIP dan nonaktifkan perlindungan sistem file

csrutil enable --without fs

masukkan deskripsi gambar di sini

Aktifkan SIP dan nonaktifkan pembatasan debugging

csrutil enable --without debug

masukkan deskripsi gambar di sini

Aktifkan SIP dan nonaktifkan pembatasan DTrace

csrutil enable --without dtrace

masukkan deskripsi gambar di sini

Aktifkan SIP dan nonaktifkan pembatasan penulisan untuk NVRAM

csrutil enable --without nvram

masukkan deskripsi gambar di sini

Saya juga memiliki posting yang tersedia dengan informasi lebih lanjut tentang SIP:

Perlindungan Integritas Sistem - Menambahkan lapisan lain ke model keamanan Apple

Trouton yang Kaya
sumber
5
Benar-benar pengetahuan yang luar biasa. Saya mungkin harus menggandakan hadiah ini :-)
bmike
Saya mendapat pesan kesalahan:csrutil: failed to modify system integrity configuration. This tool needs to be executed from the Recovery OS.
IgorGanapolsky
5
@IgorGanapolsky Baca jawabannya. ' nonaktifkan SIP dengan menjalankan boot ke Recovery HD ' .
Brick
13

Jika tujuannya adalah untuk benar-benar menonaktifkan Perlindungan Integritas Sistem kemudian mem-boot ke partisi HD Pemulihan seperti yang sebelumnya direkomendasikan dalam jawaban lain di sini via Command+ rsaat boot bukanlah cara tercepat untuk melakukan ini.

Anda dapat menggabungkan boot mode pengguna tunggal dengan boot HD pemulihan dalam kombinasi kunci startup tanpa dokumen:

Ini membuat Anda masuk ke lingkungan minimum kosong yang diperlukan untuk ini secara langsung .

LangLangC
sumber
7

Akan lebih aman untuk memodifikasi /etc/pathssehingga /usr/local/binhanya sebelumnya usr/bin. Dengan begitu Anda dapat melakukan pekerjaan pengembangan Anda di dalam /usr/local/bintanpa harus menonaktifkan SIP.

Instalasi bersih dari OS telah dipesan /etc/pathsdengan cara ini sejak El Capitan, tetapi jika Anda memperbarui OS dari Yosemite atau sebelumnya, Anda harus memodifikasi urutan jalur secara manual.

pengguna260467
sumber
@iconoclast Sebelum El Capitan, konvensi umum adalah menginstal program usr/bin. Karena SIP mencegah hal ini sekarang, program harus diinstal usr/local/bin, yang tidak dibatasi oleh SIP. Dengan mengutamakan usr/local/bin, pengguna dapat menjalankan program tanpa harus mengetikkan path absolut ke program. Apakah ini masuk akal? Apakah Anda bingung tentang hal lain?
user260467
Saya selalu memahaminya sebagai praktik yang sangat buruk untuk memasukkan sesuatu /usr/bin... tapi saya kira apa yang seharusnya saya tanyakan adalah "bagaimana ini menjawab pertanyaan OP?" Awalnya saya berasumsi bahwa itu memang ada hubungannya, dan saya tidak membuat koneksi. Tetapi sekarang saya sangat ragu apakah itu ada hubungannya.
iconoclast
@iconoclast Saya pikir tidak bertanggung jawab untuk tidak menyebutkan kepada pengembang bahwa mereka seharusnya tidak menonaktifkan SIP hanya untuk mengembangkan aplikasi.
user260467
6

Jika yang Anda butuhkan adalah mengakses / usr / local, lihat halaman ini: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md

Idenya adalah untuk menonaktifkan sementara SIP menggunakan csrutil disable, menambah /usr/local, menggunakan chflags untuk mengatur direktori itu menjadi non-dibatasi

 sudo mkdir /usr/local && sudo chflags norestricted /usr/local && sudo chown -R $(whoami):admin /usr/local

dan kemudian aktifkan kembali SIP menggunakan csrutil enable.

Jika /usr/localsudah ada pada saat upgrade Anda, maka bahkan di atas tidak perlu. Anda cukup berlari

sudo chown -R $(whoami):admin /usr/local
m_cuffa
sumber
Saya terus mendapatkan kesalahan:Read-only file system
IgorGanapolsky
Tautan ini mati: 404 kesalahan.
iconoclast
2

Jika Anda tidak bisa masuk ke Partisi Pemulihan untuk menjalankan csrutil disable(untuk menonaktifkan SIP ), coba atur argumen boot dengan nvramperintah, misalnya

sudo nvram boot-args="rootless=0"

Namun, jika Anda memiliki kesalahan berikut:

nvram: Variabel pengaturan kesalahan - 'boot-args': (iokit / common) tidak diizinkan

maka itu tidak akan berhasil. Anda masih perlu mem-bootnya recovery / safe mode.

Lihat:

kenorb
sumber
nvram: Error setting variable - 'boot-args': (iokit/common) not permitted
mghicks
1
@ ghghicks Dalam hal ini, itu tidak akan berfungsi Saya sudah memperbarui jawabannya.
kenorb