深入探讨 MacOS 应用程序的渗透测试第二部分
字数 1904 2025-08-24 07:48:10
macOS应用程序渗透测试深度解析:文件与二进制分析
1. 代码签名分析
1.1 代码签名基础
- 定义:代码签名是macOS的安全技术,用于验证应用程序来源和完整性
- 要求:
- 必须使用Apple颁发的开发者ID证书签名
- macOS 10.15+要求所有应用程序必须经过Apple公证才能在默认Gatekeeper设置下运行
- 验证工具:
codesign -dvv "<path to application>"
1.2 签名验证要点
- 无效签名情况:
- 使用不受信任/过期证书
- 应用程序包中某些资源签名无效
- TeamIdentifier绕过:
- 某些adhoc签名的二进制文件可利用"not set"的TeamIdentifier值伪装为Apple签名
2. 强化运行时(Hardened Runtime)
2.1 基本概念
- 作用:防止代码注入、DLL劫持和进程内存空间篡改
- 检查方法:通过
SecCodeSignatureFlags查看保护级别
2.2 标志位解析
| 标志值 | 含义 |
|---|---|
| 0x0001 | 可能托管客户代码 |
| 0x0002 | adhoc签名 |
| 0x0100 | 启动时设置HARD模式 |
| 0x0200 | 启动时设置KILL模式 |
| 0x0400 | 强制证书过期检查 |
| 0x0800 | 限制dyld加载 |
| 0x1000 | 强制执行代码签名 |
| 0x2000 | 需要库验证 |
| 0x10000 | 应用运行时强化策略 |
| 0x20000 | 链接器自动生成的签名 |
3. 授权(Entitlements)分析
3.1 授权检查方法
# 使用codesign
codesign -d --entitlements :- <path to binary file>
# 使用jtool2
jtool2 –ent ~/dummy.app/Contents/MacOS/dummy
3.2 关键授权及其风险
| 授权 | 风险 |
|---|---|
| com.apple.security.cs.disable-library-validation | 可加载任意插件/框架 |
| com.apple.security.cs.allow-dyld-environment-variables | 易受Dylib注入攻击 |
| com.apple.security.get-task-allow | 允许非沙盒进程附加 |
| com.apple.security.cs.allow-unsigned-executable-memory | 暴露内存不安全漏洞 |
| com.apple.security.files.downloads.read-write | 对Downloads文件夹读写权限 |
| com.apple.security.device.camera | 访问摄像头(触发TCC提示) |
4. 静态分析技术
4.1 库依赖分析
otool -L <path to binary file>
- 检查点:易受攻击或过时的第三方库
4.2 符号分析
nm <path to binary file>
- 用途:
- 识别易受攻击函数
- 判断开发语言(Objective-C/Swift等)
4.3 敏感信息搜索
关键文件位置:
- 配置文件(.plist, XML, JSON) - 应用程序包内
- 日志文件 - ~/Library/Log
- 缓存文件(SQLite数据库) - ~/Library/Caches
查看打开文件:
- 通过Activity Monitor → 选择应用 → "Open Files and Ports"选项卡
4.4 字符串提取
strings <path to binary file>
5. 逆向工程工具
- Ghidra
- Hopper Disassembler
- IDA Pro
功能:
- 反汇编
- 反编译(生成C代码)
- 查找逻辑漏洞和内存安全问题
6. 动态分析技术
6.1 常用工具
- Apple Instruments - 性能监控、内存泄漏检测、文件系统活动跟踪
- TaskExplorer - 运行任务信息(签名状态、动态库、打开文件)
- FileMonitor - 文件事件监控
- ProcessMonitor - 进程创建/终止监控
- Frida - 动态检测工具
6.2 Frida使用详解
安装:
pip3 install frida-tools
示例脚本:
Interceptor.attach(Module.findExportByName(null, "open"), {
onEnter: function(args) {
console.log("File path: " + Memory.readUtf8String(args[0]));
console.log("Mode: " + args[1].toInt32());
}
});
注入脚本:
frida -l <script.js> -n "App Name"
7. 内存分析
7.1 基本流程
-
查找进程PID:
ps aux | grep -i "app name" -
使用lldb附加进程:
lldb --attach-pid <PID>
7.2 分析要点
- 查找敏感数据(密码、加密密钥等)
- 检查内存中的临时存储信息
- 识别内存泄露问题
8. 安全防护建议
-
代码签名:
- 确保使用有效开发者ID证书
- 所有资源正确签名
-
运行时保护:
- 启用Hardened Runtime
- 谨慎使用运行时异常
-
授权管理:
- 遵循最小权限原则
- 移除不必要的授权
-
依赖管理:
- 定期更新第三方库
- 移除未使用的依赖
-
敏感信息保护:
- 避免硬编码敏感数据
- 安全处理日志和缓存