Linux arm64 Static Linear Map KASLR Bypass
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ฐ์
arm64์ฉ Android kernels๋ ๊ฑฐ์ ์์ธ ์์ด CONFIG_ARM64_VA_BITS=39 (3-level paging) ๋ฐ **CONFIG_MEMORY_HOTPLUG=y**๋ฅผ ํ์ฑํํฉ๋๋ค. ์ปค๋ ๊ฐ์ ๊ณต๊ฐ์ด 512 GiB๋ก ์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์, Linux ๊ฐ๋ฐ์๋ค์ ํฅํ ํซํ๋ฌ๊ทธ๋ RAM์ด ๋งคํ์ ์๋ก ํ์ฅํ ์ ์๋๋ก linear map์ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋ฎ์ ์ปค๋ VA์ ๊ณ ์ (anchor)ํ๋๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ปค๋ฐ 1db780bafa4c ์ดํ, arm64๋ ํด๋น ์์น๋ฅผ ๋ฌด์์ํํ๋ ค๋ ์๋์กฐ์ฐจ ํ์ง ์์ผ๋ฉฐ, ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค:
PAGE_OFFSET = 0xffffff8000000000๊ฐ ์ปดํ์ผ๋์ด ํฌํจ๋ฉ๋๋ค.PHYS_OFFSET๋ export๋memstart_addr์์ ๊ฐ์ ธ์ค๋ฉฐ, stock Android ๋๋ฐ์ด์ค์์๋ ์ฌ์ค์ ๋ถ๋ณ(์ค๋๋ 0x80000000)์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, ๋ชจ๋ ๋ฌผ๋ฆฌ ํ์ด์ง๋ KASLR slide์ ๋ฌด๊ดํ ๊ฒฐ์ ๋ก ์ linear-map ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ต๋๋ค:
#define phys_to_virt(p) (((unsigned long)(p) - 0x80000000UL) | 0xffffff8000000000UL)
If an attacker can learn or influence a physical address (kernel object, PFN from /proc/pagemap, or even a user-controlled page), they instantly know the corresponding kernel virtual address without leaking the randomized primary kernel mapping.
memstart_addr ์ฝ๊ธฐ ๋ฐ ๋ณํ ํ์ธ
memstart_addr๋ /proc/kallsyms์ export๋์ด ์์ผ๋ฉฐ ๋ฃจํ
๋ ๊ธฐ๊ธฐ๋ ์์์ kernel-read primitive๋ฅผ ํตํด ์ฝ์ ์ ์๋ค. Project Zero๋ Jann Horn์ tracing-BPF helper (bpf_arb_read)๋ฅผ ์ฌ์ฉํด ์ด๋ฅผ ์ง์ ๋คํํ๋ค:
grep memstart /proc/kallsyms
# ... obtains memstart_addr virtual address
./bpf_arb_read <addr_of_memstart_addr> 8
๋ฐ์ดํธ 00 00 00 80 00 00 00 00 ๋ memstart_addr = 0x80000000์(๋ฅผ) ํ์ธํ๋ค. PAGE_OFFSET์ PHYS_OFFSET๊ฐ ๊ณ ์ ๋๋ฉด, arm64 linear map์ ๋ชจ๋ ๋ฌผ๋ฆฌ ์ฃผ์์ ๋ํด ์ ์ ์ธ affine ๋ณํ์ด ๋๋ค.
๊ณ ์ ๋ kernel physbase๋ฅผ ๊ฐ์ง ์ฅ์น์์ ์์ ์ ์ธ .data ์ฃผ์ ์ ๋
๋ง์ Pixel ๊ธฐ๊ธฐ๋ค์ ์ฌ์ ํ ๋งค ๋ถํ
๋ง๋ค ์ปค๋์ phys_kernel_base = 0x80010000 ์ ์์ถ ํด์ ํ๋ค(/proc/iomem์์ ํ์ธ ๊ฐ๋ฅ). ์ด๋ฅผ ์ ์ ๋ณํ๊ณผ ๊ฒฐํฉํ๋ฉด ์ด๋ค ๋ฐ์ดํฐ ์ฌ๋ณผ์ ๋ํด์๋ ์ฌ๋ถํ
๊ฐ์ ์์ ์ ์ธ ์ฃผ์๋ฅผ ์ป์ ์ ์๋ค:
/proc/kallsyms(๋๋ ์ ํํvmlinux์์)_stext์ ๋์ ์ฌ๋ณผ์ ๋๋คํ๋ kernel ๊ฐ์ ์ฃผ์๋ฅผ ๊ธฐ๋กํ๋ค.- ์คํ์
์ ๊ณ์ฐํ๋ค:
offset = sym_virt - _stext_virt. - ๋ถํ
์ ๊ณ ์ physbase๋ฅผ ๋ํ๋ค:
phys_sym = 0x80010000 + offset. - linear-map VA๋ก ๋ณํํ๋ค:
virt_sym = phys_to_virt(phys_sym).
์์(Pixel 9์ modprobe_path): offset = 0x1fe2398, phys = 0x81ff2398, virt = 0xffffff8001ff2398. ์ฌ๋ฌ ๋ฒ ์ฌ๋ถํ
ํ ํ bpf_arb_read 0xffffff8001ff2398๋ ๋์ผํ ๋ฐ์ดํธ๋ฅผ ๋ฐํํ๋ฏ๋ก, ์ต์คํ๋ก์ ํ์ด๋ก๋๋ ๋ชจ๋ .data ์คํ์
์ ๋ํด 0xffffff8000010000์ ํฉ์ฑ๋, ๋น๋์ํ๋(base) ๋ฒ ์ด์ค๋ก ์ทจ๊ธํ ์ ์๋ค.
์ด ๋งคํ์ RW์ด๋ฏ๋ก, ๊ณต๊ฒฉ์ ๋ฐ์ดํฐ๋ฅผ kernel ๊ฐ์ ๊ณต๊ฐ์ ๋์ ์ ์๋ ์ด๋ค primitive(์: double free, UAF, non-paged heap write ๋ฑ)๋ ์ค์ KASLR slide๋ฅผ leakํ์ง ์๊ณ credentials, LSM hooks, ๋๋ dispatch tables๋ฅผ ํจ์นํ ์ ์๋ค. ์ ์ผํ ์ ์ฝ์ .text๊ฐ linear map์์ ๋น์คํ(non-executable)์ผ๋ก ๋งคํ๋์ด ์์ด gadget ์์ง์๋ ์ฌ์ ํ ์ ํต์ ์ธ leak์ด ํ์ํ๋ค๋ ์ ์ด๋ค.
kernel physbase๊ฐ ๋๋คํ๋ ๊ฒฝ์ฐ PFN spraying
Samsung๊ณผ ๊ฐ์ ๋ฒค๋๋ค์ kernel ๋ก๋ PFN์ ๋๋คํํ์ง๋ง, PFN ํ ๋น์ด ์์ ํ ๋๋คํ์ง ์๊ธฐ ๋๋ฌธ์ static linear map์ ์ฌ์ ํ ์ ์ฉ ๊ฐ๋ฅํ๋ค:
- Spray user pages:
mmap()๋ก ์ฝ 5 GiB๋ฅผ ํ๋ณดํ๊ณ , ๋ชจ๋ ํ์ด์ง๋ฅผ ์ ๊ทผํ์ฌ fault๋ฅผ ๋ฐ์์ํจ๋ค. - Harvest PFNs: ๊ฐ ํ์ด์ง์ ๋ํด
/proc/pagemap์ ์ฝ๊ฑฐ๋(๋๋ ๋ค๋ฅธ PFN leak์ ์ฌ์ฉํ์ฌ) backing PFN ๋ชฉ๋ก์ ์์งํ๋ค. - Repeat and profile: ์ฌ๋ถํ ํ๊ณ 100ร ์ฌ์คํํ์ฌ ๊ฐ PFN์ด ๊ณต๊ฒฉ์ ์ ์ด๋ก ํ ๋น๋๋ ๋น๋๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์คํ ๊ทธ๋จ์ ๋ง๋ ๋ค. ์ผ๋ถ PFN์ white-hotํ๋ค(๋ถํ ์งํ 100/100 ๋ฒ ํ ๋น๋จ).
- Convert PFN โ kernel VA:
phys = (pfn << PAGE_SHIFT) + offset_in_pagevirt = phys_to_virt(phys)
- Forge kernel objects in those pages and victim ํฌ์ธํฐ(UAF, overflow ๋ฑ)๋ฅผ ์๋ ค์ง linear-map ์ฃผ์๋ก ์ ๋ํ๋ค.
linear map์ด identity-mapped RW ๋ฉ๋ชจ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์, ์ด ๊ธฐ๋ฒ์ ์ค์ kernel base๊ฐ ์ด๋ํด๋ ๊ฒฐ์ ๋ก ์ ์ธ kernel VA์ ์์ ํ ๊ณต๊ฒฉ์ ์ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํ ์ ์๊ฒ ํด์ค๋ค. ์ต์คํ๋ก์์ ์คํ๋ ์ด๋ ํ์ด์ง ๋ด๋ถ์ ๊ฐ์ง file_operations, cred, ๋๋ refcount ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ๊ธฐ์กด kernel ํฌ์ธํฐ๋ฅผ ๊ทธ์ชฝ์ผ๋ก ํผ๋ฒํ ์ ์๋ค.
arm64 Android ์ต์คํ๋ก์์ ์ํ ์ค์ ์ํฌํ๋ก
- Info gathering
- Root ๊ถํ์ ์ป๊ฑฐ๋ kernel read primitive๋ฅผ ์ฌ์ฉํด
/proc/kallsyms์์memstart_addr,_stext, ๋์ ์ฌ๋ณผ์ ๋คํํ๋ค. - Pixel์์๋
/proc/iomem์ static physbase๋ฅผ ์ ๋ขฐํ๊ณ , ๋ค๋ฅธ ๊ธฐ๊ธฐ์์๋ PFN profiler๋ฅผ ์ค๋นํ๋ค.
- Address calculation
- ์์ offset ์ฐ์ฐ์ ์ ์ฉํ๊ณ ๊ฒฐ๊ณผ linear-map VA๋ฅผ ์ต์คํ๋ก์์ ์บ์ํ๋ค.
- PFN spraying์ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ด์ค๋ โreliableโ PFN ๋ชฉ๋ก์ ์ ์งํ๋ค.
- Exploit integration
- arbitrary write๊ฐ ๊ฐ๋ฅํ๋ฉด ๋ฏธ๋ฆฌ ๊ณ์ฐํ ์ฃผ์์์
modprobe_path,init_cred, ๋๋ security ops ๋ฐฐ์ด๊ณผ ๊ฐ์ ํ๊ฒ์ ์ง์ ํจ์นํ๋ค. - heap corruption๋ง ์กด์ฌํ ๊ฒฝ์ฐ, ์๋ ค์ง ๊ฐ์ ํ์ด์ง๋ค์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํผํด์ ํฌ์ธํฐ๋ฅผ ๊ทธ linear-map VA๋ก ์ฌ์ง์ ํ๋ค.
- Verification
- ํ๊ดด์ ์ฐ๊ธฐ ์ ์
bpf_arb_read๋๋ ์์์ ์์ ํ read primitive๋ก ๊ณ์ฐํ ์ฃผ์๊ฐ ์์ ๋ฐ์ดํธ๋ฅผ ํฌํจํ๊ณ ์๋์ง ํ์ธํ๋ค.
์ด ์ํฌํ๋ก๋ Android์์ ๋ฐ์ดํฐ ์ค์ฌ kernel ์ต์คํ๋ก์์ ๋ํด KASLR-leak ๋จ๊ณ๋ฅผ ์ ๊ฑฐํ์ฌ ์ต์คํ๋ก์ ๋ณต์ก๋๋ฅผ ํฌ๊ฒ ๋ฎ์ถ๊ณ ์ ๋ขฐ์ฑ์ ํฅ์์ํจ๋ค.
์ฐธ๊ณ ์๋ฃ
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


