Chỉnh sửa các tập tin hệ thống của macOS Big Sur

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.

_

1 Comment

Leave a Comment

Your email address will not be published. Required fields are marked *