Fixing KASLR

Tác giả: Thái Dương

KASLR là gì?

Nó là viết tắt của cụm từ Kernel address space layout randomization. Nó là 1 công cụ bảo mật của Apple làm cho những Hacker khó có thể tìm ra những object quan trọng trong bộ nhớ vì nó luôn thay đổi ngẫu nhiên sau mỗi lần khởi động chi tiết xem tại đây.

Đối với những máy có memory maps nhỏ hoặc hoặc có quá nhiều device trong DSDT. Có thể sẽ có space cho kernel hoạt động nhưng cũng có thể sẽ có free space mà kernel không bao phủ tới. Vì thế ta sẽ không để macOS chọn 1 khu vực ngẫu nhiên để hoạt động trong mỗi lần reboot mà ta sẽ giới hạn khu vực bất kì mà chắc chắn nó sẽ hoạt động.

Vậy khi nào cần Fix KASLR

Thường khi boot macOS sẽ gặp các lỗi như sau:

Error allocating 0x1197b pages at 0x0000000017a80000 alloc type 2
Couldn't allocate runtime area

//hoặc

Only 244/256 slide values are usable!

//hoặc

panic(cpu 6 caller 0xffffff801fc057ba): a freed zone element has been modified in zone kalloc.4096: expected 0x3f00116dbe8a46f6 but found 0x3f00116d00000000

Chuẩn bị:

B1: Tải OpenRuntime.efi

trong OpenCorePKG xem chi tiết tại đây

B2: Tải OpenShell.efi

xem cách tải OpenShell tại đây

B3: chỉnh config --> Booter theo sau:

  • AvoidRuntimeDefrag: YES

  • DevirtualiseMmio: YES

  • EnableSafeModeSlide: YES

  • ProtectUefiServices: NO

  • ProvideCustomSlide: YES

  • RebuildAppleMemoryMap: YES

Setting BIOS

B1: Update BIOS

khá quan trọng đặc biệt là Z390

B2: Clear CMOS.

B3: Bật các option sau trong BIOS:

  • Above4GDecoding

    • đảm bảo rằng Booter -> Quirks -> ResizeAppleGpuBars: 0

  • Boot Options -> Windows8.1/10 mode.

  • Disable các option không cần thiết trong bios

    • không cần thiết ở đây có nghĩa là bạn không sử dụng

      • CSM

      • Intel SGX

      • Parallel Port

      • Serial Port

      • iGPU

      • Thunderbolt

      • LED lighting

      • Legacy USB

Tìm Slide Value

B1: Bạn chọn OpenShell.efi tại picker của OpenCore.

B2: Ấn Enter hoặc đợi vài giây.

B3: Các bạn gõ lệnh:

B4: Mở file memmap.txt ra ta sẽ được:

B5: Bây giờ ta sẽ tiến hành chuyển giá trị thành Slide value chú ý vào giá trị Available lớn nhất ở cột start

chuyển sang decimal để so sánh

B6: Các bạn sẽ thực hiện tính toán theo công thức

chuyển sang decimal để tính toán

B7: Nhưng con số này quá lớn (> 256) vì vậy ta cần phải hạ xuống các Available có giá trị nhỏ hơn cho đến khi bé hơn hoặc bằng 256.

B8: Ta sẽ thử với 0000000001100000 covert to decimal: 17825792 ta được kết quả là 8.

B9: Add vào boot-arg tham số slide=XXX

ở đây ta sẽ có là slide=8

B10: Reboot.

Lưu ý

Ở 1 số máy sẽ nhận được slide value rất nhỏ như slide=-0.379150390625 đối với trưởng hợp này ta sẽ đặt slide=0.

Using DevirtualiseMmio

Đối với 1 số main như Z390 và hầu hết dòng HEDT chúng ta cần lập 1 danh sách trắng. Đó là lúc MmioWhitelist phát huy tác dụng. Với DevirtualiseMmioProvideCustomSlide bạn vừa có thể bảo mật lại vừa có thể Boot, 1 combo hoàn hảo.

B1: Tạo 1 EFI Debug theo hướng dẫn tại đây

nhớ enable DevirtualiseMmio

  • Đối với clover các bản cũng build tương tự (sử dụng bản clover debug) để dump được log file các bạn sẽ dùng hackintool –> log

B2: Bạn sẽ nhận được 1 file log mở nó ra và ta sẽ có:

Bây giờ ta có 6 regions cần thêm vào danh sách trắng (in đậm).

Ta cần convert hex to decimal (có thể dùng Hackintool).

  • MMIO devirt 0x60000000 -> 1610612736

  • MMIO devirt 0xFE000000 -> 4261412864

  • MMIO devirt 0xFEC00000 -> 4273995776

  • MMIO devirt 0xFED00000 -> 4275044352

  • MMIO devirt 0xFEE00000 -> 4276092928

  • MMIO devirt 0xFF000000 -> 4278190080

B3: Add vào config ==> booter ==> MmioWhitelist.

Source tham khảo: Fixing KASLR slide values | OpenCore Install Guide (dortania.github.io)

Last updated