mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-25 04:23:33 +00:00
102 lines
6.6 KiB
Markdown
102 lines
6.6 KiB
Markdown
# macOS XPC连接进程检查
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
|
||
|
||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||
|
||
</details>
|
||
|
||
## XPC连接进程检查
|
||
|
||
当与XPC服务建立连接时,服务器将检查连接是否被允许。通常会执行以下检查:
|
||
|
||
1. 检查连接的**进程是否使用Apple签名的**证书(仅由Apple提供)。
|
||
* 如果**未经验证**,攻击者可以创建一个**伪造的证书**以匹配其他任何检查。
|
||
2. 检查连接的进程是否使用**组织的证书**进行签名(团队ID验证)。
|
||
* 如果**未经验证**,可以使用Apple的**任何开发者证书**进行签名并连接到服务。
|
||
3. 检查连接的进程是否包含**正确的Bundle ID**。
|
||
4. 检查连接的进程是否具有**正确的软件版本号**。
|
||
* 如果**未经验证**,即使其他检查已经通过,仍然可以使用旧的、存在进程注入漏洞的客户端连接到XPC服务。
|
||
5. 检查连接的进程是否具有允许其连接到服务的**授权**。这适用于Apple二进制文件。
|
||
6. **验证**必须基于连接的**客户端的审计令牌**而不是其进程ID(PID),因为前者可以防止PID重用攻击。
|
||
* 开发人员很少使用审计令牌API调用,因为它是**私有的**,所以Apple可以随时**更改**。此外,Mac App Store应用程序不允许使用私有API。
|
||
|
||
有关PID重用攻击检查的更多信息,请参见:
|
||
|
||
{% content-ref url="macos-pid-reuse.md" %}
|
||
[macos-pid-reuse.md](macos-pid-reuse.md)
|
||
{% endcontent-ref %}
|
||
|
||
### Trustcache - 防止降级攻击
|
||
|
||
Trustcache是一种在Apple Silicon机器上引入的防御方法,它存储了Apple二进制文件的CDHSAH数据库,因此只有允许的非修改二进制文件才能执行。这可以防止执行降级版本。
|
||
|
||
### 代码示例
|
||
|
||
服务器将在一个名为**`shouldAcceptNewConnection`**的函数中实现此**验证**。
|
||
|
||
{% code overflow="wrap" %}
|
||
```objectivec
|
||
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
|
||
//Check connection
|
||
return YES;
|
||
}
|
||
```
|
||
{% endcode %}
|
||
|
||
对象NSXPCConnection有一个**私有**属性**`auditToken`**(应该使用但可能会更改)和一个**公共**属性**`processIdentifier`**(不应该使用)。
|
||
|
||
可以使用以下方式验证连接的进程:
|
||
|
||
{% code overflow="wrap" %}
|
||
```objectivec
|
||
[...]
|
||
SecRequirementRef requirementRef = NULL;
|
||
NSString requirementString = @"anchor apple generic and identifier \"xyz.hacktricks.service\" and certificate leaf [subject.CN] = \"TEAMID\" and info [CFBundleShortVersionString] >= \"1.0\"";
|
||
/* Check:
|
||
- Signed by a cert signed by Apple
|
||
- Check the bundle ID
|
||
- Check the TEAMID of the signing cert
|
||
- Check the version used
|
||
*/
|
||
|
||
// Check the requirements
|
||
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
|
||
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);
|
||
```
|
||
如果开发人员不想检查客户端的版本,他至少可以检查客户端是否容易受到进程注入的攻击:
|
||
|
||
{% code overflow="wrap" %}
|
||
```objectivec
|
||
[...]
|
||
CFDictionaryRef csInfo = NULL;
|
||
SecCodeCopySigningInformation(code, kSecCSDynamicInformation, &csInfo);
|
||
uint32_t csFlags = [((__bridge NSDictionary *)csInfo)[(__bridge NSString *)kSecCodeInfoStatus] intValue];
|
||
const uint32_t cs_hard = 0x100; // don't load invalid page.
|
||
const uint32_t cs_kill = 0x200; // Kill process if page is invalid
|
||
const uint32_t cs_restrict = 0x800; // Prevent debugging
|
||
const uint32_t cs_require_lv = 0x2000; // Library Validation
|
||
const uint32_t cs_runtime = 0x10000; // hardened runtime
|
||
if ((csFlags & (cs_hard | cs_require_lv)) {
|
||
return Yes; // Accept connection
|
||
}
|
||
```
|
||
{% endcode %}
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
||
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||
|
||
</details>
|