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ę?


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

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


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 .


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.


@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

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ć:


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.