mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 14:10:41 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
b59bca9dde
commit
ead98fac89
2 changed files with 242 additions and 89 deletions
|
@ -1,8 +1,8 @@
|
|||
# macOS Sandbox
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -17,11 +17,11 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
## Basic Information
|
||||
|
||||
MacOS Sandbox (초기 이름: Seatbelt) **는 샌드박스 내에서 실행되는 애플리케이션의** **허용된 작업을 샌드박스 프로필에 지정된 대로 제한**합니다. 이는 **애플리케이션이 예상된 리소스만 접근하도록 보장하는 데 도움**이 됩니다.
|
||||
MacOS Sandbox (초기에는 Seatbelt라고 불림) **는 샌드박스 내에서 실행되는 애플리케이션의** **허용된 작업을 샌드박스 프로필에 지정된 대로 제한**합니다. 이는 **애플리케이션이 예상된 리소스만 접근하도록 보장하는 데 도움**이 됩니다.
|
||||
|
||||
**`com.apple.security.app-sandbox`** 권한을 가진 모든 앱은 샌드박스 내에서 실행됩니다. **Apple 바이너리**는 일반적으로 샌드박스 내에서 실행되며, **App Store**에 배포하기 위해서는 **이 권한이 필수적**입니다. 따라서 대부분의 애플리케이션은 샌드박스 내에서 실행됩니다.
|
||||
**`com.apple.security.app-sandbox`** 권한을 가진 모든 앱은 샌드박스 내에서 실행됩니다. **Apple 바이너리**는 일반적으로 샌드박스 내에서 실행되며, **App Store의 모든 애플리케이션은 해당 권한을 가집니다**. 따라서 여러 애플리케이션이 샌드박스 내에서 실행됩니다.
|
||||
|
||||
프로세스가 할 수 있는 것과 할 수 없는 것을 제어하기 위해 **샌드박스는 커널 전역의 모든** **syscalls**에 후크를 가지고 있습니다. **앱의 권한에 따라** 샌드박스는 특정 작업을 **허용**합니다.
|
||||
프로세스가 할 수 있는 것과 할 수 없는 것을 제어하기 위해 **샌드박스는** 프로세스가 시도할 수 있는 거의 모든 작업(대부분의 시스템 호출 포함)에 **MACF**를 사용하여 후크를 가지고 있습니다. 그러나 앱의 **권한**에 따라 샌드박스는 프로세스에 대해 더 관대할 수 있습니다.
|
||||
|
||||
샌드박스의 몇 가지 중요한 구성 요소는 다음과 같습니다:
|
||||
|
||||
|
@ -30,7 +30,9 @@ MacOS Sandbox (초기 이름: Seatbelt) **는 샌드박스 내에서 실행되
|
|||
* 사용자 공간에서 실행되는 **데몬** `/usr/libexec/sandboxd`
|
||||
* **컨테이너** `~/Library/Containers`
|
||||
|
||||
컨테이너 폴더 내에는 **샌드박스에서 실행되는 각 앱에 대한 폴더**가 번들 ID 이름으로 있습니다:
|
||||
### Containers
|
||||
|
||||
모든 샌드박스 애플리케이션은 `~/Library/Containers/{CFBundleIdentifier}`에 고유한 컨테이너를 가집니다:
|
||||
```bash
|
||||
ls -l ~/Library/Containers
|
||||
total 0
|
||||
|
@ -41,7 +43,7 @@ drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings
|
|||
drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
|
||||
[...]
|
||||
```
|
||||
각 번들 ID 폴더 안에는 앱의 **plist**와 **데이터 디렉토리**를 찾을 수 있습니다:
|
||||
각 번들 ID 폴더 안에는 홈 폴더를 모방한 구조를 가진 **plist**와 앱의 **데이터 디렉토리**를 찾을 수 있습니다:
|
||||
```bash
|
||||
cd /Users/username/Library/Containers/com.apple.Safari
|
||||
ls -la
|
||||
|
@ -65,10 +67,13 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
|
|||
drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
주의: 심볼릭 링크가 Sandbox에서 "탈출"하여 다른 폴더에 접근하기 위해 존재하더라도, 앱은 여전히 **접근할 수 있는 권한**이 필요합니다. 이러한 권한은 **`.plist`** 안에 있습니다.
|
||||
주의: 심볼릭 링크가 Sandbox에서 "탈출"하여 다른 폴더에 접근하기 위해 존재하더라도, 앱은 여전히 **접근 권한**이 필요합니다. 이 권한은 `RedirectablePaths`의 **`.plist`** 안에 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
**`SandboxProfileData`**는 B64로 이스케이프된 컴파일된 샌드박스 프로필 CFData입니다.
|
||||
```bash
|
||||
# Get permissions
|
||||
# Get container config
|
||||
## You need FDA to access the file, not even just root can read it
|
||||
plutil -convert xml1 .com.apple.containermanagerd.metadata.plist -o -
|
||||
|
||||
# Binary sandbox profile
|
||||
|
@ -115,12 +120,12 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
|||
[...]
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Sandboxed 애플리케이션에 의해 생성/수정된 모든 항목은 **격리 속성**을 갖게 됩니다. 이는 샌드박스 앱이 **`open`**으로 무언가를 실행하려고 할 때 Gatekeeper를 트리거하여 샌드박스 공간을 방지합니다.
|
||||
Sandboxed 애플리케이션에 의해 생성/수정된 모든 것은 **격리 속성**을 갖게 됩니다. 이는 샌드박스 앱이 **`open`**으로 무언가를 실행하려고 할 때 Gatekeeper를 트리거하여 샌드박스 공간을 방지합니다.
|
||||
{% endhint %}
|
||||
|
||||
### 샌드박스 프로필
|
||||
## 샌드박스 프로필
|
||||
|
||||
샌드박스 프로필은 해당 **샌드박스**에서 **허용/금지**될 항목을 나타내는 구성 파일입니다. 이는 [**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\)) 프로그래밍 언어를 사용하는 **샌드박스 프로필 언어(SBPL)**를 사용합니다.
|
||||
샌드박스 프로필은 해당 **샌드박스**에서 **허용/금지**될 사항을 나타내는 구성 파일입니다. 이는 [**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\)) 프로그래밍 언어를 사용하는 **샌드박스 프로필 언어(SBPL)**를 사용합니다.
|
||||
|
||||
여기 예시를 찾을 수 있습니다:
|
||||
```scheme
|
||||
|
@ -141,22 +146,24 @@ Sandboxed 애플리케이션에 의해 생성/수정된 모든 항목은 **격
|
|||
)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
이 [**연구**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **를 확인하여 허용되거나 거부될 수 있는 추가 작업을 확인하세요.**
|
||||
이 [**연구**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/)를 확인하여 허용되거나 거부될 수 있는 추가 작업을 확인하세요.
|
||||
|
||||
프로파일의 컴파일된 버전에서는 작업의 이름이 dylib와 kext에서 알려진 배열의 항목으로 대체되어 컴파일된 버전이 더 짧고 읽기 어렵게 됩니다.
|
||||
{% endhint %}
|
||||
|
||||
중요한 **시스템 서비스**는 `mdnsresponder` 서비스와 같은 자체 맞춤 **샌드박스** 내에서 실행됩니다. 이러한 맞춤 **샌드박스 프로필**은 다음 위치에서 확인할 수 있습니다:
|
||||
중요한 **시스템 서비스**는 `mdnsresponder` 서비스와 같은 자체 맞춤 **샌드박스** 내에서 실행됩니다. 이러한 맞춤 **샌드박스 프로파일**은 다음 위치에서 확인할 수 있습니다:
|
||||
|
||||
* **`/usr/share/sandbox`**
|
||||
* **`/System/Library/Sandbox/Profiles`** 
|
||||
* 다른 샌드박스 프로필은 [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles)에서 확인할 수 있습니다.
|
||||
* **`/System/Library/Sandbox/Profiles`**
|
||||
* 다른 샌드박스 프로파일은 [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles)에서 확인할 수 있습니다.
|
||||
|
||||
**App Store** 앱은 **프로필** **`/System/Library/Sandbox/Profiles/application.sb`**를 사용합니다. 이 프로필에서 **`com.apple.security.network.server`**와 같은 권한이 프로세스가 네트워크를 사용할 수 있도록 허용하는 방법을 확인할 수 있습니다.
|
||||
**App Store** 앱은 **프로파일** **`/System/Library/Sandbox/Profiles/application.sb`**를 사용합니다. 이 프로파일에서 **`com.apple.security.network.server`**와 같은 권한이 프로세스가 네트워크를 사용할 수 있도록 허용하는 방법을 확인할 수 있습니다.
|
||||
|
||||
SIP는 /System/Library/Sandbox/rootless.conf에 있는 platform\_profile이라는 샌드박스 프로필입니다.
|
||||
SIP는 /System/Library/Sandbox/rootless.conf에 있는 platform\_profile이라는 샌드박스 프로파일입니다.
|
||||
|
||||
### 샌드박스 프로필 예시
|
||||
### 샌드박스 프로파일 예시
|
||||
|
||||
특정 샌드박스 프로필로 애플리케이션을 시작하려면 다음을 사용할 수 있습니다:
|
||||
특정 샌드박스 프로파일로 애플리케이션을 시작하려면 다음을 사용할 수 있습니다:
|
||||
```bash
|
||||
sandbox-exec -f example.sb /Path/To/The/Application
|
||||
```
|
||||
|
@ -219,40 +226,47 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
|
|||
* [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
|
||||
* [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (그들은 `~$`로 시작하는 이름의 파일을 샌드박스 외부에 쓸 수 있습니다).
|
||||
|
||||
### MacOS 샌드박스 프로파일
|
||||
### 샌드박스 추적
|
||||
|
||||
macOS는 시스템 샌드박스 프로파일을 두 위치에 저장합니다: **/usr/share/sandbox/** 및 **/System/Library/Sandbox/Profiles**.
|
||||
#### 프로필을 통한
|
||||
|
||||
작업이 확인될 때마다 샌드박스가 수행하는 모든 검사를 추적할 수 있습니다. 이를 위해 다음 프로필을 생성하십시오:
|
||||
|
||||
{% code title="trace.sb" %}
|
||||
```scheme
|
||||
(version 1)
|
||||
(trace /tmp/trace.out)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
그런 다음 해당 프로필을 사용하여 무언가를 실행하십시오:
|
||||
```bash
|
||||
sandbox-exec -f /tmp/trace.sb /bin/ls
|
||||
```
|
||||
In `/tmp/trace.out`에서는 호출될 때마다 수행된 각 샌드박스 검사를 볼 수 있습니다(즉, 많은 중복이 발생합니다).
|
||||
|
||||
**`-t`** 매개변수를 사용하여 샌드박스를 추적할 수도 있습니다: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
|
||||
|
||||
#### API를 통한 방법
|
||||
|
||||
`libsystem_sandbox.dylib`에서 내보낸 `sandbox_set_trace_path` 함수는 샌드박스 검사가 기록될 추적 파일 이름을 지정할 수 있게 해줍니다.\
|
||||
`sandbox_vtrace_enable()`을 호출하고, 그 후 `sandbox_vtrace_report()`를 호출하여 버퍼에서 로그 오류를 가져오는 유사한 작업도 가능합니다.
|
||||
|
||||
### 샌드박스 검사
|
||||
|
||||
`libsandbox.dylib`는 프로세스의 샌드박스 상태 목록(확장 포함)을 제공하는 `sandbox_inspect_pid`라는 함수를 내보냅니다. 그러나 이 함수는 플랫폼 바이너리만 사용할 수 있습니다.
|
||||
|
||||
### MacOS 및 iOS 샌드박스 프로파일
|
||||
|
||||
MacOS는 시스템 샌드박스 프로파일을 두 위치에 저장합니다: **/usr/share/sandbox/** 및 **/System/Library/Sandbox/Profiles**.
|
||||
|
||||
그리고 서드파티 애플리케이션이 _**com.apple.security.app-sandbox**_ 권한을 가지고 있다면, 시스템은 해당 프로세스에 **/System/Library/Sandbox/Profiles/application.sb** 프로파일을 적용합니다.
|
||||
|
||||
### **iOS 샌드박스 프로파일**
|
||||
iOS에서는 기본 프로파일이 **container**라고 하며, SBPL 텍스트 표현이 없습니다. 메모리에서 이 샌드박스는 샌드박스의 각 권한에 대해 허용/거부 이진 트리로 표현됩니다.
|
||||
|
||||
기본 프로파일은 **container**라고 하며, SBPL 텍스트 표현이 없습니다. 메모리에서 이 샌드박스는 샌드박스의 각 권한에 대해 허용/거부 이진 트리로 표현됩니다.
|
||||
### App Store 앱의 사용자 정의 SBPL
|
||||
|
||||
### 디버그 및 샌드박스 우회
|
||||
|
||||
macOS에서는 iOS와 달리 프로세스가 커널에 의해 처음부터 샌드박스에 격리되지 않으며, **프로세스가 스스로 샌드박스에 참여해야 합니다**. 이는 macOS에서 프로세스가 적극적으로 샌드박스에 들어가기로 결정할 때까지 샌드박스에 의해 제한되지 않음을 의미합니다.
|
||||
|
||||
프로세스는 `com.apple.security.app-sandbox` 권한이 있을 경우 사용자 공간에서 시작할 때 자동으로 샌드박스화됩니다. 이 프로세스에 대한 자세한 설명은 다음을 확인하십시오:
|
||||
|
||||
{% content-ref url="macos-sandbox-debug-and-bypass/" %}
|
||||
[macos-sandbox-debug-and-bypass](macos-sandbox-debug-and-bypass/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **PID 권한 확인**
|
||||
|
||||
[**이것에 따르면**](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s), **`sandbox_check`** (이는 `__mac_syscall`입니다)는 특정 PID에 대해 **작업이 허용되는지 여부**를 확인할 수 있습니다.
|
||||
|
||||
[**도구 sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c)은 PID가 특정 작업을 수행할 수 있는지 확인할 수 있습니다:
|
||||
```bash
|
||||
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
|
||||
sbtool <pid> file /tmp #Check file access
|
||||
sbtool <pid> inspect #Gives you an explaination of the sandbox profile
|
||||
sbtool <pid> all
|
||||
```
|
||||
### Custom SBPL in App Store apps
|
||||
|
||||
회사가 **사용자 정의 샌드박스 프로필**로 앱을 실행할 수 있을 가능성이 있습니다 (기본 프로필 대신). 그들은 Apple에 의해 승인되어야 하는 권한 **`com.apple.security.temporary-exception.sbpl`**을 사용해야 합니다.
|
||||
회사가 **사용자 정의 샌드박스 프로파일**로 앱을 실행할 수 있는 가능성이 있습니다(기본 프로파일 대신). 그들은 Apple의 승인이 필요한 **`com.apple.security.temporary-exception.sbpl`** 권한을 사용해야 합니다.
|
||||
|
||||
이 권한의 정의는 **`/System/Library/Sandbox/Profiles/application.sb:`**에서 확인할 수 있습니다.
|
||||
```scheme
|
||||
|
@ -262,19 +276,142 @@ sbtool <pid> all
|
|||
(let* ((port (open-input-string string)) (sbpl (read port)))
|
||||
(with-transparent-redirection (eval sbpl)))))
|
||||
```
|
||||
이 권한 이후의 문자열은 Sandbox 프로필로 **eval**됩니다.
|
||||
This will **eval the string after this entitlement** as an Sandbox profile.
|
||||
|
||||
### Compiling & decompiling a Sandbox Profile
|
||||
|
||||
The **`sandbox-exec`** tool uses the functions `sandbox_compile_*` from `libsandbox.dylib`. The main functions exported are: `sandbox_compile_file` (expects a file path, param `-f`), `sandbox_compile_string` (expects a string, param `-p`), `sandbox_compile_name` (expects a name of a container, param `-n`), `sandbox_compile_entitlements` (expects entitlements plist).
|
||||
|
||||
This reversed and [**open sourced version of the tool sandbox-exec**](https://newosxbook.com/src.jl?tree=listings\&file=/sandbox\_exec.c) allows to make **`sandbox-exec`** write into a file the compiled sandbox profile.
|
||||
|
||||
Moreover, to confine a process inside a container it might call `sandbox_spawnattrs_set[container/profilename]` and pass a container or pre-existing profile.
|
||||
|
||||
## Debug & Bypass Sandbox
|
||||
|
||||
On macOS, unlike iOS where processes are sandboxed from the start by the kernel, **processes must opt-in to the sandbox themselves**. This means on macOS, a process is not restricted by the sandbox until it actively decides to enter it, although App Store apps are always sandboxed.
|
||||
|
||||
Processes are automatically Sandboxed from userland when they start if they have the entitlement: `com.apple.security.app-sandbox`. For a detailed explanation of this process check:
|
||||
|
||||
{% content-ref url="macos-sandbox-debug-and-bypass/" %}
|
||||
[macos-sandbox-debug-and-bypass](macos-sandbox-debug-and-bypass/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Sandbox Extensions**
|
||||
|
||||
Extensions allow to give further privileges to an object and are giving calling one of the functions:
|
||||
|
||||
* `sandbox_issue_extension`
|
||||
* `sandbox_extension_issue_file[_with_new_type]`
|
||||
* `sandbox_extension_issue_mach`
|
||||
* `sandbox_extension_issue_iokit_user_client_class`
|
||||
* `sandbox_extension_issue_iokit_registry_rentry_class`
|
||||
* `sandbox_extension_issue_generic`
|
||||
* `sandbox_extension_issue_posix_ipc`
|
||||
|
||||
The extensions are stored in the second MACF label slot accessible from the process credentials. The following **`sbtool`** can access this information.
|
||||
|
||||
Note that extensions are usually granted by allowed processes, for example, `tccd` will grant the extension token of `com.apple.tcc.kTCCServicePhotos` when a process tried to access the photos and was allowed in a XPC message. Then, the process will need to consume the extension token so it gets added to it.\
|
||||
Note that the extension tokens are long hexadecimals that encode the granted permissions. However they don't have the allowed PID hardcoded which means that any process with access to the token might be **consumed by multiple processes**.
|
||||
|
||||
Note that extensions are very related to entitlements also, so having certain entitlements might automatically grant certain extensions.
|
||||
|
||||
### **Check PID Privileges**
|
||||
|
||||
[**According to this**](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s), the **`sandbox_check`** functions (it's a `__mac_syscall`), can check **if an operation is allowed or not** by the sandbox in a certain PID, audit token or unique ID.
|
||||
|
||||
The [**tool sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c) (find it [compiled here](https://newosxbook.com/articles/hitsb.html)) can check if a PID can perform a certain actions:
|
||||
```bash
|
||||
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
|
||||
sbtool <pid> file /tmp #Check file access
|
||||
sbtool <pid> inspect #Gives you an explanation of the sandbox profile and extensions
|
||||
sbtool <pid> all
|
||||
```
|
||||
### \[un]suspend
|
||||
|
||||
샌드박스를 일시 중지하고 다시 시작하는 것도 가능합니다. `libsystem_sandbox.dylib`의 `sandbox_suspend` 및 `sandbox_unsuspend` 함수를 사용합니다.
|
||||
|
||||
일시 중지 함수를 호출하려면 호출자가 이를 호출할 수 있도록 몇 가지 권한이 확인됩니다:
|
||||
|
||||
* com.apple.private.security.sandbox-manager
|
||||
* com.apple.security.print
|
||||
* com.apple.security.temporary-exception.audio-unit-host
|
||||
|
||||
## mac\_syscall
|
||||
|
||||
이 시스템 호출 (#381)은 첫 번째 인수로 실행할 모듈을 나타내는 문자열을 기대하며, 두 번째 인수로 실행할 함수를 나타내는 코드를 기대합니다. 세 번째 인수는 실행된 함수에 따라 달라집니다.
|
||||
|
||||
함수 `___sandbox_ms` 호출은 `mac_syscall`을 래핑하며 첫 번째 인수로 `"Sandbox"`를 나타냅니다. `___sandbox_msp`는 `mac_set_proc` (#387)의 래퍼입니다. 그런 다음 `___sandbox_ms`에서 지원되는 일부 코드는 다음 표에서 찾을 수 있습니다:
|
||||
|
||||
* **set\_profile (#0)**: 프로세스에 컴파일된 또는 명명된 프로파일을 적용합니다.
|
||||
* **platform\_policy (#1)**: 플랫폼별 정책 검사를 시행합니다 (macOS와 iOS 간에 다름).
|
||||
* **check\_sandbox (#2)**: 특정 샌드박스 작업의 수동 검사를 수행합니다.
|
||||
* **note (#3)**: 샌드박스에 주석을 추가합니다.
|
||||
* **container (#4)**: 일반적으로 디버깅 또는 식별을 위해 샌드박스에 주석을 첨부합니다.
|
||||
* **extension\_issue (#5)**: 프로세스에 대한 새로운 확장을 생성합니다.
|
||||
* **extension\_consume (#6)**: 주어진 확장을 사용합니다.
|
||||
* **extension\_release (#7)**: 사용된 확장에 연결된 메모리를 해제합니다.
|
||||
* **extension\_update\_file (#8)**: 샌드박스 내의 기존 파일 확장의 매개변수를 수정합니다.
|
||||
* **extension\_twiddle (#9)**: 기존 파일 확장을 조정하거나 수정합니다 (예: TextEdit, rtf, rtfd).
|
||||
* **suspend (#10)**: 모든 샌드박스 검사를 일시적으로 중지합니다 (적절한 권한 필요).
|
||||
* **unsuspend (#11)**: 이전에 일시 중지된 모든 샌드박스 검사를 재개합니다.
|
||||
* **passthrough\_access (#12)**: 샌드박스 검사를 우회하여 리소스에 대한 직접적인 패스스루 액세스를 허용합니다.
|
||||
* **set\_container\_path (#13)**: (iOS 전용) 앱 그룹 또는 서명 ID에 대한 컨테이너 경로를 설정합니다.
|
||||
* **container\_map (#14)**: (iOS 전용) `containermanagerd`에서 컨테이너 경로를 검색합니다.
|
||||
* **sandbox\_user\_state\_item\_buffer\_send (#15)**: (iOS 10+) 샌드박스에서 사용자 모드 메타데이터를 설정합니다.
|
||||
* **inspect (#16)**: 샌드박스화된 프로세스에 대한 디버그 정보를 제공합니다.
|
||||
* **dump (#18)**: (macOS 11) 분석을 위해 샌드박스의 현재 프로파일을 덤프합니다.
|
||||
* **vtrace (#19)**: 모니터링 또는 디버깅을 위한 샌드박스 작업을 추적합니다.
|
||||
* **builtin\_profile\_deactivate (#20)**: (macOS < 11) 명명된 프로파일을 비활성화합니다 (예: `pe_i_can_has_debugger`).
|
||||
* **check\_bulk (#21)**: 단일 호출에서 여러 `sandbox_check` 작업을 수행합니다.
|
||||
* **reference\_retain\_by\_audit\_token (#28)**: 샌드박스 검사에 사용할 감사 토큰에 대한 참조를 생성합니다.
|
||||
* **reference\_release (#29)**: 이전에 유지된 감사 토큰 참조를 해제합니다.
|
||||
* **rootless\_allows\_task\_for\_pid (#30)**: `task_for_pid`가 허용되는지 확인합니다 (유사한 `csr` 검사).
|
||||
* **rootless\_whitelist\_push (#31)**: (macOS) 시스템 무결성 보호(SIP) 매니페스트 파일을 적용합니다.
|
||||
* **rootless\_whitelist\_check (preflight) (#32)**: 실행 전에 SIP 매니페스트 파일을 검사합니다.
|
||||
* **rootless\_protected\_volume (#33)**: (macOS) 디스크 또는 파티션에 SIP 보호를 적용합니다.
|
||||
* **rootless\_mkdir\_protected (#34)**: 디렉토리 생성 프로세스에 SIP/DataVault 보호를 적용합니다.
|
||||
|
||||
## Sandbox.kext
|
||||
|
||||
iOS에서는 커널 확장이 **모든 프로파일을 하드코딩**하여 `__TEXT.__const` 세그먼트 내에 포함되어 수정되지 않도록 합니다. 다음은 커널 확장에서 흥미로운 몇 가지 함수입니다:
|
||||
|
||||
* **`hook_policy_init`**: `mpo_policy_init`을 후킹하며 `mac_policy_register` 후에 호출됩니다. 샌드박스의 대부분 초기화를 수행합니다. SIP도 초기화합니다.
|
||||
* **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` 및 `security.mac.sandbox.debug_mode`를 등록하는 sysctl 인터페이스를 설정합니다 (PE_i_can_has_debugger로 부팅된 경우).
|
||||
* **`hook_policy_syscall`**: "Sandbox"를 첫 번째 인수로 하고 두 번째 인수로 작업을 나타내는 코드와 함께 `mac_syscall`에 의해 호출됩니다. 요청된 코드에 따라 실행할 코드를 찾기 위해 스위치를 사용합니다.
|
||||
|
||||
### MACF Hooks
|
||||
|
||||
**`Sandbox.kext`**는 MACF를 통해 백 개 이상의 후킹을 사용합니다. 대부분의 후킹은 작업을 수행할 수 있는 사소한 경우를 확인하며, 그렇지 않은 경우 **`cred_sb_evalutate`**를 호출하여 MACF의 **자격 증명**과 수행할 **작업**에 해당하는 숫자 및 출력용 **버퍼**를 전달합니다.
|
||||
|
||||
그 좋은 예는 **`_mpo_file_check_mmap`** 함수로, **`mmap`**을 후킹하며 새로운 메모리가 쓰기 가능할지 확인한 후 (그렇지 않으면 실행을 허용하지 않음), dyld 공유 캐시에서 사용되는지 확인하고, 그렇다면 실행을 허용하며, 마지막으로 **`cred_sb_evalutate`**를 호출하여 추가 허용 검사를 수행합니다.
|
||||
|
||||
게다가, 샌드박스가 사용하는 수백 개의 후킹 중에서 특히 흥미로운 세 가지가 있습니다:
|
||||
|
||||
* `mpo_proc_check_for`: 필요할 경우 프로파일을 적용하며, 이전에 적용되지 않은 경우에만 적용합니다.
|
||||
* `mpo_vnode_check_exec`: 프로세스가 관련 이진 파일을 로드할 때 호출되며, 프로파일 검사가 수행되고 SUID/SGID 실행을 금지하는 검사도 수행됩니다.
|
||||
* `mpo_cred_label_update_execve`: 레이블이 할당될 때 호출됩니다. 이 함수는 이진 파일이 완전히 로드되었지만 아직 실행되지 않았을 때 호출되므로 가장 긴 함수입니다. 샌드박스 객체를 생성하고, kauth 자격 증명에 샌드박스 구조체를 첨부하고, mach 포트에 대한 액세스를 제거하는 등의 작업을 수행합니다.
|
||||
|
||||
**`cred_sb_evalutate`**는 **`sb_evaluate`**의 래퍼이며, 이 함수는 전달된 자격 증명을 가져온 후 **`eval`** 함수를 사용하여 평가를 수행합니다. 이 함수는 일반적으로 모든 프로세스에 기본적으로 적용되는 **플랫폼 프로파일**을 평가한 다음 **특정 프로세스 프로파일**을 평가합니다. 플랫폼 프로파일은 macOS의 **SIP**의 주요 구성 요소 중 하나입니다.
|
||||
|
||||
## Sandboxd
|
||||
|
||||
샌드박스는 XPC Mach 서비스 `com.apple.sandboxd`를 노출하는 사용자 데몬도 실행하며, 커널 확장이 통신하는 데 사용하는 특별한 포트 14 (`HOST_SEATBELT_PORT`)에 바인딩됩니다. MIG를 사용하여 일부 기능을 노출합니다.
|
||||
|
||||
## References
|
||||
|
||||
* [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# macOS SIP
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,7 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
macOS의 **시스템 무결성 보호(SIP)**는 가장 특권이 있는 사용자조차도 주요 시스템 폴더에 대한 무단 변경을 방지하기 위해 설계된 메커니즘입니다. 이 기능은 보호된 영역에서 파일을 추가, 수정 또는 삭제하는 등의 작업을 제한함으로써 시스템의 무결성을 유지하는 데 중요한 역할을 합니다. SIP에 의해 보호되는 주요 폴더는 다음과 같습니다:
|
||||
|
@ -36,7 +35,7 @@ SIP의 동작을 규정하는 규칙은 **`/System/Library/Sandbox/rootless.conf
|
|||
```
|
||||
이 스니펫은 SIP가 일반적으로 **`/usr`** 디렉토리를 보호하지만, 특정 하위 디렉토리(`/usr/libexec/cups`, `/usr/local`, `/usr/share/man`)에서는 수정이 허용된다는 것을 나타냅니다. 이는 경로 앞에 있는 별표(\*)로 표시됩니다.
|
||||
|
||||
디렉토리나 파일이 SIP에 의해 보호되는지 확인하려면 **`ls -lOd`** 명령을 사용하여 **`restricted`** 또는 **`sunlnk`** 플래그의 존재를 확인할 수 있습니다. 예:
|
||||
디렉토리나 파일이 SIP에 의해 보호되는지 확인하려면 **`ls -lOd`** 명령을 사용하여 **`restricted`** 또는 **`sunlnk`** 플래그의 존재를 확인할 수 있습니다. 예를 들어:
|
||||
```bash
|
||||
ls -lOd /usr/libexec/cups
|
||||
drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups
|
||||
|
@ -48,18 +47,22 @@ drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /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로 보호된 디렉토리에서는 파일을 생성, 수정 또는 삭제할 수 없습니다.
|
||||
여기서 **`restricted`** 플래그는 `/usr/libexec` 디렉토리가 SIP에 의해 보호되고 있음을 나타냅니다. SIP로 보호되는 디렉토리에서는 파일을 생성, 수정 또는 삭제할 수 없습니다.
|
||||
|
||||
또한, 파일에 **`com.apple.rootless`** 확장 **속성**이 포함되어 있으면 해당 파일도 **SIP에 의해 보호**됩니다.
|
||||
|
||||
**SIP는 다른 루트 작업도 제한합니다**:
|
||||
{% hint style="success" %}
|
||||
**Sandbox** 훅 **`hook_vnode_check_setextattr`**는 확장 속성 **`com.apple.rootless`**를 수정하려는 모든 시도를 방지합니다.
|
||||
{% endhint %}
|
||||
|
||||
**SIP는 다음과 같은 다른 루트 작업도 제한합니다**:
|
||||
|
||||
* 신뢰할 수 없는 커널 확장 로드
|
||||
* Apple 서명 프로세스에 대한 작업 포트 가져오기
|
||||
* NVRAM 변수 수정
|
||||
* 커널 디버깅 허용
|
||||
|
||||
옵션은 비트 플래그로 nvram 변수에 유지됩니다 (`csr-active-config`는 Intel에서, `lp-sip0`는 ARM의 부팅된 Device Tree에서 읽습니다). 플래그는 `csr.sh`의 XNU 소스 코드에서 찾을 수 있습니다:
|
||||
옵션은 비트 플래그로 nvram 변수에 유지되며(`csr-active-config`는 Intel에서, `lp-sip0`는 ARM의 부팅된 Device Tree에서 읽음). 플래그는 `csr.sh`의 XNU 소스 코드에서 찾을 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1192).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -79,28 +82,42 @@ csrutil enable --without debug
|
|||
```
|
||||
### Other Restrictions
|
||||
|
||||
* **서명되지 않은 커널 확장(kexts)의 로딩을 허용하지 않음**은 검증된 확장만이 시스템 커널과 상호작용하도록 보장합니다.
|
||||
* **서명되지 않은 커널 확장(kexts)의 로딩을 금지**하여 검증된 확장만 시스템 커널과 상호작용하도록 보장합니다.
|
||||
* **macOS 시스템 프로세스의 디버깅을 방지**하여 핵심 시스템 구성 요소를 무단 접근 및 수정으로부터 보호합니다.
|
||||
* **dtrace와 같은 도구의 시스템 프로세스 검사 방지**는 시스템 운영의 무결성을 더욱 보호합니다.
|
||||
* **dtrace와 같은 도구의 시스템 프로세스 검사 방지**로 시스템 운영의 무결성을 추가로 보호합니다.
|
||||
|
||||
[**이 발표에서 SIP 정보에 대해 더 알아보세요**](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)**.**
|
||||
|
||||
## SIP Bypasses
|
||||
### **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)를 변조할 가능성도 포함됩니다.
|
||||
* **TCC 우회**: TCC(투명성, 동의 및 제어) 데이터베이스를 직접 조작하여 웹캠, 마이크 및 기타 리소스에 대한 무단 접근을 부여합니다.
|
||||
* **지속성 설정**: SIP로 보호된 위치에 악성 코드를 배치하여 루트 권한으로도 제거에 저항하도록 만듭니다. 여기에는 악성 코드 제거 도구(MRT)를 변조할 가능성도 포함됩니다.
|
||||
* **커널 확장 로드**: 추가적인 보호 장치가 있지만, SIP를 우회하면 서명되지 않은 커널 확장을 로드하는 과정이 간소화됩니다.
|
||||
|
||||
### Installer Packages
|
||||
### 설치 패키지
|
||||
|
||||
**Apple의 인증서로 서명된 설치 패키지**는 그 보호를 우회할 수 있습니다. 이는 표준 개발자가 서명한 패키지조차도 SIP로 보호된 디렉토리를 수정하려고 시도하면 차단된다는 것을 의미합니다.
|
||||
|
||||
### Inexistent SIP file
|
||||
### 존재하지 않는 SIP 파일
|
||||
|
||||
하나의 잠재적 허점은 **`rootless.conf`에 지정된 파일이 현재 존재하지 않는 경우** 생성할 수 있다는 것입니다. 악성 코드는 이를 악용하여 **시스템에서 지속성을 설정**할 수 있습니다. 예를 들어, 악성 프로그램이 `rootless.conf`에 나열되어 있지만 존재하지 않는 경우 `/System/Library/LaunchDaemons`에 .plist 파일을 생성할 수 있습니다.
|
||||
하나의 잠재적 허점은 **`rootless.conf`에 파일이 지정되었지만 현재 존재하지 않는 경우**, 생성될 수 있다는 것입니다. 악성 코드는 이를 악용하여 **시스템에서 지속성을 설정**할 수 있습니다. 예를 들어, 악성 프로그램이 `rootless.conf`에 나열되어 있지만 존재하지 않는 경우 `/System/Library/LaunchDaemons`에 .plist 파일을 생성할 수 있습니다.
|
||||
|
||||
### com.apple.rootless.install.heritable
|
||||
|
||||
|
@ -110,7 +127,7 @@ SIP를 우회하면 공격자가 다음을 수행할 수 있습니다:
|
|||
|
||||
#### [CVE-2019-8561](https://objective-see.org/blog/blog\_0x42.html) <a href="#cve" id="cve"></a>
|
||||
|
||||
시스템이 코드 서명을 확인한 후 **설치 패키지를 교환**할 수 있다는 것이 발견되었습니다. 그 후 시스템은 원본 대신 악성 패키지를 설치하게 됩니다. 이러한 작업이 **`system_installd`**에 의해 수행되므로 SIP를 우회할 수 있게 됩니다.
|
||||
시스템이 코드 서명을 검증한 후 **설치 패키지를 교환**할 수 있다는 것이 발견되었습니다. 그 후 시스템은 원본 대신 악성 패키지를 설치하게 됩니다. 이러한 작업이 **`system_installd`**에 의해 수행되었기 때문에 SIP를 우회할 수 있게 됩니다.
|
||||
|
||||
#### [CVE-2020–9854](https://objective-see.org/blog/blog\_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a>
|
||||
|
||||
|
@ -118,21 +135,21 @@ SIP를 우회하면 공격자가 다음을 수행할 수 있습니다:
|
|||
|
||||
#### CVE-2021-30892 - Shrootless
|
||||
|
||||
[**이 블로그 게시물의 연구자들**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/)은 macOS의 시스템 무결성 보호(SIP) 메커니즘에서 'Shrootless' 취약점을 발견했습니다. 이 취약점은 **`system_installd`** 데몬을 중심으로 하며, 이 데몬은 자식 프로세스가 SIP의 파일 시스템 제한을 우회할 수 있도록 해주는 권한 **`com.apple.rootless.install.heritable`**를 가지고 있습니다.
|
||||
[**이 블로그 게시물의 연구자들**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/)은 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`를 호출할 때** 임의의 작업을 수행할 수 있습니다.
|
||||
연구자들은 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` 파일이 트리거되어 루트로 상승하게 됩니다.
|
||||
게다가 **`/etc/zshenv`**는 SIP 우회뿐만 아니라 일반적인 공격 기법으로도 사용될 수 있다는 것이 발견되었습니다. 각 사용자 프로필에는 `~/.zshenv` 파일이 있으며, 이는 `/etc/zshenv`와 동일하게 동작하지만 루트 권한이 필요하지 않습니다. 이 파일은 지속성 메커니즘으로 사용될 수 있으며, `zsh`가 시작될 때마다 트리거되거나 권한 상승 메커니즘으로 사용될 수 있습니다. 관리 사용자가 `sudo -s` 또는 `sudo <command>`를 사용하여 루트로 상승하면 `~/.zshenv` 파일이 트리거되어 효과적으로 루트로 상승하게 됩니다.
|
||||
|
||||
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
|
||||
|
||||
[**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)에서는 동일한 **`system_installd`** 프로세스가 여전히 악용될 수 있다는 것이 발견되었습니다. 이는 **`/tmp`** 내의 SIP로 보호된 임의의 이름의 폴더에 **post-install 스크립트**를 넣고 있었기 때문입니다. 문제는 **`/tmp` 자체는 SIP로 보호되지 않기 때문에**, **가상 이미지를 마운트**한 후 **설치 프로그램**이 그곳에 **post-install 스크립트**를 넣고, **가상 이미지를 언마운트**한 다음, 모든 **폴더를 재생성**하고 **payload**를 실행할 **post installation** 스크립트를 추가할 수 있었다는 것입니다.
|
||||
[**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)에서 동일한 **`system_installd`** 프로세스가 여전히 악용될 수 있다는 것이 발견되었습니다. 이는 **`/tmp`** 내의 SIP로 보호된 임의의 이름의 폴더에 **post-install 스크립트**를 넣기 때문입니다. 문제는 **`/tmp`** 자체는 SIP로 보호되지 않기 때문에 **가상 이미지를 마운트**한 후, **설치 프로그램**이 그곳에 **post-install 스크립트**를 넣고, **가상 이미지를 언마운트**한 다음, 모든 **폴더를 재생성**하고 **페이로드**를 실행할 **post installation** 스크립트를 추가할 수 있었다는 것입니다.
|
||||
|
||||
#### [fsck\_cs utility](https://www.theregister.com/2016/03/30/apple\_os\_x\_rootless/)
|
||||
#### [fsck\_cs 유틸리티](https://www.theregister.com/2016/03/30/apple\_os\_x\_rootless/)
|
||||
|
||||
**`fsck_cs`**가 **심볼릭 링크**를 따라가는 능력으로 인해 중요한 파일을 손상시키는 취약점이 확인되었습니다. 구체적으로, 공격자는 _`/dev/diskX`_에서 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` 파일로의 링크를 만들었습니다. _`/dev/diskX`_에서 **`fsck_cs`**를 실행하면 `Info.plist`가 손상되었습니다. 이 파일의 무결성은 운영 체제의 SIP(시스템 무결성 보호)에 필수적이며, 이는 커널 확장의 로딩을 제어합니다. 손상되면 SIP의 커널 제외 관리 능력이 손상됩니다.
|
||||
**`fsck_cs`**가 **심볼릭 링크**를 따라가는 능력으로 인해 중요한 파일을 손상시키는 취약점이 확인되었습니다. 구체적으로, 공격자들은 _`/dev/diskX`_에서 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` 파일로의 링크를 조작했습니다. _`/dev/diskX`_에서 **`fsck_cs`**를 실행하면 `Info.plist`가 손상되었습니다. 이 파일의 무결성은 운영 체제의 SIP(시스템 무결성 보호)에 필수적이며, 이는 커널 확장의 로딩을 제어합니다. 손상되면 SIP의 커널 제외 관리 능력이 손상됩니다.
|
||||
|
||||
이 취약점을 악용하기 위한 명령은:
|
||||
```bash
|
||||
|
@ -154,11 +171,11 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
|||
```
|
||||
#### [업그레이더 우회 (2016)](https://objective-see.org/blog/blog\_0x14.html)
|
||||
|
||||
시스템은 `Install macOS Sierra.app` 내의 임베디드 설치 프로그램 디스크 이미지를 사용하여 OS를 업그레이드하기 위해 부팅하도록 설정되어 있으며, `bless` 유틸리티를 활용합니다. 사용된 명령은 다음과 같습니다:
|
||||
시스템은 OS를 업그레이드하기 위해 `Install macOS Sierra.app` 내의 내장 설치 프로그램 디스크 이미지에서 부팅하도록 설정되어 있으며, `bless` 유틸리티를 사용합니다. 사용된 명령은 다음과 같습니다:
|
||||
```bash
|
||||
/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`)를 변경하면 손상될 수 있습니다. 이 전략은 악성 버전(`libBaseIA.dylib`)으로 동적 로더(dyld)를 대체하는 것을 포함합니다. 이 교체는 설치 프로그램이 시작될 때 공격자의 코드가 실행되도록 합니다.
|
||||
이 프로세스의 보안은 공격자가 부팅 전에 업그레이드 이미지(`InstallESD.dmg`)를 변경하면 손상될 수 있습니다. 이 전략은 동적 로더(dyld)를 악성 버전(`libBaseIA.dylib`)으로 대체하는 것을 포함합니다. 이 교체는 설치 프로그램이 시작될 때 공격자의 코드가 실행되도록 합니다.
|
||||
|
||||
공격자의 코드는 업그레이드 과정에서 제어를 얻고, 설치 프로그램에 대한 시스템의 신뢰를 악용합니다. 공격은 `extractBootBits` 메서드를 특히 겨냥하여 메서드 스위즐링을 통해 `InstallESD.dmg` 이미지를 변경함으로써 진행됩니다. 이를 통해 디스크 이미지가 사용되기 전에 악성 코드를 주입할 수 있습니다.
|
||||
|
||||
|
@ -184,7 +201,7 @@ and it was possible to crate a symlink in `${SHARED_SUPPORT_PATH}/SharedSupport.
|
|||
|
||||
권한 `com.apple.rootless.install`은 macOS에서 시스템 무결성 보호(SIP)를 우회할 수 있는 것으로 알려져 있습니다. 이는 [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/)와 관련하여 특히 언급되었습니다.
|
||||
|
||||
이 특정 경우에 `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc`에 위치한 시스템 XPC 서비스가 이 권한을 가지고 있습니다. 이는 관련 프로세스가 SIP 제약을 우회할 수 있게 해줍니다. 또한, 이 서비스는 보안 조치를 시행하지 않고 파일을 이동할 수 있는 방법을 제공합니다.
|
||||
이 특정 경우에, `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc`에 위치한 시스템 XPC 서비스는 이 권한을 가지고 있습니다. 이는 관련 프로세스가 SIP 제약을 우회할 수 있게 해줍니다. 또한, 이 서비스는 보안 조치를 시행하지 않고 파일을 이동할 수 있는 방법을 제공합니다.
|
||||
|
||||
## Sealed System Snapshots
|
||||
|
||||
|
@ -194,13 +211,13 @@ Sealed System Snapshots는 **macOS Big Sur (macOS 11)**에서 Apple이 도입한
|
|||
|
||||
1. **불변 시스템**: Sealed System Snapshots는 macOS 시스템 볼륨을 "불변"으로 만들어 수정할 수 없게 합니다. 이는 보안이나 시스템 안정성을 위협할 수 있는 무단 또는 우발적인 변경을 방지합니다.
|
||||
2. **시스템 소프트웨어 업데이트**: macOS 업데이트나 업그레이드를 설치할 때, macOS는 새로운 시스템 스냅샷을 생성합니다. 그런 다음 macOS 시작 볼륨은 **APFS (Apple File System)**를 사용하여 이 새로운 스냅샷으로 전환합니다. 업데이트 적용 과정이 더 안전하고 신뢰할 수 있게 되며, 업데이트 중 문제가 발생할 경우 시스템이 항상 이전 스냅샷으로 되돌릴 수 있습니다.
|
||||
3. **데이터 분리**: macOS Catalina에서 도입된 데이터와 시스템 볼륨 분리 개념과 함께, Sealed System Snapshot 기능은 모든 데이터와 설정이 별도의 "**Data**" 볼륨에 저장되도록 보장합니다. 이 분리는 데이터를 시스템과 독립적으로 만들어 시스템 업데이트 과정을 단순화하고 시스템 보안을 강화합니다.
|
||||
3. **데이터 분리**: macOS Catalina에서 도입된 데이터와 시스템 볼륨 분리 개념과 함께, Sealed System Snapshot 기능은 모든 데이터와 설정이 별도의 "**데이터**" 볼륨에 저장되도록 보장합니다. 이 분리는 데이터를 시스템과 독립적으로 만들어 시스템 업데이트 과정을 단순화하고 시스템 보안을 강화합니다.
|
||||
|
||||
이 스냅샷은 macOS에 의해 자동으로 관리되며, APFS의 공간 공유 기능 덕분에 디스크에 추가 공간을 차지하지 않습니다. 또한, 이 스냅샷은 전체 시스템의 사용자 접근 가능한 백업인 **Time Machine 스냅샷**과는 다르다는 점도 중요합니다.
|
||||
이 스냅샷은 macOS에 의해 자동으로 관리되며, APFS의 공간 공유 기능 덕분에 디스크에 추가 공간을 차지하지 않습니다. 또한, 이 스냅샷은 전체 시스템의 사용자 접근 가능한 백업인 **타임 머신 스냅샷**과는 다르다는 점도 중요합니다.
|
||||
|
||||
### Check Snapshots
|
||||
|
||||
명령어 **`diskutil apfs list`**는 **APFS 볼륨의 세부 정보**와 레이아웃을 나열합니다:
|
||||
명령어 **`diskutil apfs list`**는 **APFS 볼륨**의 **세부 사항**과 레이아웃을 나열합니다:
|
||||
|
||||
<pre><code>+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13
|
||||
| ====================================================
|
||||
|
@ -239,7 +256,7 @@ Sealed System Snapshots는 **macOS Big Sur (macOS 11)**에서 Apple이 도입한
|
|||
| FileVault: Yes (Unlocked)
|
||||
</code></pre>
|
||||
|
||||
이전 출력에서 **사용자 접근 가능한 위치**가 `/System/Volumes/Data` 아래에 마운트된 것을 볼 수 있습니다.
|
||||
이전 출력에서 **사용자 접근 가능한 위치**가 `/System/Volumes/Data` 아래에 마운트되어 있는 것을 볼 수 있습니다.
|
||||
|
||||
또한, **macOS 시스템 볼륨 스냅샷**은 `/`에 마운트되어 있으며 **봉인**되어 있습니다(운영 체제에 의해 암호화 서명됨). 따라서 SIP가 우회되어 수정되면 **운영 체제가 더 이상 부팅되지 않습니다**.
|
||||
|
||||
|
@ -254,17 +271,16 @@ mount
|
|||
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포에 PR을 제출하여 해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue