- 网络安全
- 应用安全
【免费下载链接】cuckoo
Cuckoo Sandbox is an automated dynamic malware analysis system
本篇指南对应 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>" restorecurrentcontrolvm ... 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" 1234567890snapshot-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 = Snapshot1KVM 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" hardhard表示强制关机(类似直接断电),用于关闭运行中的分析机。
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 初始化时会做三重校验:
_check_vmx():vmx 路径必须以.vmx结尾且文件真实存在;_check_snapshot():调用vmrun listSnapshots确认配置的快照名确实存在;_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、或不需要内存快照,则必须确保:
- 虚拟机磁盘配置为开机时重置;
- 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,才能被调度器使用:
| 平台 | 配置文件 | 关键字段 | 快照消费方式(源码位置) |
|---|---|---|---|
| VirtualBox | virtualbox.conf | label/snapshot(可选) | snapshot restore|restorecurrent(virtualbox.py) |
| KVM | kvm.conf | label/snapshot(可选) | libvirt 快照回滚(kvm.py,基于LibVirtMachinery) |
| VMware Workstation | vmware.conf | vmx_path/snapshot(必填) | vmrun revertToSnapshot(vmware.py) |
| XenServer | xenserver.conf | uuid/snapshot(可选,二选一) | VM.revert+VM.resume或磁盘重置(xenserver.py) |
三个要点值得记住:
- VirtualBox / KVM 的
snapshot可选:不配置时使用"当前快照"(restorecurrent),配置后则回滚到具名快照; - VMware 的
snapshot必填:_initialize_check()会调用vmrun listSnapshots验证快照存在,不存在则拒绝启动; - XenServer 快照与磁盘重置二选一:配置了快照 UUID 就走内存快照回滚;否则启动时强制校验所有可写磁盘
on-boot=reset。
另外,多快照还可能引发ERROR: No snapshot found for virtual machine VM-Name之类的歧义问题,建议每个分析机只保留一个基准快照,并用virsh snapshot-list/virsh snapshot-delete定期清理。
验证与排障:快照是否正确生效
快照保存后,可按照以下思路验证:
- 手动回滚测试:在 Host 上执行对应平台的回滚命令(如
VBoxManage snapshot "<VM>" restorecurrent、vmrun revertToSnapshot ...),确认虚拟机能够回到 Agent 运行、Windows 完全启动的状态; - 启动 Cuckoo 观察初始化:VirtualBox 与 VMware 的 machinery 在初始化阶段就会校验并回滚快照,若配置错误(快照名不存在、vmx 路径非法、XenServer 磁盘未重置),
CuckooMachineError/CuckooCriticalError会立即抛出,日志中会给出明确的修复提示; - 提交一个测试任务:使用
cuckoo submit提交一个无害样本(如纯文本文件),观察调度器是否成功启动分析机、Agent 是否正常连接、分析结束后虚拟机是否被回滚到基准状态。
按本指南完成上述全部步骤后,你的分析机即处于"干净、可回滚、Agent 就绪"的状态,可以正式投入 Cuckoo 的动态分析流程。
- 网络安全
- 应用安全
【免费下载链接】cuckoo
Cuckoo Sandbox is an automated dynamic malware analysis system
相关推荐
Cuckoo Sandbox 虚拟机构建指南:来宾机创建、系统选型与快照准备
Cuckoo Sandbox 虚拟机构建指南:来宾机创建、系统选型与快照准备 Cuckoo Sandbox 是一套自动化动态恶意软件分析系统,其分析任务最终都要
网络安全应用安全Cuckoo Sandbox 物理机部署指南:用 FOG 保存与恢复 Guest 干净状态
Cuckoo Sandbox 物理机部署指南:用 FOG 保存与恢复 Guest 干净状态 本文是 Cuckoo Sandbox 物理机(Physical Ma
网络安全应用安全Cuckoo Sandbox 客户机(Guest)完整准备指南:从虚拟机创建、Agent 部署到快照与克隆
Cuckoo Sandbox 客户机(Guest)完整准备指南:从虚拟机创建、Agent 部署到快照与克隆 本篇指南围绕 Cuckoo Sandbox 自动化动
网络安全应用安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考