Vượt qua phân quyền Unix
Thông thường, các tập tin /System/
của macOS được bảo vệ bởi hệ thống phân quyền của Unix và chỉ có thể được chỉnh sửa với quyền root:
sudo edit /System/what-ever
Vượt qua SIP
Kể từ OS X El Capital, Apple bổ sung một lớp bảo vệ bổ sung được gọi là System Integrity Protection (SIP). SIP vô hiệu hóa khả năng chỉnh sửa các tập tin:
/System
/usr
/bin
/sbin
/var
- …và các app built-it của MacOS
SIP có thể được vô hiệu hóa bằng cách khởi động OS X ở chế độ recovery, sau đó sử dụng command csrutil
:
csrutil disable
Khởi động lại máy tính và thực hiện chỉnh sửa. SIP sau đó nên được bật lại như ban đầu:
csrutil enable
Vượt qua Read-only mounting
macOS Catalina tiếp tục bổ sung một lớp bảo vệ nữa cho các tập tin hệ thống. Giờ đây chúng được đặt trong một phân vùng riêng và được mount với cơ chế read-only. Một đòn đánh chí tử vào các tiến trình độc hại – bởi mount là một cơ chế lõi của các hệ thống *nix và đã được hoàn thiện qua rất nhiều năm phát triển, rất không-dễ-gì-tấn-công.
Lúc này, để có thể thực hiện chỉnh sửa các tập tin hệ thống, ngoài việc vô hiệu hóa SIP như ở trên, còn cần thực hiện lại phép mount với cơ chế read-write:
sudo mount -uw /
Hệ điều hành sẽ thực hiện mount /System
với cơ chế read-only mỗi khi khởi động. Do đó không cần thực hiện thêm thao tác revert nào cả.
Vượt qua Signed System Volume
Bên cạnh tất cả các lớp bảo mật trên, macOS Big Sur bổ sung thêm một thách thức nữa cho thao tác chỉnh sửa /System
: Signed System Volume (SSV).
Theo cơ chế này, mỗi phân vùng hệ thống của Big Sur giờ đây có một hệ thống mã băm SHA-256, bao phủ từ thư mục sâu nhất lên tới tận thư mục root, chúng được gọi là tem, và được sử dụng trong một cơ chế tương tự như các cơ chế kiểm tra bảo toàn dữ liệu thông dụng. Nếu tem bị xé, macOS sẽ không boot nữa.
Phức tạp hơn nữa, tất cả các tiến trình ở lớp trên của kernel không thực sự nhìn thấy phân vùng chứa dữ liệu gốc, mà nhìn thấy một snapshot (ảnh chụp) của phân vùng gốc. Giả sử một tiến trình cố gắng để chỉnh sửa được trên snapshot, thì phân vùng gốc (cùng với tem của nó) vẫn được bảo toàn, và phép kiểm tra tem lần tiếp theo sẽ ngay lập tức thất bại.
Cách duy nhất để tiếp cận được với dữ liệu hệ thống gốc là mount phân vùng gốc. Và nếu muốn các chỉnh sửa không làm thao tác check tem thất bại thì sẽ cần tạo lại một ảnh snapshot khác (sau khi chỉnh sửa xong) và mồi cho OS boot lên bằng ảnh snapshot mới.
Về cách thức triển khai, trước tiên cần vô hiệu hóa cơ chế kiểm tra tem bằng cách sử dụng phần mở rộng authenticated-root
của công cụ csrutil
:
csrutil authenticated-root disable
Khởi động lại máy tính, tìm cách mount phân vùng dữ liệu gốc dưới cơ chế read-write. Trước tiên, chạy lệnh mount
để tìm tên của volume đang được mount vào /
:
$ sudo mount
/dev/disk1s5s1 on / (apfs, sealed, local, read-only, journaled)
devfs on /dev (devfs, local, nobrowse)
/dev/disk1s4 on /System/Volumes/VM (apfs, local, noexec, journaled, noatime, nobrowse)
/dev/disk1s2 on /System/Volumes/Preboot (apfs, local, journaled, nobrowse)
/dev/disk1s6 on /System/Volumes/Update (apfs, local, journaled, nobrowse)
/dev/disk1s1 on /System/Volumes/Data (apfs, local, journaled, nobrowse)
map auto_home on /System/Volumes/Data/home (autofs, automounted, nobrowse)
drivefs on /Volumes/GoogleDrive (dfsfuse_DFS, local, nodev, nosuid, synchronous, mounted by _)
disk1s5s1
đang được mount vào /
, tên của phân vùng dữ liệu gốc nằm bên dưới nó sẽ là disk1s5
. Sử dụng diskutil
để mount phân vùng này:
$ sudo diskutil mount disk1s5
Volume macOS on disk1s5 mounted
Nếu disk1s5s1
được mount dưới tên macOS
thì phân vùng gốc sẽ được mount dưới tên là macOS 1
, mount point sẽ là /Volumes/macOS\ 1
. Đó là vị trí cần thực hiện chỉnh sửa.
cd /Volumes/macOS\ 1/System/
...
Sau khi thực hiện chỉnh sửa, sử dụng lệnh bless
để tạo một snapshot mới có khả năng boot:
sudo bless --folder /Volumes/macOS\ 1/System/Library/CoreServices --bootefi --create-snapshot
Sau đó hệ thống có thể được khởi động lại, mà không có SSV. Tôi chưa thử kiểm chứng điều gì xảy ra khi enable SSV lúc này.
Thông tin chưa được kiểm chứng: trong một vài phiên bản đang phát triển thời kỳ đầu, thao tác tạo mới snapshot được thực hiện bằng hai câu lệnh dưới đây:
sudo /System/Library/Filesystem/apfs.fs/Contents/Resources/apfssystemsnapshot -s "SnapshotName" -v /Volumes/Macintosh\ HD\ 1
sudo /System/Library/Filesystem/apfs.fs/Contents/Resources/apfssystemsnapshot -r "SnapshotName" -v /Volumes/Macintosh\ HD\ 1
Lưu ý: Big Sur vẫn đang ở trong giai đoạn beta (tính tới thời điểm viết bài này), cách thức triển khai tại bản chính thức có thể sẽ rất khác. Luôn phải backup OS trước khi thực hiện thao tác chỉnh sửa.
One Reply to “Chỉnh sửa các tập tin hệ thống của macOS Big Sur”