-
-
[原创]SandboxiePlus的加密沙盒明文信息窃取方法
-
-
[原创]SandboxiePlus的加密沙盒明文信息窃取方法
SandboxiePlus的加密沙盒明文信息窃取方法
前几天看SandboxiePlus项目的时候发现它的最新漏洞是CVE-2025-54422,关于加密沙盒的密码泄露。非常简单的一个漏洞,就拿到了一个CVE编号。于是,我也研究了一下这个加密沙盒的一些机制。发现也有其他方法可以获取其中的明文信息,给大家分享一下。
CVE-2025-54422
加密沙盒是SandboxiePlus提供的一种沙盒服务,在沙盒创建的时候可以设置密码和加密方式,且密码丢失的话,无法找回,其中的数据自然也就无法解密。而且加密沙盒启动之后,默认主机无法访问加密沙盒挂载的目录,访问沙盒中的进程信息也会被拒绝。


这是沙盒中的两重安全防护,试想如果你可以访问挂在目录,其实也可以访问加密沙盒的明文信息,访问沙盒中的进程内存也可以拿到进程写入加密沙盒中的明文。
加密沙盒的运行原理是借助了imdisk虚拟磁盘的能力,在写入或读取虚拟磁盘内容的时候,将读取的内容转发给SandboxiePlus的加解密进程imbox。写操作,imbox加密之后写入虚拟磁盘中;读操作,imbox解密之后传递给外部的程序。
根据CVE-2025-54422的描述,用户在修改加密沙盒密码时,密码是以明文参数被传递给底层的imbox模块的,任何一个进程信息查看工具均可以获取这个明文密码。

我使用的是procmon,本地复现的结果如下:

这个漏洞产生的代码是在"SandboxiePlus\SandMan\Windows\OptionsGeneral.cpp"的OnSetPassword函数中,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | void COptionsWindow::OnSetPassword()
{
auto pBoxEx = m_pBox.objectCast<CSandBoxPlus>();
bool bNew = !QFile::exists(pBoxEx->GetBoxImagePath());
CBoxImageWindow window(bNew ? CBoxImageWindow::eNew : CBoxImageWindow::eChange, this);
if (bNew) window.SetImageSize(m_ImageSize);
if (theGUI->SafeExec(&window) == 1) {
m_Password = window.GetPassword();
if (bNew) {
m_ImageSize = window.GetImageSize();
OnGeneralChanged();
}
else {
QStringList Arguments;
Arguments.append("type=image");
Arguments.append("image=" + pBoxEx->GetBoxImagePath());
Arguments.append("key=" + m_Password);
Arguments.append("new_key=" + window.GetNewPassword());
if (RunImBox(Arguments))
QMessageBox::information(this, "Sandboxie-Plus", tr("Image Password Changed"));
}
}
}
|
可以很明显地看到,新旧密码是通过明文传递的。这个漏洞已经在最新的1.6.2版本中进行了修复。
明文信息窃取方法
第一种
在使用SandboxiePlus的过程中,我发现SandMan.exe进程是可以查看任意一个正在运行加密沙盒的文件的,且目录结构就是真实存储的结构。具体操作:右键一个加密沙盒->沙盒内容->浏览文件,即可看到沙盒中的明文信息,如下:

我又以普通进程启动process hacker发现可以查看和修改SandMan.exe进程的内存,这其实就有一个可以利用的点。
我可以向该进程中注入远程线程,这个远程线程遍历SandboxiePlus沙盒文件目录下面的内容,沙盒文件目录一般是C:\Sandbox\用户名。加密沙盒会有一个xxx.box文件,如果存在这个文件,且对应的目录也存在,表示这个加密沙盒正在被使用,那么可以遍历这个目录中的子目录和文件,将其中的信息拷贝到其他目录中。这样就实现了加密沙盒明文窃取的效果。该方法需要加密沙盒正在使用,不像CVE-2025-54422漏洞那样可以直接抓取加密沙盒的密码。
第二种
上文提到使用ProcessHacker工具查看加密沙盒中进程的内存时,出现了被拒绝的情况。这是因为驱动中使用了ObRegisterCallbacks函数注册了Obj_PreOperationCallback对象回调函数,在线程或进程对象打开或复制的时候被调用。Obj_PreOperationCallback会调用Thread_CheckObject_CommonEx函数来检查是否可以执行线程或进程对象打开或复制操作。其中有部分代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | _FX ACCESS_MASK Thread_CheckObject_CommonEx(
HANDLE pid, PEPROCESS ProcessObject,
ACCESS_MASK DesiredAccess, BOOLEAN EntireProcess,
BOOLEAN ExplicitAccess)
{
......
if (protect_process ) {
if ((_wcsicmp(nptr, SBIESVC_EXE) == 0)
|| Util_IsSystemProcess(cur_pid, "csrss.exe")
|| Util_IsSystemProcess(cur_pid, "lsass.exe")
|| Util_IsProtectedProcess(cur_pid)
|| (_wcsicmp(nptr, L"conhost.exe") == 0)
|| (_wcsicmp(nptr, L"taskmgr.exe") == 0) || (_wcsicmp(nptr, L"sandman.exe") == 0))
protect_process = FALSE;
}
......
}
|
这部分代码仅check了进程名,进程名在白名单{sbiesvc.exe, csrss.exe, lsass.exe, conhost.exe, taskmgr.exe, sandman.exe},就会被允许。那么如果我修改processhacker.exe为白名单中的进程名,就可打开加密沙盒中的进程。

后续的方法就像方法一一样,但只能遍历当前加密沙盒的文件目录,拷贝文件。因为SandboxiePlus沙盒之间也做了隔离,不可能让A加密沙盒中的进程可以访问B加密沙盒中的文件。由于注入的线程在沙盒中,遍历目录是遍历的整个系统的目录,如果你只想遍历沙盒目录下的内容,会被重定向新的路径,且向沙盒外部传输文件需要通过网络才能突破沙盒隔离。相比于方法一,方法二较为繁琐且效果不理想。
总结
本篇文章首先介绍了CVE-2025-54422漏洞的成因以及复现的效果,给出了两种可以获取加密沙盒密文信息的攻击手段。我已经向SandboxiePlus的官方邮箱进行了说明,

新版的1.16.4中进行了防护,但如果攻击者具备管理员权限,方法依旧有效。

官方为了表示感谢,给我发了一个开发者码,可以在不限机器不限时间使用SandboxiePlus的高级功能。大家也可以尝试给官方提相关的问题,应该也可以拿到开发者码。

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!