macOS SIP

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 μ§€μ›ν•˜κΈ°

κΈ°λ³Έ 정보

**System Integrity Protection (SIP)**λŠ” macOSμ—μ„œ κ°€μž₯ κΆŒν•œμ΄ 높은 μ‚¬μš©μžμ‘°μ°¨λ„ μ£Όμš” μ‹œμŠ€ν…œ 폴더에 λŒ€ν•œ 무단 변경을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ„€κ³„λœ λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€. 이 κΈ°λŠ₯은 보호된 μ˜μ—­μ—μ„œ νŒŒμΌμ„ μΆ”κ°€, μˆ˜μ • λ˜λŠ” μ‚­μ œν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μ œν•œν•¨μœΌλ‘œμ¨ μ‹œμŠ€ν…œμ˜ 무결성을 μœ μ§€ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. SIP에 μ˜ν•΄ λ³΄ν˜Έλ˜λŠ” μ£Όμš” ν΄λ”λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • /System
  • /bin
  • /sbin
  • /usr

SIP의 λ™μž‘μ„ κ·œμ •ν•˜λŠ” κ·œμΉ™μ€ **/System/Library/Sandbox/rootless.conf**에 μœ„μΉ˜ν•œ ꡬ성 νŒŒμΌμ— μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 파일 λ‚΄μ—μ„œ λ³„ν‘œ(*)둜 접두사가 뢙은 κ²½λ‘œλŠ” 일반적으둜 μ—„κ²©ν•œ SIP μ œν•œμ˜ μ˜ˆμ™Έλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.

μ•„λž˜μ˜ 예λ₯Ό κ³ λ €ν•΄ λ³΄μ‹­μ‹œμ˜€:

/usr
* /usr/libexec/cups
* /usr/local
* /usr/share/man

이 μŠ€λ‹ˆνŽ«μ€ SIPκ°€ 일반적으둜 /usr 디렉토리λ₯Ό λ³΄ν˜Έν•˜μ§€λ§Œ, νŠΉμ • ν•˜μœ„ 디렉토리(/usr/libexec/cups, /usr/local, /usr/share/man)μ—μ„œλŠ” μˆ˜μ •μ΄ ν—ˆμš©λœλ‹€λŠ” 것을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ΄λŠ” ν•΄λ‹Ή 경둜 μ•žμ— μžˆλŠ” λ³„ν‘œ(*)둜 ν‘œμ‹œλ©λ‹ˆλ‹€.

λ””λ ‰ν† λ¦¬λ‚˜ 파일이 SIP에 μ˜ν•΄ λ³΄ν˜Έλ˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ ls -lOd λͺ…령을 μ‚¬μš©ν•˜μ—¬ restricted λ˜λŠ” sunlnk ν”Œλž˜κ·Έμ˜ 쑴재λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 예:

ls -lOd /usr/libexec/cups
drwxr-xr-x  11 root  wheel  sunlnk 352 May 13 00:29 /usr/libexec/cups

이 경우, sunlnk ν”Œλž˜κ·ΈλŠ” /usr/libexec/cups 디렉토리 μžμ²΄κ°€ μ‚­μ œλ  수 μ—†μŒμ„ λ‚˜νƒ€λ‚΄μ§€λ§Œ, κ·Έ μ•ˆμ˜ νŒŒμΌμ€ 생성, μˆ˜μ • λ˜λŠ” μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

반면:

ls -lOd /usr/libexec
drwxr-xr-x  338 root  wheel  restricted 10816 May 13 00:29 /usr/libexec

μ—¬κΈ°μ„œ restricted ν”Œλž˜κ·ΈλŠ” /usr/libexec 디렉토리가 SIP에 μ˜ν•΄ 보호되고 μžˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. SIP둜 보호된 λ””λ ‰ν† λ¦¬μ—μ„œλŠ” νŒŒμΌμ„ 생성, μˆ˜μ • λ˜λŠ” μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ˜ν•œ, νŒŒμΌμ— com.apple.rootless ν™•μž₯ 속성이 ν¬ν•¨λ˜μ–΄ 있으면 ν•΄λ‹Ή νŒŒμΌλ„ SIP에 μ˜ν•΄ λ³΄ν˜Έλ©λ‹ˆλ‹€.

Tip

Sandbox ν›… **hook_vnode_check_setextattr**λŠ” ν™•μž₯ 속성 **com.apple.rootless**λ₯Ό μˆ˜μ •ν•˜λ €λŠ” λͺ¨λ“  μ‹œλ„λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

SIPλŠ” λ‹€λ₯Έ 루트 μž‘μ—…λ„ μ œν•œν•©λ‹ˆλ‹€:

  • μ‹ λ’°ν•  수 μ—†λŠ” 컀널 ν™•μž₯ λ‘œλ“œ
  • Apple μ„œλͺ… ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ μž‘μ—… 포트 κ°€μ Έμ˜€κΈ°
  • NVRAM λ³€μˆ˜ μˆ˜μ •
  • 컀널 디버깅 ν—ˆμš©

μ˜΅μ…˜μ€ λΉ„νŠΈ ν”Œλž˜κ·Έλ‘œ nvram λ³€μˆ˜μ— μœ μ§€λ©λ‹ˆλ‹€ (csr-active-configλŠ” Intelμ—μ„œ, lp-sip0λŠ” ARM의 λΆ€νŒ…λœ Device Treeμ—μ„œ μ½μ–΄μ˜΅λ‹ˆλ‹€). ν”Œλž˜κ·ΈλŠ” csr.sh의 XNU μ†ŒμŠ€ μ½”λ“œμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€:

SIP μƒνƒœ

λ‹€μŒ λͺ…λ Ήμ–΄λ‘œ μ‹œμŠ€ν…œμ—μ„œ SIPκ°€ ν™œμ„±ν™”λ˜μ–΄ μžˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

csrutil status

SIPλ₯Ό λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•˜λŠ” 경우, 컴퓨터λ₯Ό 볡ꡬ λͺ¨λ“œλ‘œ μž¬μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€(μ‹œμž‘ 쀑 Command+R을 λˆ„λ¦„). 그런 λ‹€μŒ λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€:

csrutil disable

SIPλ₯Ό ν™œμ„±ν™”ν•œ μƒνƒœλ‘œ 디버깅 보호 κΈ°λŠ₯을 μ œκ±°ν•˜λ €λ©΄ λ‹€μŒμ„ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€:

csrutil enable --without debug

기타 μ œν•œ 사항

  • μ„œλͺ…λ˜μ§€ μ•Šμ€ 컀널 ν™•μž₯(kexts)의 λ‘œλ“œλ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ©°, κ²€μ¦λœ ν™•μž₯만이 μ‹œμŠ€ν…œ 컀널과 μƒν˜Έμž‘μš©ν•˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.
  • macOS μ‹œμŠ€ν…œ ν”„λ‘œμ„ΈμŠ€μ˜ 디버깅을 λ°©μ§€ν•˜μ—¬, 핡심 μ‹œμŠ€ν…œ ꡬ성 μš”μ†Œλ₯Ό 무단 μ ‘κ·Ό 및 μˆ˜μ •μœΌλ‘œλΆ€ν„° λ³΄ν˜Έν•©λ‹ˆλ‹€.
  • dtrace와 같은 λ„κ΅¬μ˜ μ‚¬μš©μ„ μ–΅μ œν•˜μ—¬ μ‹œμŠ€ν…œ 운영의 무결성을 μΆ”κ°€λ‘œ λ³΄ν˜Έν•©λ‹ˆλ‹€.

이 λ°œν‘œμ—μ„œ SIP 정보에 λŒ€ν•΄ 더 μ•Œμ•„λ³΄μ„Έμš”.

SIP κ΄€λ ¨ κΆŒν•œ

  • com.apple.rootless.xpc.bootstrap: launchd μ œμ–΄
  • com.apple.rootless.install[.heritable]: 파일 μ‹œμŠ€ν…œ μ ‘κ·Ό
  • com.apple.rootless.kext-management: kext_request
  • com.apple.rootless.datavault.controller: UF_DATAVAULT 관리
  • com.apple.rootless.xpc.bootstrap: XPC μ„€μ • κΈ°λŠ₯
  • com.apple.rootless.xpc.effective-root: launchd XPCλ₯Ό ν†΅ν•œ 루트 μ ‘κ·Ό
  • com.apple.rootless.restricted-block-devices: μ›μ‹œ 블둝 μž₯치 μ ‘κ·Ό
  • com.apple.rootless.internal.installer-equivalent: μ œν•œ μ—†λŠ” 파일 μ‹œμŠ€ν…œ μ ‘κ·Ό
  • com.apple.rootless.restricted-nvram-variables[.heritable]: NVRAM에 λŒ€ν•œ 전체 μ ‘κ·Ό
  • com.apple.rootless.storage.label: ν•΄λ‹Ή λ ˆμ΄λΈ”λ‘œ com.apple.rootless xattr에 μ˜ν•΄ μ œν•œλœ 파일 μˆ˜μ •
  • com.apple.rootless.volume.VM.label: λ³Όλ₯¨μ—μ„œ VM μŠ€μ™‘ μœ μ§€

SIP 우회

SIPλ₯Ό μš°νšŒν•˜λ©΄ κ³΅κ²©μžκ°€ λ‹€μŒμ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • μ‚¬μš©μž 데이터 μ ‘κ·Ό: λͺ¨λ“  μ‚¬μš©μž κ³„μ •μ—μ„œ 메일, λ©”μ‹œμ§€ 및 Safari 기둝과 같은 λ―Όκ°ν•œ μ‚¬μš©μž 데이터λ₯Ό μ½μŠ΅λ‹ˆλ‹€.
  • TCC 우회: TCC(투λͺ…μ„±, λ™μ˜ 및 μ œμ–΄) λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 직접 μ‘°μž‘ν•˜μ—¬ μ›ΉμΊ , 마이크 및 기타 λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 무단 접근을 λΆ€μ—¬ν•©λ‹ˆλ‹€.
  • 지속성 μ„€μ •: SIP둜 보호된 μœ„μΉ˜μ— μ•…μ„± μ½”λ“œλ₯Ό λ°°μΉ˜ν•˜μ—¬ 루트 κΆŒν•œμœΌλ‘œλ„ μ œκ±°μ— μ €ν•­ν•˜λ„λ‘ λ§Œλ“­λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” μ•…μ„± μ†Œν”„νŠΈμ›¨μ–΄ 제거 도ꡬ(MRT)λ₯Ό λ³€μ‘°ν•  κ°€λŠ₯성도 ν¬ν•¨λ©λ‹ˆλ‹€.
  • 컀널 ν™•μž₯ λ‘œλ“œ: 좔가적인 보호 μž₯μΉ˜κ°€ μžˆμ§€λ§Œ, SIPλ₯Ό μš°νšŒν•˜λ©΄ μ„œλͺ…λ˜μ§€ μ•Šμ€ 컀널 ν™•μž₯을 λ‘œλ“œν•˜λŠ” 과정이 κ°„μ†Œν™”λ©λ‹ˆλ‹€.

μ„€μΉ˜ νŒ¨ν‚€μ§€

Apple의 μΈμ¦μ„œλ‘œ μ„œλͺ…λœ μ„€μΉ˜ νŒ¨ν‚€μ§€λŠ” κ·Έ 보호λ₯Ό μš°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν‘œμ€€ κ°œλ°œμžκ°€ μ„œλͺ…ν•œ νŒ¨ν‚€μ§€μ‘°μ°¨λ„ SIP둜 보호된 디렉토리λ₯Ό μˆ˜μ •ν•˜λ €κ³  μ‹œλ„ν•˜λ©΄ μ°¨λ‹¨λœλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” SIP 파일

ν•˜λ‚˜μ˜ 잠재적 ν—ˆμ μ€ rootless.conf에 μ§€μ •λœ 파일이 ν˜„μž¬ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 생성될 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ•…μ„± μ½”λ“œλŠ” 이λ₯Ό μ•…μš©ν•˜μ—¬ μ‹œμŠ€ν…œμ—μ„œ 지속성을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ•…μ„± ν”„λ‘œκ·Έλž¨μ΄ rootless.conf에 λ‚˜μ—΄λ˜μ–΄ μžˆμ§€λ§Œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 /System/Library/LaunchDaemons에 .plist νŒŒμΌμ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

com.apple.rootless.install.heritable

Caution

κΆŒν•œ **com.apple.rootless.install.heritable**λŠ” SIPλ₯Ό μš°νšŒν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

CVE-2019-8561

μ‹œμŠ€ν…œμ΄ μ½”λ“œ μ„œλͺ…을 κ²€μ¦ν•œ ν›„ μ„€μΉ˜ νŒ¨ν‚€μ§€λ₯Ό κ΅μ²΄ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€λŠ” 것이 λ°œκ²¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έ ν›„ μ‹œμŠ€ν…œμ€ 원본 λŒ€μ‹  μ•…μ„± νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ΄ **system_installd**에 μ˜ν•΄ μˆ˜ν–‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— SIPλ₯Ό μš°νšŒν•  수 있게 λ©λ‹ˆλ‹€.

CVE-2020–9854

νŒ¨ν‚€μ§€κ°€ 마운트된 μ΄λ―Έμ§€λ‚˜ μ™ΈλΆ€ λ“œλΌμ΄λΈŒμ—μ„œ μ„€μΉ˜λœ 경우 μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ€ ν•΄λ‹Ή 파일 μ‹œμŠ€ν…œμ—μ„œ λ°”μ΄λ„ˆλ¦¬λ₯Ό μ‹€ν–‰ν•˜κ²Œ 되며, SIP 보호 μœ„μΉ˜μ—μ„œ μ‹€ν–‰λ˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€. 이둜 인해 **system_installd**κ°€ μž„μ˜μ˜ λ°”μ΄λ„ˆλ¦¬λ₯Ό μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

CVE-2021-30892 - Shrootless

이 λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ˜ μ—°κ΅¬μžλ“€μ€ macOS의 μ‹œμŠ€ν…œ 무결성 보호(SIP) λ©”μ»€λ‹ˆμ¦˜μ—μ„œ β€˜Shrootless’ 취약점을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 이 취약점은 system_installd 데λͺ¬κ³Ό 관련이 있으며, 이 데λͺ¬μ€ com.apple.rootless.install.heritable κΆŒν•œμ„ κ°€μ§€κ³  μžˆμ–΄ μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ SIP의 파일 μ‹œμŠ€ν…œ μ œν•œμ„ μš°νšŒν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

system_installd 데λͺ¬μ€ Apple에 μ˜ν•΄ μ„œλͺ…λœ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

μ—°κ΅¬μžλ“€μ€ Apple μ„œλͺ… νŒ¨ν‚€μ§€(.pkg 파일)의 μ„€μΉ˜ 쀑에 **system_installd**κ°€ νŒ¨ν‚€μ§€μ— ν¬ν•¨λœ λͺ¨λ“  post-install 슀크립트λ₯Ό μ‹€ν–‰ν•œλ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μŠ€ν¬λ¦½νŠΈλŠ” κΈ°λ³Έ 셸인 **zsh**에 μ˜ν•΄ μ‹€ν–‰λ˜λ©°, μ‘΄μž¬ν•˜λŠ” 경우 /etc/zshenv νŒŒμΌμ—μ„œ λͺ…령을 μžλ™μœΌλ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€. 이 λ™μž‘μ€ κ³΅κ²©μžμ— μ˜ν•΄ μ•…μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€: μ•…μ„± /etc/zshenv νŒŒμΌμ„ μƒμ„±ν•˜κ³  system_installdκ°€ zshλ₯Ό ν˜ΈμΆœν•  λ•Œ λŒ€κΈ°ν•¨μœΌλ‘œμ¨, μž₯μΉ˜μ—μ„œ μž„μ˜μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ²Œλ‹€κ°€ **/etc/zshenv**λŠ” SIP 우회뿐만 μ•„λ‹ˆλΌ 일반적인 곡격 κΈ°λ²•μœΌλ‘œλ„ μ‚¬μš©λ  수 μžˆλ‹€λŠ” 것이 λ°œκ²¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 각 μ‚¬μš©μž ν”„λ‘œν•„μ—λŠ” ~/.zshenv 파일이 있으며, μ΄λŠ” /etc/zshenv와 λ™μΌν•˜κ²Œ λ™μž‘ν•˜μ§€λ§Œ 루트 κΆŒν•œμ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 νŒŒμΌμ€ 지속성 λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ μ‚¬μš©λ  수 있으며, zshκ°€ μ‹œμž‘λ  λ•Œλ§ˆλ‹€ νŠΈλ¦¬κ±°λ˜κ±°λ‚˜ κΆŒν•œ μƒμŠΉ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. 관리 μ‚¬μš©μžκ°€ sudo -s λ˜λŠ” sudo <command>λ₯Ό μ‚¬μš©ν•˜μ—¬ 루트둜 μƒμŠΉν•˜λ©΄ ~/.zshenv 파일이 νŠΈλ¦¬κ±°λ˜μ–΄ 효과적으둜 루트둜 μƒμŠΉν•˜κ²Œ λ©λ‹ˆλ‹€.

CVE-2022-22583

CVE-2022-22583μ—μ„œλŠ” λ™μΌν•œ system_installd ν”„λ‘œμ„ΈμŠ€κ°€ μ—¬μ „νžˆ μ•…μš©λ  수 μžˆλ‹€λŠ” 것이 λ°œκ²¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” post-install 슀크립트λ₯Ό SIP둜 보호된 /tmp λ‚΄μ˜ μž„μ˜ μ΄λ¦„μ˜ 폴더에 λ„£κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ¬Έμ œλŠ” /tmp μžμ²΄λŠ” SIP둜 λ³΄ν˜Έλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 가상 이미지λ₯Ό λ§ˆμš΄νŠΈν•œ ν›„ μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ΄ post-install 슀크립트λ₯Ό 그곳에 λ„£κ³ , 가상 이미지λ₯Ό μ–Έλ§ˆμš΄νŠΈν•œ λ‹€μŒ, λͺ¨λ“  폴더λ₯Ό μž¬μƒμ„±ν•˜κ³  payloadλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ post installation 슀크립트λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

fsck_cs μœ ν‹Έλ¦¬ν‹°

**fsck_cs**κ°€ 심볼릭 링크λ₯Ό λ”°λΌκ°€λŠ” λŠ₯λ ₯으둜 인해 μ€‘μš”ν•œ νŒŒμΌμ„ μ†μƒμ‹œν‚€λŠ” 취약점이 ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ꡬ체적으둜, κ³΅κ²©μžλŠ” _/dev/diskX_μ—μ„œ /System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist 파일둜의 링크λ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. _/dev/diskX_μ—μ„œ **fsck_cs**λ₯Ό μ‹€ν–‰ν•˜λ©΄ Info.plistκ°€ μ†μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 파일의 무결성은 운영 체제의 SIP(μ‹œμŠ€ν…œ 무결성 보호)에 ν•„μˆ˜μ μ΄λ©°, 컀널 ν™•μž₯의 λ‘œλ“œλ₯Ό μ œμ–΄ν•©λ‹ˆλ‹€. μ†μƒλ˜λ©΄ SIP의 컀널 μ œμ™Έ 관리 λŠ₯λ ₯이 μ†μƒλ©λ‹ˆλ‹€.

이 취약점을 μ•…μš©ν•˜κΈ° μœ„ν•œ λͺ…령은:

ln -s /System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist /dev/diskX
fsck_cs /dev/diskX 1>&-
touch /Library/Extensions/
reboot

이 μ·¨μ•½μ μ˜ μ•…μš©μ€ μ‹¬κ°ν•œ 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. Info.plist νŒŒμΌμ€ 일반적으둜 컀널 ν™•μž₯에 λŒ€ν•œ κΆŒν•œμ„ κ΄€λ¦¬ν•˜λŠ” 역할을 ν•˜μ§€λ§Œ, λΉ„νš¨μœ¨μ μ΄ λ©λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” AppleHWAccess.kext와 같은 νŠΉμ • ν™•μž₯을 λΈ”λž™λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•  수 μ—†λŠ” 것이 ν¬ν•¨λ©λ‹ˆλ‹€. 결과적으둜 SIP의 μ œμ–΄ λ©”μ»€λ‹ˆμ¦˜μ΄ μž‘λ™ν•˜μ§€ μ•Šκ²Œ 되면, 이 ν™•μž₯을 λ‘œλ“œν•  수 μžˆμ–΄ μ‹œμŠ€ν…œμ˜ RAM에 λŒ€ν•œ 무단 읽기 및 μ“°κΈ° 접근이 ν—ˆμš©λ©λ‹ˆλ‹€.

SIP 보호 폴더 μœ„μ— λ§ˆμš΄νŠΈν•˜κΈ°

보호λ₯Ό μš°νšŒν•˜κΈ° μœ„ν•΄ SIP 보호 폴더 μœ„μ— μƒˆλ‘œμš΄ 파일 μ‹œμŠ€ν…œμ„ λ§ˆμš΄νŠΈν•˜λŠ” 것이 κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

mkdir evil
# Add contento to the folder
hdiutil create -srcfolder evil evil.dmg
hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg

μ—…κ·Έλ ˆμ΄λ” 우회 (2016)

μ‹œμŠ€ν…œμ€ OSλ₯Ό μ—…κ·Έλ ˆμ΄λ“œν•˜κΈ° μœ„ν•΄ Install macOS Sierra.app λ‚΄μ˜ μž„λ² λ””λ“œ μ„€μΉ˜ ν”„λ‘œκ·Έλž¨ λ””μŠ€ν¬ 이미지λ₯Ό λΆ€νŒ…ν•˜λ„λ‘ μ„€μ •λ˜μ–΄ 있으며, bless μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ‚¬μš©λœ λͺ…령은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

/usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer

이 ν”„λ‘œμ„ΈμŠ€μ˜ λ³΄μ•ˆμ€ κ³΅κ²©μžκ°€ λΆ€νŒ… 전에 μ—…κ·Έλ ˆμ΄λ“œ 이미지(InstallESD.dmg)λ₯Ό λ³€κ²½ν•˜λ©΄ 손상될 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ „λž΅μ€ 동적 λ‘œλ”(dyld)λ₯Ό μ•…μ„± 버전(libBaseIA.dylib)으둜 λŒ€μ²΄ν•˜λŠ” 것을 ν¬ν•¨ν•©λ‹ˆλ‹€. 이 κ΅μ²΄λŠ” μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ  λ•Œ 곡격자의 μ½”λ“œκ°€ μ‹€ν–‰λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

곡격자의 μ½”λ“œλŠ” μ—…κ·Έλ ˆμ΄λ“œ κ³Όμ •μ—μ„œ μ œμ–΄λ₯Ό μ–»κ³ , μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ μ‹œμŠ€ν…œμ˜ μ‹ λ’°λ₯Ό μ•…μš©ν•©λ‹ˆλ‹€. 곡격은 InstallESD.dmg 이미지λ₯Ό λ©”μ„œλ“œ μŠ€μœ„μ¦λ§μ„ 톡해 λ³€κ²½ν•˜μ—¬ μ§„ν–‰λ˜λ©°, 특히 extractBootBits λ©”μ„œλ“œλ₯Ό λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ””μŠ€ν¬ 이미지가 μ‚¬μš©λ˜κΈ° 전에 μ•…μ„± μ½”λ“œλ₯Ό μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, InstallESD.dmg λ‚΄μ—λŠ” μ—…κ·Έλ ˆμ΄λ“œ μ½”λ“œμ˜ 루트 파일 μ‹œμŠ€ν…œ 역할을 ν•˜λŠ” BaseSystem.dmgκ°€ μžˆμŠ΅λ‹ˆλ‹€. 여기에 동적 라이브러리λ₯Ό μ£Όμž…ν•˜λ©΄ μ•…μ„± μ½”λ“œκ°€ OS μˆ˜μ€€ νŒŒμΌμ„ λ³€κ²½ν•  수 μžˆλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μž‘λ™ν•  수 μžˆμ–΄ μ‹œμŠ€ν…œ μ†μƒμ˜ κ°€λŠ₯성이 크게 μ¦κ°€ν•©λ‹ˆλ‹€.

systemmigrationd (2023)

DEF CON 31μ—μ„œμ˜ 이 λ°œν‘œμ—μ„œλŠ” systemmigrationd (SIPλ₯Ό μš°νšŒν•  수 μžˆλŠ”)κ°€ bash 및 perl 슀크립트λ₯Ό μ‹€ν–‰ν•˜λŠ” 방법이 보여지며, μ΄λŠ” env λ³€μˆ˜ BASH_ENV 및 **PERL5OPT**λ₯Ό 톡해 μ•…μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

CVE-2023-42860

이 λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ—μ„œ μžμ„Ένžˆ μ„€λͺ…λœ 바와 같이, InstallAssistant.pkg νŒ¨ν‚€μ§€μ˜ postinstall μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€:

/usr/bin/chflagsΒ -hΒ norestrictedΒ "${SHARED_SUPPORT_PATH}/SharedSupport.dmg"

and it was possible to create a symlink in ${SHARED_SUPPORT_PATH}/SharedSupport.dmg that would allow a user to unrestrict any file, bypassing SIP protection.

com.apple.rootless.install

Caution

The entitlement com.apple.rootless.install allows to bypass SIP

The entitlement com.apple.rootless.install is known to bypass System Integrity Protection (SIP) on macOS. This was notably mentioned in relation to CVE-2022-26712.

In this specific case, the system XPC service located at /System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc possesses this entitlement. This allows the related process to circumvent SIP constraints. Furthermore, this service notably presents a method that permits the movement of files without enforcing any security measures.

Sealed System Snapshots

Sealed System SnapshotsλŠ” **macOS Big Sur (macOS 11)**μ—μ„œ Apple이 λ„μž…ν•œ κΈ°λŠ₯으둜, System Integrity Protection (SIP) λ©”μ»€λ‹ˆμ¦˜μ˜ μΌν™˜μœΌλ‘œ 좔가적인 λ³΄μ•ˆ 및 μ‹œμŠ€ν…œ μ•ˆμ •μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이듀은 본질적으둜 μ‹œμŠ€ν…œ λ³Όλ₯¨μ˜ 읽기 μ „μš© λ²„μ „μž…λ‹ˆλ‹€.

λ‹€μŒμ€ 더 μžμ„Έν•œ μ„€λͺ…μž…λ‹ˆλ‹€:

  1. λΆˆλ³€ μ‹œμŠ€ν…œ: Sealed System SnapshotsλŠ” macOS μ‹œμŠ€ν…œ λ³Όλ₯¨μ„ β€œλΆˆλ³€β€œμœΌλ‘œ λ§Œλ“€μ–΄ μˆ˜μ •ν•  수 μ—†κ²Œ ν•©λ‹ˆλ‹€. μ΄λŠ” λ³΄μ•ˆμ΄λ‚˜ μ‹œμŠ€ν…œ μ•ˆμ •μ„±μ„ μœ„ν˜‘ν•  수 μžˆλŠ” 무단 λ˜λŠ” 우발적인 변경을 λ°©μ§€ν•©λ‹ˆλ‹€.
  2. μ‹œμŠ€ν…œ μ†Œν”„νŠΈμ›¨μ–΄ μ—…λ°μ΄νŠΈ: macOS μ—…λ°μ΄νŠΈλ‚˜ μ—…κ·Έλ ˆμ΄λ“œλ₯Ό μ„€μΉ˜ν•  λ•Œ, macOSλŠ” μƒˆλ‘œμš΄ μ‹œμŠ€ν…œ μŠ€λƒ…μƒ·μ„ μƒμ„±ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ macOS μ‹œμž‘ λ³Όλ₯¨μ€ **APFS (Apple File System)**λ₯Ό μ‚¬μš©ν•˜μ—¬ 이 μƒˆλ‘œμš΄ μŠ€λƒ…μƒ·μœΌλ‘œ μ „ν™˜ν•©λ‹ˆλ‹€. μ—…λ°μ΄νŠΈ 적용 과정이 더 μ•ˆμ „ν•˜κ³  μ‹ λ’°ν•  수 있게 되며, μ—…λ°μ΄νŠΈ 쀑 λ¬Έμ œκ°€ λ°œμƒν•  경우 μ‹œμŠ€ν…œμ΄ 항상 이전 μŠ€λƒ…μƒ·μœΌλ‘œ 되돌릴 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. 데이터 뢄리: macOS Catalinaμ—μ„œ λ„μž…λœ 데이터와 μ‹œμŠ€ν…œ λ³Όλ₯¨ 뢄리 κ°œλ…κ³Ό ν•¨κ»˜, Sealed System Snapshot κΈ°λŠ₯은 λͺ¨λ“  데이터와 섀정이 λ³„λ„μ˜ β€œData” λ³Όλ₯¨μ— μ €μž₯λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€. 이 λΆ„λ¦¬λŠ” 데이터λ₯Ό μ‹œμŠ€ν…œκ³Ό λ…λ¦½μ μœΌλ‘œ λ§Œλ“€μ–΄ μ‹œμŠ€ν…œ μ—…λ°μ΄νŠΈ 과정을 λ‹¨μˆœν™”ν•˜κ³  μ‹œμŠ€ν…œ λ³΄μ•ˆμ„ κ°•ν™”ν•©λ‹ˆλ‹€.

이 μŠ€λƒ…μƒ·μ€ macOS에 μ˜ν•΄ μžλ™μœΌλ‘œ κ΄€λ¦¬λ˜λ©°, APFS의 곡간 곡유 κΈ°λŠ₯ 덕뢄에 λ””μŠ€ν¬μ— μΆ”κ°€ 곡간을 μ°¨μ§€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ΄λŸ¬ν•œ μŠ€λƒ…μƒ·μ€ 전체 μ‹œμŠ€ν…œμ˜ μ‚¬μš©μž μ ‘κ·Ό κ°€λŠ₯ν•œ 백업인 Time Machine snapshotsμ™€λŠ” λ‹€λ₯΄λ‹€λŠ” 점도 μ€‘μš”ν•©λ‹ˆλ‹€.

Check Snapshots

The command diskutil apfs list lists the details of the APFS volumes and their layout:

+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13
|   ====================================================
|   APFS Container Reference:     disk3
|   Size (Capacity Ceiling):      494384795648 B (494.4 GB)
|   Capacity In Use By Volumes:   219214536704 B (219.2 GB) (44.3% used)
|   Capacity Not Allocated:       275170258944 B (275.2 GB) (55.7% free)
|   |
|   +-< Physical Store disk0s2 86D4B7EC-6FA5-4042-93A7-D3766A222EBE
|   |   -----------------------------------------------------------
|   |   APFS Physical Store Disk:   disk0s2
|   |   Size:                       494384795648 B (494.4 GB)
|   |
|   +-> Volume disk3s1 7A27E734-880F-4D91-A703-FB55861D49B7
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk3s1 (System)
|   |   Name:                      Macintosh HD (Case-insensitive)
|   |   Mount Point:               /System/Volumes/Update/mnt1
|   |   Capacity Consumed:         12819210240 B (12.8 GB)
|   |   Sealed:                    Broken
|   |   FileVault:                 Yes (Unlocked)
|   |   Encrypted:                 No
|   |   |
|   |   Snapshot:                  FAA23E0C-791C-43FF-B0E7-0E1C0810AC61
|   |   Snapshot Disk:             disk3s1s1
|   |   Snapshot Mount Point:      /
|   |   Snapshot Sealed:           Yes
[...]
+-> Volume disk3s5 281959B7-07A1-4940-BDDF-6419360F3327
|   ---------------------------------------------------
|   APFS Volume Disk (Role):   disk3s5 (Data)
|   Name:                      Macintosh HD - Data (Case-insensitive)
    |   Mount Point:               /System/Volumes/Data
    |   Capacity Consumed:         412071784448 B (412.1 GB)
    |   Sealed:                    No
|   FileVault:                 Yes (Unlocked)

In the previous output it’s possible to see that user-accessible locations are mounted under /System/Volumes/Data.

Moreover, macOS System volume snapshot is mounted in / and it’s sealed (cryptographically signed by the OS). So, if SIP is bypassed and modifies it, the OS won’t boot anymore.

It’s also possible to verify that seal is enabled by running:

csrutil authenticated-root status
Authenticated Root status: enabled

λ˜ν•œ, μŠ€λƒ…μƒ· λ””μŠ€ν¬λŠ” 읽기 μ „μš©μœΌλ‘œ λ§ˆμš΄νŠΈλ©λ‹ˆλ‹€:

mount
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)

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 μ§€μ›ν•˜κΈ°