macOS - AMFI - AppleMobileFileIntegrity

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

AppleMobileFileIntegrity.kext 및 amfid

μ‹œμŠ€ν…œμ—μ„œ μ‹€ν–‰λ˜λŠ” μ½”λ“œμ˜ 무결성을 보μž₯ν•˜λŠ” 데 쀑점을 두며, XNU의 μ½”λ“œ μ„œλͺ… 검증 뒀에 μžˆλŠ” 논리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λ˜ν•œ κΆŒν•œμ„ ν™•μΈν•˜κ³  디버깅 ν—ˆμš© λ˜λŠ” μž‘μ—… 포트 νšλ“κ³Ό 같은 λ‹€λ₯Έ λ―Όκ°ν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ²Œλ‹€κ°€, 일뢀 μž‘μ—…μ˜ 경우 kextλŠ” μ‚¬μš©μž κ³΅κ°„μ—μ„œ μ‹€ν–‰λ˜λŠ” 데λͺ¬ /usr/libexec/amfid에 μ—°λ½ν•˜λŠ” 것을 μ„ ν˜Έν•©λ‹ˆλ‹€. 이 μ‹ λ’° κ΄€κ³„λŠ” μ—¬λŸ¬ νƒˆμ˜₯μ—μ„œ μ•…μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

AMFIλŠ” MACF 정책을 μ‚¬μš©ν•˜λ©° μ‹œμž‘λ˜λŠ” μˆœκ°„ 후크λ₯Ό λ“±λ‘ν•©λ‹ˆλ‹€. λ˜ν•œ, 이λ₯Ό λ‘œλ“œν•˜κ±°λ‚˜ μ–Έλ‘œλ“œν•˜λŠ” 것을 λ°©μ§€ν•˜λ©΄ 컀널 νŒ¨λ‹‰μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ AMFIλ₯Ό μ•½ν™”μ‹œν‚€λŠ” λͺ‡ κ°€μ§€ λΆ€νŒ… μΈμˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€:

  • amfi_unrestricted_task_for_pid: ν•„μš”ν•œ κΆŒν•œ 없이 task_for_pidλ₯Ό ν—ˆμš©
  • amfi_allow_any_signature: λͺ¨λ“  μ½”λ“œ μ„œλͺ…을 ν—ˆμš©
  • cs_enforcement_disable: μ½”λ“œ μ„œλͺ… 집행을 λΉ„ν™œμ„±ν™”ν•˜λŠ” μ‹œμŠ€ν…œ 전체 인수
  • amfi_prevent_old_entitled_platform_binaries: κΆŒν•œμ΄ μžˆλŠ” ν”Œλž«νΌ λ°”μ΄λ„ˆλ¦¬λ₯Ό λ¬΄νš¨ν™”
  • amfi_get_out_of_my_way: amfiλ₯Ό μ™„μ „νžˆ λΉ„ν™œμ„±ν™”

λ‹€μŒμ€ λ“±λ‘λ˜λŠ” MACF μ •μ±… 쀑 μΌλΆ€μž…λ‹ˆλ‹€:

  • cred_check_label_update_execve: λ ˆμ΄λΈ” μ—…λ°μ΄νŠΈκ°€ μˆ˜ν–‰λ˜λ©° 1을 λ°˜ν™˜
  • cred_label_associate: AMFI의 mac λ ˆμ΄λΈ” μŠ¬λ‘―μ„ λ ˆμ΄λΈ”λ‘œ μ—…λ°μ΄νŠΈ
  • cred_label_destroy: AMFI의 mac λ ˆμ΄λΈ” 슬둯 제거
  • cred_label_init: AMFI의 mac λ ˆμ΄λΈ” μŠ¬λ‘―μ— 0 이동
  • cred_label_update_execve: ν”„λ‘œμ„ΈμŠ€μ˜ κΆŒν•œμ„ ν™•μΈν•˜μ—¬ λ ˆμ΄λΈ”μ„ μˆ˜μ •ν•  수 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  • file_check_mmap: mmap이 λ©”λͺ¨λ¦¬λ₯Ό νšλ“ν•˜κ³  이λ₯Ό μ‹€ν–‰ κ°€λŠ₯으둜 μ„€μ •ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 이 경우 라이브러리 검증이 ν•„μš”ν•œμ§€ ν™•μΈν•˜κ³ , ν•„μš”ν•˜λ‹€λ©΄ 라이브러리 검증 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
  • file_check_library_validation: 라이브러리 검증 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν”Œλž«νΌ λ°”μ΄λ„ˆλ¦¬κ°€ λ‹€λ₯Έ ν”Œλž«νΌ λ°”μ΄λ„ˆλ¦¬λ₯Ό λ‘œλ“œν•˜λŠ”μ§€ λ˜λŠ” ν”„λ‘œμ„ΈμŠ€μ™€ μƒˆλ‘œ λ‘œλ“œλœ 파일이 λ™μΌν•œ TeamIDλ₯Ό κ°€μ§€κ³  μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. νŠΉμ • κΆŒν•œμ€ λͺ¨λ“  라이브러리λ₯Ό λ‘œλ“œν•  수 μžˆλ„λ‘ ν—ˆμš©ν•©λ‹ˆλ‹€.
  • policy_initbsd: μ‹ λ’°ν•  수 μžˆλŠ” NVRAM ν‚€ μ„€μ •
  • policy_syscall: λ°”μ΄λ„ˆλ¦¬μ— μ œν•œ μ—†λŠ” μ„Έκ·Έλ¨ΌνŠΈκ°€ μžˆλŠ”μ§€, env λ³€μˆ˜λ₯Ό ν—ˆμš©ν•΄μ•Ό ν•˜λŠ”μ§€μ™€ 같은 DYLD 정책을 ν™•μΈν•©λ‹ˆλ‹€β€¦ μ΄λŠ” amfi_check_dyld_policy_self()λ₯Ό 톡해 ν”„λ‘œμ„ΈμŠ€κ°€ μ‹œμž‘λ  λ•Œλ„ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  • proc_check_inherit_ipc_ports: ν”„λ‘œμ„ΈμŠ€κ°€ μƒˆ λ°”μ΄λ„ˆλ¦¬λ₯Ό μ‹€ν–‰ν•  λ•Œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—… ν¬νŠΈμ— λŒ€ν•œ SEND κΆŒν•œμ„ μœ μ§€ν•΄μ•Ό ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. ν”Œλž«νΌ λ°”μ΄λ„ˆλ¦¬λŠ” ν—ˆμš©λ˜λ©°, get-task-allow κΆŒν•œμ΄ 이λ₯Ό ν—ˆμš©ν•˜κ³ , task_for_pid-allow κΆŒν•œμ΄ ν—ˆμš©λ˜λ©° λ™μΌν•œ TeamIDλ₯Ό κ°€μ§„ λ°”μ΄λ„ˆλ¦¬λ„ ν—ˆμš©λ©λ‹ˆλ‹€.
  • proc_check_expose_task: κΆŒν•œ μ§‘ν–‰
  • amfi_exc_action_check_exception_send: μ˜ˆμ™Έ λ©”μ‹œμ§€κ°€ 디버거에 μ „μ†‘λ©λ‹ˆλ‹€.
  • amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update: μ˜ˆμ™Έ 처리(디버깅) 쀑 λ ˆμ΄λΈ” 생λͺ…μ£ΌκΈ°
  • proc_check_get_task: get-task-allow와 같은 κΆŒν•œμ„ ν™•μΈν•˜μ—¬ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μž‘μ—… 포트λ₯Ό κ°€μ Έμ˜€κ³  task_for_pid-allowκ°€ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—… 포트λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ„λ‘ ν—ˆμš©ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. λ‘˜ λ‹€ ν•΄λ‹Ήλ˜μ§€ μ•ŠμœΌλ©΄ amfid permitunrestricteddebugging에 ν˜ΈμΆœν•˜μ—¬ ν—ˆμš©λ˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  • proc_check_mprotect: mprotectκ°€ VM_PROT_TRUSTED ν”Œλž˜κ·Έμ™€ ν•¨κ»˜ 호좜되면 κ±°λΆ€ν•©λ‹ˆλ‹€. μ΄λŠ” ν•΄λ‹Ή μ˜μ—­μ΄ μœ νš¨ν•œ μ½”λ“œ μ„œλͺ…이 μžˆλŠ” κ²ƒμ²˜λŸΌ μ²˜λ¦¬λ˜μ–΄μ•Ό 함을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • vnode_check_exec: μ‹€ν–‰ 파일이 λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ 호좜되며, cs_hard | cs_kill을 μ„€μ •ν•˜μ—¬ νŽ˜μ΄μ§€κ°€ λ¬΄νš¨ν™”λ˜λ©΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•©λ‹ˆλ‹€.
  • vnode_check_getextattr: MacOS: com.apple.root.installed 및 isVnodeQuarantined() 확인
  • vnode_check_setextattr: get + com.apple.private.allow-bless 및 λ‚΄λΆ€ μ„€μΉ˜μž 동등 κΆŒν•œ
  • vnode_check_signature: κΆŒν•œ, μ‹ λ’° μΊμ‹œ 및 amfidλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œ μ„œλͺ…을 ν™•μΈν•˜κΈ° μœ„ν•΄ XNUλ₯Ό ν˜ΈμΆœν•˜λŠ” μ½”λ“œ
  • proc_check_run_cs_invalid: ptrace() 호좜(PT_ATTACH 및 PT_TRACE_ME)을 κ°€λ‘œμ±•λ‹ˆλ‹€. get-task-allow, run-invalid-allow 및 run-unsigned-code와 같은 κΆŒν•œμ„ ν™•μΈν•˜κ³ , μ—†μœΌλ©΄ 디버깅이 ν—ˆμš©λ˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  • proc_check_map_anon: mmap이 MAP_JIT ν”Œλž˜κ·Έμ™€ ν•¨κ»˜ 호좜되면 AMFIλŠ” dynamic-codesigning κΆŒν•œμ„ ν™•μΈν•©λ‹ˆλ‹€.

AMFI.kextλŠ” λ‹€λ₯Έ 컀널 ν™•μž₯을 μœ„ν•œ API도 λ…ΈμΆœν•˜λ©°, λ‹€μŒμ„ 톡해 쒅속성을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€:

kextstat | grep " 19 " | cut -c2-5,50- | cut -d '(' -f1
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
8   com.apple.kec.corecrypto
19   com.apple.driver.AppleMobileFileIntegrity
22   com.apple.security.sandbox
24   com.apple.AppleSystemPolicy
67   com.apple.iokit.IOUSBHostFamily
70   com.apple.driver.AppleUSBTDM
71   com.apple.driver.AppleSEPKeyStore
74   com.apple.iokit.EndpointSecurity
81   com.apple.iokit.IOUserEthernet
101   com.apple.iokit.IO80211Family
102   com.apple.driver.AppleBCMWLANCore
118   com.apple.driver.AppleEmbeddedUSBHost
134   com.apple.iokit.IOGPUFamily
135   com.apple.AGXG13X
137   com.apple.iokit.IOMobileGraphicsFamily
138   com.apple.iokit.IOMobileGraphicsFamily-DCP
162   com.apple.iokit.IONVMeFamily

amfid

이것은 AMFI.kextκ°€ μ‚¬μš©μž λͺ¨λ“œμ—μ„œ μ½”λ“œ μ„œλͺ…을 ν™•μΈν•˜λŠ” 데 μ‚¬μš©ν•  μ‚¬μš©μž λͺ¨λ“œ μ‹€ν–‰ 데λͺ¬μž…λ‹ˆλ‹€.
AMFI.kextκ°€ 데λͺ¬κ³Ό ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ HOST_AMFID_PORTλΌλŠ” νŠΉλ³„ν•œ 포트 18λ₯Ό 톡해 mach λ©”μ‹œμ§€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

macOSμ—μ„œλŠ” 루트 ν”„λ‘œμ„ΈμŠ€κ°€ νŠΉλ³„ν•œ 포트λ₯Ό κ°€λ‘œμ±„λŠ” 것이 더 이상 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 점에 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” SIP에 μ˜ν•΄ 보호되며 였직 launchd만이 이λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. iOSμ—μ„œλŠ” 응닡을 λ‹€μ‹œ λ³΄λ‚΄λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ amfid의 CDHashκ°€ ν•˜λ“œμ½”λ”©λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

amfidκ°€ 이진 νŒŒμΌμ„ ν™•μΈν•˜λ„λ‘ μš”μ²­λ  λ•Œμ™€ κ·Έ 응닡을 λ³Ό 수 있으며, 이λ₯Ό λ””λ²„κΉ…ν•˜κ³  mach_msg에 쀑단점을 μ„€μ •ν•˜μ—¬ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

νŠΉλ³„ν•œ 포트λ₯Ό 톡해 λ©”μ‹œμ§€κ°€ μˆ˜μ‹ λ˜λ©΄ MIGκ°€ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜μ— 각 ν•¨μˆ˜λ₯Ό μ „μ†‘ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ£Όμš” ν•¨μˆ˜λŠ” λ¦¬λ²„μŠ€ μ—”μ§€λ‹ˆμ–΄λ§λ˜μ–΄ μ±… μ•ˆμ—μ„œ μ„€λͺ…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Provisioning Profiles

ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œνŒŒμΌμ€ μ½”λ“œλ₯Ό μ„œλͺ…ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œ μ„œλͺ… 및 ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•  수 μžˆλŠ” Developer ν”„λ‘œνŒŒμΌκ³Ό λͺ¨λ“  μž₯μΉ˜μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” Enterprise ν”„λ‘œνŒŒμΌμ΄ μžˆμŠ΅λ‹ˆλ‹€.

앱이 Apple Store에 제좜된 ν›„ 승인되면 Apple에 μ˜ν•΄ μ„œλͺ…λ˜λ©° 더 이상 ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œνŒŒμΌμ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν”„λ‘œνŒŒμΌμ€ 일반적으둜 .mobileprovision λ˜λŠ” .provisionprofile ν™•μž₯자λ₯Ό μ‚¬μš©ν•˜λ©°, λ‹€μŒκ³Ό 같이 덀프할 수 μžˆμŠ΅λ‹ˆλ‹€:

openssl asn1parse -inform der -in /path/to/profile

# Or

security cms -D -i /path/to/profile

비둝 λ•Œλ•Œλ‘œ μΈμ¦μ„œ(certificated)라고 λΆˆλ¦¬μ§€λ§Œ, μ΄λŸ¬ν•œ ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œνŒŒμΌμ€ μΈμ¦μ„œ μ΄μƒμ˜ λ‚΄μš©μ„ ν¬ν•¨ν•©λ‹ˆλ‹€:

  • AppIDName: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹λ³„μž
  • AppleInternalProfile: 이λ₯Ό Apple λ‚΄λΆ€ ν”„λ‘œνŒŒμΌλ‘œ μ§€μ •
  • ApplicationIdentifierPrefix: AppIDName μ•žμ— 좔가됨 (TeamIdentifier와 동일)
  • CreationDate: YYYY-MM-DDTHH:mm:ssZ ν˜•μ‹μ˜ λ‚ μ§œ
  • DeveloperCertificates: Base64 λ°μ΄ν„°λ‘œ μΈμ½”λ”©λœ (보톡 ν•˜λ‚˜μ˜) μΈμ¦μ„œ λ°°μ—΄
  • Entitlements: 이 ν”„λ‘œνŒŒμΌμ— ν—ˆμš©λœ κΆŒν•œ
  • ExpirationDate: YYYY-MM-DDTHH:mm:ssZ ν˜•μ‹μ˜ 만료 λ‚ μ§œ
  • Name: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이름, AppIDNameκ³Ό 동일
  • ProvisionedDevices: 이 ν”„λ‘œνŒŒμΌμ΄ μœ νš¨ν•œ UDID의 λ°°μ—΄ (개발자 μΈμ¦μ„œμš©)
  • ProvisionsAllDevices: λΆˆλ¦¬μ–Έ (κΈ°μ—… μΈμ¦μ„œμ˜ 경우 true)
  • TeamIdentifier: 인터 μ•± μƒν˜Έμž‘μš© λͺ©μ μ„ μœ„ν•΄ 개발자λ₯Ό μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” (보톡 ν•˜λ‚˜μ˜) μ•ŒνŒŒλ²³ 숫자 λ¬Έμžμ—΄ λ°°μ—΄
  • TeamName: 개발자λ₯Ό μ‹λ³„ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” 이름
  • TimeToLive: μΈμ¦μ„œμ˜ 유효 κΈ°κ°„ (일 λ‹¨μœ„)
  • UUID: 이 ν”„λ‘œνŒŒμΌμ˜ λ²”μš© 고유 μ‹λ³„μž
  • Version: ν˜„μž¬ 1둜 섀정됨

κΆŒν•œ ν•­λͺ©μ€ μ œν•œλœ κΆŒν•œ 집합을 ν¬ν•¨ν•˜λ©°, ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œνŒŒμΌμ€ Apple의 개인 κΆŒν•œμ„ λΆ€μ—¬ν•˜μ§€ μ•Šλ„λ‘ νŠΉμ • κΆŒν•œλ§Œ λΆ€μ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œνŒŒμΌμ€ 일반적으둜 /var/MobileDeviceProvisioningProfiles에 μœ„μΉ˜ν•˜λ©°, security cms -D -i /path/to/profile λͺ…λ Ήμ–΄λ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

libmis.dyld

μ΄λŠ” amfidκ°€ 무언가λ₯Ό ν—ˆμš©ν•΄μ•Ό ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό 묻기 μœ„ν•΄ ν˜ΈμΆœν•˜λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. μ΄λŠ” μ—­μ‚¬μ μœΌλ‘œ νƒˆμ˜₯(jailbreaking)μ—μ„œ λͺ¨λ“  것을 ν—ˆμš©ν•˜λŠ” 백도어 버전을 μ‹€ν–‰ν•˜μ—¬ λ‚¨μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

macOSμ—μ„œλŠ” MobileDevice.framework 내뢀에 μžˆμŠ΅λ‹ˆλ‹€.

AMFI μ‹ λ’° μΊμ‹œ

iOS AMFIλŠ” **μ‹ λ’° μΊμ‹œ(Trust Cache)**라고 λΆˆλ¦¬λŠ”, μž„μ˜λ‘œ μ„œλͺ…λœ μ•Œλ €μ§„ ν•΄μ‹œ λͺ©λ‘μ„ μœ μ§€ν•˜λ©°, μ΄λŠ” kext의 __TEXT.__const μ„Ήμ…˜μ— μžˆμŠ΅λ‹ˆλ‹€. 맀우 νŠΉμ •ν•˜κ³  λ―Όκ°ν•œ μž‘μ—…μ—μ„œλŠ” μ™ΈλΆ€ 파일둜 이 μ‹ λ’° μΊμ‹œλ₯Ό ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

References

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