Sandboxie-Plus注入沙箱逃逸CVE-2026-45313
Sandboxie-Plus是Windows平台开源轻量沙箱隔离工具,是经典Sandboxie的现代化增强版本,基础功能永久免费,高级版需要付费。
一、基本情况
Sandboxie-Plus依靠驱动级拦截技术创建独立隔离环境,支持软件多开、测试不明安装包、隔离浏览器防恶意程序,已适配Win10/11。
Sandboxie-Plus比虚拟机占用资源更低、启动更快,自带快照、多沙箱隔离、网络权限管控、隐私防护等功能,提供便携免安装版本。

Sandboxie-Plus开源沙箱可隔离运行软件产生的文件、注册表修改仅存于沙箱,不会污染真实系统,关闭沙箱即可一键清空所有改动。
栋科技漏洞库关注到Sandboxie-Plus存在一个任意APC注入沙箱逃逸漏洞,该漏洞现已被追踪为CVE-2026-45313,CVSS 3.X评分7.7。
二、漏洞分析
CVE-2026-45313是Sandboxie-Plus的GuiServer服务中存在的无限制APC注入漏洞,影响Sandboxie-Plus 1.17.6之前的Windows 版本。
由于GuiServer服务在沙箱进程提交未校验的线程句柄和函数指针并触发窗口钩子通知时,以 SYSTEM 身份向任意宿主线程排入 APC。
沙盒内任意进程可在宿主机所有未沙盒进程中执行任意代码,导致沙箱逃逸和宿主进程任意代码执行。
该服务以系统最高权限SYSTEM运行,对沙盒调用方传入的目标线程ID、函数指针均不做校验。
由于Sandboxie-Plus在 Sandboxie/core/svc/GuiServer.cpp 的 GuiServer::WndHookRegisterSlave 中
直接保存 GUI_WND_HOOK_REGISTER 请求中的 hthread 和 hproc,
未验证线程属于调用沙箱进程或函数指针位于调用方地址空间;
随后 GuiServer::WndHookNotifySlave 以 SYSTEM 身份通过 OpenThread(THREAD_SET_CONTEXT, FALSE, whk->hthread) 打开攻击者指定线程,并将 whk->hproc 与 req->threadid 传给 QueueUserAPC,沙箱进程可借此在未沙箱化宿主进程中执行代码。
(一)具体分析
函数 GuiServer::WndHookRegisterSlave接收消息ID为31的GUI_WND_HOOK_REGISTER请求,直接保存请求内的线程句柄hthread、
进程函数指针hproc,未做两项合法性校验:
1、目标线程是否属于发起调用的沙盒进程;
2、传入函数指针是否处于调用进程自身地址空间内。
后续 GuiServer::WndHookNotifySlave(GuiServer.cpp 3702至3767行)执行如下危险操作:
1、通过 OpenThread(THREAD_SET_CONTEXT, FALSE, whk->hthread) 打开攻击者指定线程;
服务为SYSTEM权限,可成功打开系统内任意线程;
2、调用 QueueUserAPC((PAPCFUNC)whk->hproc, hThread, (ULONG_PTR)req->threadid),函数指针、APC入参均由攻击者控制。
消息ID为30的GUI_WND_HOOK_NOTIFY消息中threadid字段会直接作为APC回调函数的首个参数,攻击者可随意控制该入参。
通信通道为命名队列 *GUIPROXY_会话ID,沙盒内所有进程均可通过导出函数 SbieDll_CallProxySvr 访问该队列。
(二)攻击链路
1、沙盒内进程加载SbieDll.dll,获取导出函数 SbieDll_CallProxySvr;
2、向 *GUIPROXY_会话ID 队列发送31号注册消息GUI_WND_HOOK_REGISTER,携带参数:
hthread = 宿主机未沙盒进程的线程ID
hproc = kernel32.dll内WinExec/ExitProcess等任意函数地址
服务无校验直接保存上述恶意参数;
3、发送30号通知消息GUI_WND_HOOK_NOTIFY触发APC投递:
threadid = 目标进程内存中calc.exe字符串地址,作为APC回调入参;
4、SYSTEM权限服务以THREAD_SET_CONTEXT权限打开目标线程,
执行QueueUserAPC(WinExec, 目标线程句柄, calc.exe字符串地址);
5、目标线程进入可等待告警状态时,执行WinExec("calc.exe"),计算器在沙盒外真实桌面弹出,完成逃逸。
(三)根本成因
// GuiServer.cpp:3793-3800 — NO VALIDATION of hthread or hproc
if (req->hthread && req->hproc) // register
{
if (!whk) // add if not already added
{
whk = (WND_HOOK *)HeapAlloc(GetProcessHeap(), 0, sizeof(WND_HOOK));
whk->pid = args->pid;
whk->hthread = req->hthread; // attacker-controlled thread ID
whk->hproc = req->hproc; // attacker-controlled function ptr
// ...
}
}
// GuiServer.cpp:3717-3742 — opens ANY thread as SYSTEM, queues attacker's APC
HANDLE hThread = OpenThread(THREAD_SET_CONTEXT, FALSE, (DWORD)whk->hthread);
if (hThread)
{
QueueUserAPC((PAPCFUNC)whk->hproc, hThread, (ULONG_PTR)req->threadid);
CloseHandle(hThread);
}
(三)影响对象
所有启用GuiServer服务的Sandboxie、Sandboxie-Plus用户(默认配置自动开启该服务)。
沙盒内运行的任意程序(包括本应被隔离的恶意程序)均可突破沙盒限制,以目标进程所属用户身份执行任意代码;
还可借助SYSTEM级别的线程访问权限攻击高权限进程。该漏洞彻底破坏沙盒核心安全隔离能力。
(四)修复建议
在WndHookRegisterSlave函数中,保存req->hthread前增加校验逻辑,验证该线程归属于发起调用的沙盒进程(args->pid):
if (req->hthread && req->hproc) // register
{
// Validate thread ownership — reject if hthread is not in the caller's process
HANDLE hThread = OpenThread(THREAD_QUERY_LIMITED_INFORMATION, FALSE, req->hthread);
if (!hThread) {
rpl->status = STATUS_UNSUCCESSFUL;
args->rpl_len = sizeof(GUI_WND_HOOK_REGISTER_RPL);
return STATUS_SUCCESS;
}
DWORD ownerPid = GetProcessIdOfThread(hThread);
CloseHandle(hThread);
if (ownerPid != args->pid) {
rpl->status = STATUS_ACCESS_DENIED;
args->rpl_len = sizeof(GUI_WND_HOOK_REGISTER_RPL);
return STATUS_SUCCESS;
}
}
作为纵深防御手段,WndHookNotifySlave在投递APC前,还需校验已存储的线程仍归属沙盒内进程。
三、影响范围
sandboxie-plus:Sandboxie <1.17.6
四、解决建议
sandboxie-plus:Sandboxie ≥ 1.17.6
五、参考链接
管理员已设置登录后刷新可查看