Làm cách nào để tôi vô hiệu hóa Bảo vệ toàn vẹn hệ thống (SIP) AKA Hiện không có gốc root trên macOs [OS X]


157

Apple đã giới thiệu Bảo vệ toàn vẹn hệ thống , còn được gọi là "rootless", với OS X 10.11, El Capitan. Tôi hiểu đây là một bước để bảo vệ chung chống lại phần mềm độc hại nhưng với tư cách là nhà phát triển, tôi cần quyền truy cập ghi vào một số tệp mà nó khóa.

Làm thế nào để tôi vô hiệu hóa bảo vệ này?


2
Mặc dù bạn có thể khắc phục tất cả các khía cạnh SIP, nhưng có rất nhiều mục cho việc này - hãy nhớ rằng bằng cách thỏa hiệp hệ thống, bạn đang xây dựng những thứ không thể chạy trên máy của khách hàng, nơi SIP được bật và người dùng sẽ không chấp nhận tắt
Motti Shneor

5
@Motti Shneor - Tuy nhiên, trong một số trường hợp, điều này cần được chuyển sang chỉ để có quyền truy cập ghi để cài đặt một số SDK cho mục đích phát triển. Điều này sẽ không yêu cầu khách hàng làm tương tự.
defaultNINJA

Tôi đến từ nền tảng unix, cố gắng hiểu logic của rootless: có phải vì máy tính hầu như là máy người dùng đơn lẻ, mọi thứ sẽ được cài đặt trong thư mục nhà của người dùng, do đó không cần phải lộn xộn với thư mục hệ thống chẳng hạn như / usr / share / vim /.
Kemin Zhou

Câu trả lời:


148

Tài liệu của Apple bao gồm việc vô hiệu hóa SIP, Giới thiệu về Bảo vệ toàn vẹn hệ thống trên máy Mac của bạn và Định cấu hình Bảo vệ toàn vẹn hệ thống .

Một bài viết trên lifehacker.com liệt kê các bước sau:

  1. Khởi động lại máy Mac của bạn vào Chế độ khôi phục bằng cách khởi động lại máy tính của bạn và nhấn Command+ Rcho đến khi logo Apple xuất hiện trên màn hình của bạn.
  2. Nhấp vào Tiện ích> Thiết bị đầu cuối.
  3. Trong cửa sổ Terminal, nhập csrutil disablevà nhấn Enter.
  4. Khởi động lại máy Mac của bạn.

Bạn có thể xác minh xem một tệp hoặc thư mục có bị hạn chế hay không bằng cách ban hành lslệnh này bằng cách sử dụng chữ O (chứ không phải 0) để sửa đổi cờ liệt kê dài:

ls -lO /System /usr 

Tìm văn bản bị hạn chế để chỉ ra nơi SIP được thi hành.

Theo mặc định (= bật SIP), các thư mục sau bị hạn chế (xem trang Hỗ trợ của Apple ):

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

... và các thư mục sau là miễn phí:

/Applications
/Library
/usr/local

1
Tôi thấy từ chạy ls -lO /usr/localkhông được đánh dấu hạn chế. Tôi cũng đã theo đuổi /usr/local/đệ quy. Nhưng tôi tiếp tục thấy root chiếm quyền sở hữu /usr/local/bin/usr/local/sharetác động đến homebrew. Đây có phải là công việc của SIP không?
SaxDaddy

1
@SaxDaddy Miễn /usr/locallà không bị hạn chế, bạn có thể sửa bất kỳ quyền nào "bên dưới" thư mục này một cách dễ dàng. Homebrew thực sự khuyên bạn nên chạy sudo chown -R $(whoami) /usr/local(trong khi đăng nhập với tư cách là người dùng quản trị) để khắc phục các sự cố về quyền.
nohillside

4
@SaxDaddy Bạn có đang sử dụng Sophos Anti-Virus không? Có một vấn đề được biết đến với Sophos nơi nó thay đổi quyền trên các thư mục đó. Theo một chủ đề trên các diễn đàn cộng đồng của họ , nó sẽ được giải quyết trong một bản cập nhật do "sớm".
ND Geek

1
@NDGeek: +1: Rực rỡ, cảm ơn bạn! Bạn đã gọi nó một cách chính xác. Và tôi thấy rằng SAV 9.4.1 (phát hành 18nov15) đã khắc phục vấn đề. Tôi đã cài đặt phiên bản đó và xác nhận rằng /usr/localbây giờ đã có quyền được đặt chính xác.
SaxDaddy

1
@andro Lá cờ -O không vẫn làm việc trong 10.11.6. Nếu nó không phù hợp với bạn, đó là một vấn đề riêng biệt và bạn nên đặt một câu hỏi mới.
Mike Scott

105

Có thể tắt SIP bằng cách khởi động vào Recovery HD và chạy lệnh sau:

csrutil disable

nhập mô tả hình ảnh ở đây

Cũng có thể kích hoạt bảo vệ SIP và vô hiệu hóa có chọn lọc các khía cạnh của nó, bằng cách thêm một hoặc nhiều cờ vào csrutil enablelệnh. Tất cả yêu cầu được khởi động từ Recovery để đặt chúng:

Kích hoạt SIP và cho phép cài đặt các phần mở rộng kernel không dấu

csrutil enable --without kext

nhập mô tả hình ảnh ở đây

Kích hoạt SIP và vô hiệu hóa bảo vệ hệ thống tập tin

csrutil enable --without fs

nhập mô tả hình ảnh ở đây

Kích hoạt SIP và vô hiệu hóa các hạn chế gỡ lỗi

csrutil enable --without debug

nhập mô tả hình ảnh ở đây

Kích hoạt SIP và vô hiệu hóa các hạn chế DTrace

csrutil enable --without dtrace

nhập mô tả hình ảnh ở đây

Kích hoạt SIP và vô hiệu hóa các hạn chế khi ghi vào NVRAM

csrutil enable --without nvram

nhập mô tả hình ảnh ở đây

Tôi cũng có một bài đăng có sẵn với nhiều thông tin hơn về SIP:

Bảo vệ toàn vẹn hệ thống - Thêm một lớp khác vào mô hình bảo mật của Apple


5
Thật là một sự giàu có của kiến ​​thức. Tôi có thể phải tăng gấp đôi số tiền thưởng này :-)
bmike

Tôi gặp lỗi:csrutil: failed to modify system integrity configuration. This tool needs to be executed from the Recovery OS.
IgorGanapolsky

5
@IgorGanapolsky Đọc câu trả lời. ' Vô hiệu hóa SIP bằng cách khởi động vào Recovery HD ' .
Gạch

13

Nếu mục tiêu là thực sự chỉ cần vô hiệu hóa Bảo vệ toàn vẹn hệ thống thì việc khởi động vào phân vùng Recovery HD như được đề xuất trước đây trong các câu trả lời khác ở đây thông qua Command+ ron boot không phải là cách nhanh nhất để làm điều này.

Bạn có thể kết hợp khởi động chế độ người dùng đơn với khởi động HD phục hồi trong tổ hợp phím khởi động không có giấy tờ:

Điều này giúp bạn chỉ cần vào môi trường tối thiểu cần thiết cho việc này trực tiếp .


7

Nó sẽ an toàn hơn để sửa đổi /etc/pathsđể /usr/local/binchỉ là trước đây usr/bin. Bằng cách đó bạn có thể thực hiện công việc phát triển của mình /usr/local/binmà không phải tắt SIP.

Các bản cài đặt sạch của HĐH đã ra lệnh /etc/pathstheo cách này kể từ El Capitan, nhưng nếu bạn đang nâng cấp HĐH từ Yosemite trở về trước, bạn phải sửa đổi thứ tự đường dẫn theo cách thủ công.


@iconoclast Trước El Capitan, một quy ước chung là cài đặt các chương trình usr/bin. Vì SIP ngăn chặn điều này ngay bây giờ, các chương trình nên được cài đặt usr/local/bin, không bị hạn chế bởi SIP. Bằng cách đặt usr/local/binđầu tiên, người dùng có thể chạy các chương trình mà không cần phải nhập đường dẫn tuyệt đối đến chương trình. Điều này có nghĩa không? Bạn đang bối rối về một cái gì đó khác?
dùng260467

Tôi luôn hiểu rằng đó là một thực tế rất tệ khi đặt bất cứ thứ gì vào /usr/bin... nhưng tôi đoán điều tôi nên hỏi là "làm thế nào để trả lời câu hỏi của OP?" Ban đầu tôi cho rằng nó đã được thực hiện theo một cách nào đó và tôi chỉ không thực hiện kết nối. Nhưng bây giờ tôi rất nghi ngờ rằng nó có bất kỳ kết nối nào.
iconoclast

@iconoclast Tôi nghĩ rằng sẽ không có trách nhiệm nếu không đề cập đến nhà phát triển rằng họ thực sự không nên vô hiệu hóa SIP chỉ để phát triển một ứng dụng.
dùng260467

6

Nếu tất cả những gì bạn cần là truy cập / usr / local, hãy xem trang này: https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md

Ý tưởng là tạm thời vô hiệu hóa SIP bằng cách sử dụng csrutil disable, thêm /usr/local, sử dụng chflags để đặt thư mục đó thành không bị hạn chế

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

và sau đó kích hoạt lại SIP bằng cách sử dụng csrutil enable.

Nếu /usr/localđã tồn tại tại thời điểm nâng cấp của bạn, thì ngay cả những điều trên cũng không cần thiết. Bạn chỉ có thể chạy

sudo chown -R $(whoami):admin /usr/local

Tôi liên tục nhận được một lỗi:Read-only file system
IgorGanapolsky

Liên kết này đã chết: lỗi 404.
iconoclast

2

Nếu bạn không thể vào Phân vùng khôi phục để chạy csrutil disable(để tắt SIP ), hãy thử đặt boot args bằng nvramlệnh, vd

sudo nvram boot-args="rootless=0"

Tuy nhiên, nếu bạn gặp phải lỗi sau:

nvram: Biến cài đặt lỗi - 'boot-args': (iokit / common) không được phép

sau đó nó sẽ không hoạt động. Bạn vẫn cần phải khởi động nó chế độ phục hồi / an toàn.

Xem:


nvram: Error setting variable - 'boot-args': (iokit/common) not permitted
mghicks

1
@mghicks Trong trường hợp đó, nó sẽ không hoạt động. Tôi đã cập nhật câu trả lời.
kenorb

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.