☰
Cuckoo Sandbox 虚拟机快照保存指南:为 VirtualBox、KVM、VMware 与 XenServer 准备干净的沙箱镜像
2026/10/10 1:41:56 网站建设 项目流程
  • 网络安全
  • 应用安全

【免费下载链接】cuckoo

Cuckoo Sandbox is an automated dynamic malware analysis system

项目地址:https://gitcode.com/gh_mirrors/cu/cuckoo
点击查看免费下载

本篇指南对应 Cuckoo Sandbox 官方安装文档中的 "Saving the Virtual Machine" 章节,讲解在完成 Guest 虚拟机创建、网络配置与 Agent 安装 之后,如何为四种主流虚拟化平台(VirtualBox、KVM、VMware Workstation、XenServer)保存一个干净、可随时回滚的虚拟机快照状态。读完本文,你将掌握每种平台下从命令行拍摄/管理快照的完整操作、KVM 与 XenServer 两种特殊磁盘方案(QCOW2 转换、on-boot=reset)的底层原理,以及快照参数如何与 machinery 配置 和 machinery 模块源码 衔接,最终让 Cuckoo 能在每次分析前自动把分析机恢复到基准状态。

保存快照的前置条件:先让 Guest 处于"可交付"状态

在动手保存快照之前,请务必确认以下三点,缺一不可:

  • 已经完成一次"软重启"(soft reboot):确保 Guest 内部不存在未落盘的临时状态、残留进程或半初始化服务;
  • 虚拟机当前正在运行:快照记录的是运行中的整机状态(包含内存与磁盘),Cuckoo 需要的是一个"正在运行中"的基准镜像;
  • Cuckoo Agent 已在 Guest 内运行、Windows 已完全启动:Agent 是 Cuckoo Host 与 Guest 之间通信的桥梁,它会在 Guest 内启动一个小型 API 服务器供 Host 调用(详见 agent.rst)。如果快照里没有 Agent,后续分析任务将无法下发。

只有满足上述条件并按下文各平台步骤操作,虚拟机才算"准备好交给 Cuckoo 使用"。

VirtualBox:用 VBoxManage 命令行拍摄与回滚快照

VirtualBox 既可以从图形界面(GUI)拍摄快照,也可以使用命令行工具VBoxManage。命令行方式更适合批量脚本化操作,命令如下:

$ VBoxManage snapshot "<Name of VM>" take "<Name of snapshot>" --pause

--pause参数会在拍摄内存快照时暂停虚拟机,保证内存镜像与磁盘状态一致。快照创建完成后,即可关闭虚拟机电源,并把虚拟机恢复(回滚)到快照状态:

$ VBoxManage controlvm "<Name of VM>" poweroff $ VBoxManage snapshot "<Name of VM>" restorecurrent
  • controlvm ... poweroff相当于强制关机,等价于拔掉电源线;
  • restorecurrent将虚拟机恢复到"当前快照"(current snapshot),也就是刚拍摄的那一个。

Cuckoo 侧如何消费这个快照

在 virtualbox.conf 中,每个虚拟机小节都有一个可选的snapshot参数:

# (Optional) Specify the snapshot name to use. If you do not specify a snapshot # name, the VirtualBox MachineManager will use the current snapshot. # Example (Snapshot1 is the snapshot name): snapshot = Snapshot1

从源码 cuckoo/machinery/virtualbox.py 可以看到,Cuckoo 的restore()方法会根据配置决定回滚目标:

  • 配置了snapshot时执行VBoxManage snapshot <label> restore <snapshot>;
  • 未配置时执行VBoxManage snapshot <label> restorecurrent,即使用当前快照。

更关键的是,VirtualBox machinery 在_initialize_check()阶段就会对注册的所有机器逐一执行restore()(见 virtualbox.py),这意味着如果虚拟机没有快照,Cuckoo 启动时会直接报错,从而尽早暴露配置问题。每次分析任务开始前,start()方法也会先调用restore()再启动虚拟机(virtualbox.py),确保分析环境始终是干净基准。

KVM:QCOW2 磁盘格式与 virsh 快照管理

KVM 的沙箱方案与前者的关键区别在于磁盘格式:libvirt 工具默认创建 RAW 格式虚拟磁盘,而 RAW 磁盘不支持快照。因此必须改用支持快照的QCOW2或LVM。本指南以更易配置的QCOW2为例。

第一步:创建或转换 QCOW2 磁盘

最简单的方式是直接用 libvirt 套件创建 QCOW2 格式磁盘,工具二选一:

  • 命令行:virsh
  • 图形界面:virt-manager

如果手里已有 RAW 磁盘,可以原地转换:

$ cd /your/disk/image/path $ qemu-img convert -O qcow2 your_disk.raw your_disk.qcow2

第二步:编辑 VM 定义指向新磁盘

编辑虚拟机定义:

$ virsh edit "<Name of VM>"

找到磁盘(disk)段,原始 RAW 配置长这样:

<disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/your/disk/image/path/your_disk.raw'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' unit='0'/> </disk>

将driver的type改为qcow2,并把source file指向新的 qcow2 镜像:

<disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/your/disk/image/path/your_disk.qcow2'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' unit='0'/> </disk>

第三步:运行状态下拍摄快照

先用修改后的定义测试虚拟机。确认一切正常后,让虚拟机在 Cuckoo Agent 运行的状态下保持开机,然后拍摄快照,最后再关机:

$ virsh snapshot-create "<Name of VM>"

快照的常见错误与快照管理

虚拟机若存在多个快照,可能触发如下错误:

ERROR: No snapshot found for virtual machine VM-Name

这类问题的根源在于 Cuckoo 无法唯一定位应回滚的快照。快照日常管理命令如下:

$ virsh snapshot-list "VM-Name" $ virsh snapshot-delete "VM-Name" 1234567890
  • snapshot-list列出该 VM 的全部快照(第二参数为快照名称或 ID);
  • snapshot-delete删除指定快照。

Cuckoo 侧如何消费这个快照

在 kvm.conf 中,每个虚拟机同样支持可选的snapshot参数:

# (Optional) Specify the snapshot name to use. If you do not specify a snapshot # name, the KVM MachineManager will use the current snapshot. # Example (Snapshot1 is the snapshot name): snapshot = Snapshot1

KVM machinery 基于python-libvirt实现,见 cuckoo/machinery/kvm.py。它通过 kvm.conf 中的dsn字段(libvirt URI 连接串,如qemu:///system)建立连接,底层复用LibVirtMachinery抽象类(见 cuckoo/common/abstracts.py)完成快照回滚、启动与停止。值得注意的是,KVM 的_initialize_check()会校验dsn是否配置,缺失时直接抛出CuckooMachineError,这也是排障时最先要检查的点。

VMware Workstation:vmrun 命令行快照

VMware Workstation 同样支持 GUI 与命令行两种方式。命令行使用 VMware 自带的vmrun工具:

$ vmrun snapshot "/your/disk/image/path/wmware_image_name.vmx" your_snapshot_name

其中your_snapshot_name是你为快照取的名字。拍摄完成后,从 GUI 或命令行关闭虚拟机电源:

$ vmrun stop "/your/disk/image/path/wmware_image_name.vmx" hard

hard表示强制关机(类似直接断电),用于关闭运行中的分析机。

Cuckoo 侧如何消费这个快照

VMware 的配置方式与 VirtualBox 略有不同:vmware.conf 中每个虚拟机的标识是vmx 文件路径(vmx_path),且snapshot为必填项:

# Specify the path to vmx file of this virtual machine. vmx_path = /your/disk/image/path/wmware_image_name.vmx # Specify the snapshot name to use. snapshot = your_snapshot_name

从源码 cuckoo/machinery/vmware.py 可以看到,Cuckoo 初始化时会做三重校验:

  1. _check_vmx():vmx 路径必须以.vmx结尾且文件真实存在;
  2. _check_snapshot():调用vmrun listSnapshots确认配置的快照名确实存在;
  3. _snapshot_from_vmx():从数据库读取该 vmx 对应的快照名。

分析开始时,start()会先执行vmrun revertToSnapshot回滚(vmware.py),再以vmrun start启动;分析结束则用vmrun stop ... hard强制关机(vmware.py)。任何一步失败都会抛出CuckooMachineError,阻止任务继续。

XenServer:内存快照与磁盘重置两种方案

XenServer 的 machinery 支持两种启动分析机的方式:从磁盘启动或从内存快照启动。创建与回滚内存快照要求虚拟机内安装了 Xen guest tools。官方推荐优先使用内存快照,因为它能大幅缩短分析时的虚拟机启动时间;若无法安装 guest tools,则改用"磁盘开机即重置"(reset on boot)方案,确保恶意样本无法对虚拟机造成持久性修改。

方案一:内存快照(Memory Snapshots)

Xen guest tools 可通过 XenServer 自带的 XenCenter 应用安装。安装完成后重启虚拟机,并确认 Cuckoo Agent 正在运行。

快照可以在 XenCenter 或控制域(Dom0)的命令行中创建:

  • XenCenter 方式:创建快照时务必勾选"Snapshot disk and memory"(快照磁盘与内存),创建完成后右键点击快照,记下快照 UUID;
  • 命令行方式,在 Dom0 上执行:
$ xe vm-checkpoint vm="vm_uuid_or_name" new-name-label="Snapshot Name/Description"

vm-checkpoint会同时保存磁盘与内存状态(与普通 snapshot 不同,checkpoint 才能用于内存回滚)。命令执行完成后,快照 UUID 会打印到屏幕上。

无论用哪种方式创建,请把 UUID 记录到虚拟机的配置段中。快照创建完成后即可关闭虚拟机。

方案二:磁盘开机重置(Booting from Disk)

如果无法安装 Xen guest tools、或不需要内存快照,则必须确保:

  1. 虚拟机磁盘配置为开机时重置;
  2. Cuckoo Agent 设置为开机自启(在 Windows 中可将 agent 加入启动项,例如放入Startup文件夹,或参考 agent.rst 的做法)。

以下命令必须在虚拟机处于关机状态时执行。

首先列出虚拟机挂载的所有磁盘:

$ xe vm-disk-list vm="vm_name_or_uuid"

忽略所有 CD-ROM 和只读磁盘,对其余每块磁盘执行以下命令,将其行为改为"开机重置":

$ xe vdi-param-set uuid="vdi_uuid" on-boot=reset

磁盘设置为on-boot=reset之后,虚拟机磁盘将不再允许任何持久性修改:虚拟机运行期间产生的所有变更,在关机后都不会留存,从而保证每次分析都从干净状态开始。

Cuckoo 侧如何消费快照或磁盘重置

在 xenserver.conf 中,虚拟机的snapshot参数是可选的,且与磁盘重置方案二选一:

# Specify the virtual machine uuid. uuid = <VM-UUID> # Specify the snapshot uuid to use. Snapshots are not required, but if they are # not used, the virtual machine's disks must be configured to reset on boot. # Resetting the disks on boot ensures that samples cannot permanently modify the # analysis virtual machine past a shutdown. Refer to the "Saving the Virtual # Machine" section in the Cuckoo documentation for details on how to enable # disk resetting on boot. # Example: snapshot = <SNAPSHOT-UUID>

源码 cuckoo/machinery/xenserver.py 的_initialize_check()会逐一校验:

  • 若配置了snapshot,调用_check_snapshot()确认该 UUID 确实是快照(is_a_snapshot为真)、且snapshot_of指向的父虚拟机就是当前 VM(xenserver.py);
  • 若未配置快照,则调用_check_disks_reset()遍历所有 VBD(虚拟块设备),对每个类型为Disk的 VDI 检查on_boot == "reset",发现可写磁盘未重置会直接抛出CuckooMachineError(xenserver.py)。

分析启动时,start()若有快照则通过 XenAPI 执行VM.revert+VM.resume回滚到内存快照,否则直接VM.start冷启动(xenserver.py);分析结束用VM.hard_shutdown强制关机。整个交互通过 XenAPI XML-RPC 会话完成,连接信息(user、password、url)均在 xenserver.conf 中配置。

快照与 Cuckoo 配置的最终对接

无论选择哪种虚拟化平台,快照最终都要通过对应 machinery 配置文件注册给 Cuckoo,才能被调度器使用:

平台配置文件关键字段快照消费方式(源码位置)
VirtualBoxvirtualbox.conflabel/snapshot(可选)snapshot restore|restorecurrent(virtualbox.py)
KVMkvm.conflabel/snapshot(可选)libvirt 快照回滚(kvm.py,基于LibVirtMachinery)
VMware Workstationvmware.confvmx_path/snapshot(必填)vmrun revertToSnapshot(vmware.py)
XenServerxenserver.confuuid/snapshot(可选,二选一)VM.revert+VM.resume或磁盘重置(xenserver.py)

三个要点值得记住:

  1. VirtualBox / KVM 的snapshot可选:不配置时使用"当前快照"(restorecurrent),配置后则回滚到具名快照;
  2. VMware 的snapshot必填:_initialize_check()会调用vmrun listSnapshots验证快照存在,不存在则拒绝启动;
  3. XenServer 快照与磁盘重置二选一:配置了快照 UUID 就走内存快照回滚;否则启动时强制校验所有可写磁盘on-boot=reset。

另外,多快照还可能引发ERROR: No snapshot found for virtual machine VM-Name之类的歧义问题,建议每个分析机只保留一个基准快照,并用virsh snapshot-list/virsh snapshot-delete定期清理。

验证与排障:快照是否正确生效

快照保存后,可按照以下思路验证:

  1. 手动回滚测试:在 Host 上执行对应平台的回滚命令(如VBoxManage snapshot "<VM>" restorecurrent、vmrun revertToSnapshot ...),确认虚拟机能够回到 Agent 运行、Windows 完全启动的状态;
  2. 启动 Cuckoo 观察初始化:VirtualBox 与 VMware 的 machinery 在初始化阶段就会校验并回滚快照,若配置错误(快照名不存在、vmx 路径非法、XenServer 磁盘未重置),CuckooMachineError/CuckooCriticalError会立即抛出,日志中会给出明确的修复提示;
  3. 提交一个测试任务:使用cuckoo submit提交一个无害样本(如纯文本文件),观察调度器是否成功启动分析机、Agent 是否正常连接、分析结束后虚拟机是否被回滚到基准状态。

按本指南完成上述全部步骤后,你的分析机即处于"干净、可回滚、Agent 就绪"的状态,可以正式投入 Cuckoo 的动态分析流程。

  • 网络安全
  • 应用安全

【免费下载链接】cuckoo

Cuckoo Sandbox is an automated dynamic malware analysis system

项目地址:https://gitcode.com/gh_mirrors/cu/cuckoo
点击查看免费下载

相关推荐

上一篇:企业级微服务项目中Caffeine本地缓存的最佳实践指南
下一篇:3个技巧根治art-template内存泄漏:大型应用必看的缓存管理方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询