Jak wyłączyć AKA „rootless” ochrony integralności systemu (SIP) w systemie MacOs [OS X]

156

Firma Apple wprowadziła System Integrity Protection , znany również jako „rootless”, z systemem OS X 10.11, El Capitan. Rozumiem, że jest to krok do ogólnej ochrony przed złośliwym oprogramowaniem, ale jako programista potrzebuję dostępu do zapisu do niektórych blokowanych plików.

Jak wyłączyć tę ochronę?

bdnchr
źródło
2
Mimo że możesz naprawić wszystkie aspekty SIP, jest na to mnóstwo wpisów - pamiętaj, że narażając system, budujesz rzeczy, które mogą nie działać na komputerze klienta, na którym SIP jest włączony, a użytkownicy nie zaakceptują jego wyłączenia
Motti Shneor
5
@Motti Shneor - Jednak w niektórych przypadkach należy to wyłączyć, aby mieć dostęp do zapisu w celu zainstalowania niektórych zestawów SDK do celów programistycznych. Nie wymagałoby to od klienta, aby zrobił to samo.
domyślnie NINJA
Pochodzę z środowiska uniksowego, próbując zrozumieć logikę rootless: czy to dlatego, że komputer jest najczęściej maszyną jednego użytkownika, wszystko zostanie zainstalowane w katalogu osobistym użytkownika, aby nie trzeba było bałagać się w katalogu systemowym takich jak / usr / share / vim /.
Kemin Zhou,

Odpowiedzi:

147

Dokumentacja Apple obejmuje wyłączenie SIP, ochronę integralności systemu na komputerze Mac i konfigurację ochrony integralności systemu .

Artykuł na lifehacker.com wymienia następujące kroki:

  1. Uruchom ponownie komputer Mac w trybie odzyskiwania, ponownie uruchamiając komputer i przytrzymując przycisk Command+, Raż logo Apple pojawi się na ekranie.
  2. Kliknij Narzędzia> Terminal.
  3. W oknie Terminal wpisz csrutil disablei naciśnij Enter.
  4. Uruchom ponownie komputer Mac.

Możesz sprawdzić, czy plik lub folder jest ograniczony, wydając to lspolecenie, używając dużej litery O (a nie zero 0) w celu zmodyfikowania flagi długiego wpisu:

ls -lO /System /usr 

Poszukaj tekstu z ograniczeniami, aby wskazać, gdzie wymuszany jest SIP.

Domyślnie (= włączone SIP) następujące foldery są ograniczone (patrz strona pomocy technicznej Apple ):

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

... a następujące foldery są bezpłatne:

/Applications
/Library
/usr/local
Mike Scott
źródło
1
Widzę, że bieganie ls -lO /usr/localnie jest oznaczone jako ograniczone. Też chownd /usr/local/rekurencyjnie. Ale ciągle widzę, jak root przejmuje własność /usr/local/bini /usr/local/shareco wpływa na homebrew. Czy to także dzieło SIP?
SaxDaddy,
1
@SaxDaddy O ile /usr/localnie jest to ograniczone, możesz łatwo naprawić wszelkie uprawnienia „poniżej” tego katalogu. Homebrew faktycznie zaleca uruchamianie sudo chown -R $(whoami) /usr/local(podczas logowania jako użytkownik admin), aby naprawić problemy z uprawnieniami.
nohillside
4
@SaxDaddy Czy przypadkiem używasz Sophos Anti-Virus? Znany jest problem z Sophos, który zmienia uprawnienia w tych katalogach. Zgodnie z wątkiem na forach społecznościowych problem powinien zostać rozwiązany w aktualizacji, która ma zostać opublikowana „wkrótce”.
ND Geek
1
@NDGeek: +1: Genialne, dziękuję! Nazwałeś to poprawnie. I widzę, że SAV 9.4.1 (wydany 18nov15) rozwiązał problem. Mam tę wersję zainstalowaną i potwierdziłem, że /usr/localteraz uprawnienia są ustawione poprawnie.
SaxDaddy,
1
@andro flaga -O ma nadal pracować w 10.11.6. Jeśli to nie działa, jest to osobny problem i powinieneś zadać nowe pytanie.
Mike Scott
104

Możliwe jest wyłączenie SIP poprzez uruchomienie do Recovery HD i uruchomienie następującego polecenia:

csrutil disable

wprowadź opis zdjęcia tutaj

Możliwe jest również włączenie ochrony SIP i wybiórcze wyłączenie niektórych jego aspektów poprzez dodanie jednej lub więcej flag do csrutil enablepolecenia. Wszystkie wymagają uruchomienia z Recovery, aby je ustawić:

Włącz SIP i zezwól na instalację niepodpisanych rozszerzeń jądra

csrutil enable --without kext

wprowadź opis zdjęcia tutaj

Włącz SIP i wyłącz zabezpieczenia systemu plików

csrutil enable --without fs

wprowadź opis zdjęcia tutaj

Włącz SIP i wyłącz ograniczenia debugowania

csrutil enable --without debug

wprowadź opis zdjęcia tutaj

Włącz SIP i wyłącz ograniczenia DTrace

csrutil enable --without dtrace

wprowadź opis zdjęcia tutaj

Włącz SIP i wyłącz ograniczenia zapisu do NVRAM

csrutil enable --without nvram

wprowadź opis zdjęcia tutaj

Mam również dostępny post z dodatkowymi informacjami na temat SIP:

Ochrona integralności systemu - dodanie kolejnej warstwy do modelu bezpieczeństwa Apple

Rich Trouton
źródło
5
Cóż za mile widziane bogactwo wiedzy.
Być
csrutil: failed to modify system integrity configuration. This tool needs to be executed from the Recovery OS.
Pojawia
5
@IgorGanapolsky Przeczytaj odpowiedź. wyłącz SIP poprzez uruchomienie do Recovery HD .
Cegła
13

Jeśli celem jest tak naprawdę wyłączenie ochrony integralności systemu, to uruchomienie systemu na partycji Recovery HD, jak wcześniej zalecono w innych odpowiedziach tutaj za pomocą Command+ rpodczas rozruchu, nie jest najszybszym sposobem na to.

Możesz połączyć rozruch w trybie pojedynczego użytkownika z uruchomieniem odzyskiwania HD w nieudokumentowanej kombinacji klucza uruchamiania:

To prowadzi Cię do absolutnie minimalnego środowiska, które jest potrzebne do tego bezpośrednio .

LangLangC
źródło
7

Bezpieczniej byłoby zmodyfikować, /etc/pathsaby to /usr/local/binbyło dopiero wcześniej usr/bin. W ten sposób możesz wykonywać prace programistyczne /usr/local/binbez wyłączania SIP.

Czyste instalacje systemu operacyjnego zamówiły w /etc/pathsten sposób od El Capitan, ale jeśli aktualizujesz system operacyjny z Yosemite lub wcześniejszej wersji, musisz ręcznie zmienić kolejność ścieżek.

użytkownik260467
źródło
@iconoclast Przed El Capitan powszechną konwencją było instalowanie programów usr/bin. Ponieważ SIP zapobiega temu teraz, należy zainstalować programy usr/local/bin, które nie są ograniczone przez SIP. Stawiając na usr/local/binpierwszym miejscu, użytkownicy mogą uruchamiać programy bez konieczności wpisywania bezwzględnej ścieżki do programu. Czy to ma sens? Czy jesteś zdezorientowany czymś innym?
user260467
Zawsze rozumiałem, że umieszczanie czegokolwiek jest bardzo złą praktyką /usr/bin... ale sądzę, że powinienem był zapytać: „w jaki sposób odpowiedź na pytanie OP?” Początkowo zakładałem, że tak się stało i że po prostu nie nawiązałem połączenia. Ale teraz bardzo wątpię, czy ma to jakikolwiek związek.
iconoclast
@iconoclast Myślę, że nieodpowiedzialne byłoby nie wspominanie programistom, że tak naprawdę nie powinni wyłączać SIP tylko po to, aby opracować aplikację.
user260467
6

Jeśli potrzebujesz tylko dostępu do / usr / local, spójrz na tę stronę: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md

Chodzi o to, aby tymczasowo wyłączyć SIP za pomocą csrutil disable, dodaj /usr/local, użyj chflags, aby ustawić ten katalog na nieograniczony

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

a następnie ponownie włącz SIP za pomocą csrutil enable.

Jeśli /usr/localistnieje już w momencie aktualizacji, nawet powyższe nie jest konieczne. Możesz po prostu biegać

sudo chown -R $(whoami):admin /usr/local
m_cuffa
źródło
Ciągle Read-only file system
pojawia
Ten link jest martwy: błąd 404.
iconoclast
2

Jeśli nie możesz dostać się do Partycji odzyskiwania, aby uruchomić csrutil disable(aby wyłączyć SIP ), spróbuj ustawić argumenty rozruchowe za pomocą nvrampolecenia, np

sudo nvram boot-args="rootless=0"

Jeśli jednak występuje następujący błąd:

nvram: Błąd ustawiania zmiennej - 'boot-args': (iokit / common) jest niedozwolony

to nie zadziała. Nadal musisz uruchomić go w trybie odzyskiwania / awaryjnym.

Widzieć:

kenorb
źródło
nvram: Error setting variable - 'boot-args': (iokit/common) not permitted
mghicks
1
@mghicks W takim przypadku nie będzie działać. Zaktualizowałem odpowiedź.
kenorb