# Mode 3: VM (Virtual Machine) Isolation ## When to Use **Best for:** - High-risk skills that modify system configurations - Skills that require kernel modules or system services - Testing skills that interact with VMs themselves - Maximum isolation and security - Skills from untrusted sources **Not suitable for:** - Quick iteration during development (too slow) - Skills that are obviously safe and read-only - Situations where speed is more important than isolation **Risk Level**: Medium to high complexity skills ## Advantages - ๐Ÿ”’ **Complete Isolation**: Separate kernel, OS, and all resources - ๐Ÿ›ก๏ธ **Maximum Security**: Host system is completely protected - ๐Ÿ–ฅ๏ธ **Real OS Environment**: Test on actual Linux/macOS distributions - ๐Ÿ“ธ **Snapshots**: Easy rollback to clean state - ๐Ÿงช **Destructive Testing**: Safe to test potentially dangerous operations ## Limitations - ๐ŸŒ **Slow**: Minutes to provision, slower execution - ๐Ÿ’พ **Disk Space**: 10-20GB per VM - ๐Ÿ’ฐ **Resource Intensive**: Requires significant RAM and CPU - ๐Ÿ”ง **Complex Setup**: More moving parts to configure - โฑ๏ธ **Longer Feedback Loop**: Not ideal for rapid iteration ## Prerequisites 1. Virtualization software installed: - **macOS**: UTM, Parallels, or VMware Fusion - **Linux**: QEMU/KVM, VirtualBox, or virt-manager - **Windows**: VirtualBox, Hyper-V, or VMware Workstation 2. Base VM image or ISO: - Ubuntu 22.04 LTS (recommended) - Debian 12 - Fedora 39 3. System resources: - 8GB+ host RAM (allocate 2-4GB to VM) - 20GB+ disk space - CPU virtualization enabled (VT-x/AMD-V) 4. Command-line tools: - **macOS with UTM**: `utmctl` or use UI - **Linux**: `virsh` (libvirt) or `vboxmanage` (VirtualBox) - **Multipass**: `multipass` (cross-platform, recommended) ## Recommended: Use Multipass Multipass is the easiest option for cross-platform VM management: ```bash # Install Multipass # macOS: brew install multipass # Linux: sudo snap install multipass # Windows: # Download from https://multipass.run/ ``` ## Workflow ### Step 1: Validate Virtualization Environment ```bash # Check virtualization is enabled (Linux) grep -E 'vmx|svm' /proc/cpuinfo # Check Multipass is installed command -v multipass || { echo "Install Multipass"; exit 1; } # Check available resources multipass info || echo "First time setup needed" ``` ### Step 2: Create Base VM **Launch clean Ubuntu VM:** ```bash VM_NAME="skill-test-$(date +%s)" # Launch VM with Multipass multipass launch \ --name "$VM_NAME" \ --cpus 2 \ --memory 2G \ --disk 10G \ 22.04 # Wait for VM to be ready multipass exec "$VM_NAME" -- cloud-init status --wait ``` **Or use UTM (macOS GUI):** 1. Download Ubuntu 22.04 ARM64 ISO 2. Create new VM with 2GB RAM, 10GB disk 3. Install Ubuntu and setup user 4. Note VM name for scripts **Or use virsh (Linux CLI):** ```bash # Download cloud image wget https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img # Create VM virt-install \ --name "$VM_NAME" \ --memory 2048 \ --vcpus 2 \ --disk ubuntu-22.04-server-cloudimg-amd64.img \ --import \ --os-variant ubuntu22.04 ``` ### Step 3: Install Claude Code in VM ```bash # Install system dependencies multipass exec "$VM_NAME" -- sudo apt-get update multipass exec "$VM_NAME" -- sudo apt-get install -y \ curl \ git \ nodejs \ npm # Install Claude Code multipass exec "$VM_NAME" -- npm install -g @anthropic/claude-code # Verify installation multipass exec "$VM_NAME" -- which claude ``` ### Step 4: Copy Skill to VM ```bash # Create directory structure multipass exec "$VM_NAME" -- mkdir -p /home/ubuntu/.claude/skills # Copy skill to VM multipass transfer \ ~/.claude/skills/[skill-name] \ "$VM_NAME":/home/ubuntu/.claude/skills/ # Verify copy multipass exec "$VM_NAME" -- ls -la /home/ubuntu/.claude/skills/[skill-name] ``` ### Step 5: Take VM Snapshot **With Multipass:** ```bash # Multipass doesn't support snapshots directly # Instead, we'll capture filesystem state multipass exec "$VM_NAME" -- find /home/ubuntu -type f > /tmp/before-files.txt multipass exec "$VM_NAME" -- dpkg -l > /tmp/before-packages.txt multipass exec "$VM_NAME" -- ps aux > /tmp/before-processes.txt ``` **With UTM (macOS):** ```bash # Take snapshot via UI or CLI if available utmctl snapshot "$VM_NAME" --name "before-skill-test" ``` **With virsh (Linux):** ```bash virsh snapshot-create-as "$VM_NAME" before-skill-test "Before skill test" ``` ### Step 6: Execute Skill in VM **Start Claude Code session in VM:** ```bash # Interactive session multipass shell "$VM_NAME" # Then inside VM: claude # Run skill with trigger phrase ``` **Or execute non-interactively:** ```bash # If skill has test command multipass exec "$VM_NAME" -- \ bash -c "claude skill run [skill-name] --test" ``` **Monitor from host:** ```bash # Watch resource usage multipass info "$VM_NAME" --format json | jq '.info[] | {memory_usage, cpu_usage}' # Tail logs multipass exec "$VM_NAME" -- tail -f /var/log/syslog ``` ### Step 7: Take Post-Execution Snapshot ```bash # Capture filesystem state multipass exec "$VM_NAME" -- find /home/ubuntu -type f > /tmp/after-files.txt multipass exec "$VM_NAME" -- dpkg -l > /tmp/after-packages.txt multipass exec "$VM_NAME" -- ps aux > /tmp/after-processes.txt # Compare diff /tmp/before-files.txt /tmp/after-files.txt > /tmp/file-changes.txt diff /tmp/before-packages.txt /tmp/after-packages.txt > /tmp/package-changes.txt diff /tmp/before-processes.txt /tmp/after-processes.txt > /tmp/process-changes.txt ``` **Snapshot VM state:** ```bash # virsh virsh snapshot-create-as "$VM_NAME" after-skill-test "After skill test" # UTM (macOS) utmctl snapshot "$VM_NAME" --name "after-skill-test" ``` ### Step 8: Analyze Results **Extract execution logs:** ```bash # Copy Claude Code logs from VM multipass transfer \ "$VM_NAME":/home/ubuntu/.claude/logs/ \ /tmp/skill-test-logs/ # Analyze logs grep -i "error\|warning\|fail" /tmp/skill-test-logs/*.log ``` **Check filesystem changes:** ```bash echo "Files added: $(grep ">" /tmp/file-changes.txt | wc -l)" echo "Files removed: $(grep "<" /tmp/file-changes.txt | wc -l)" # Check for unexpected modifications grep ">/etc/" /tmp/file-changes.txt # System config changes grep ">/usr/local/" /tmp/file-changes.txt # Global installs ``` **Check package changes:** ```bash # List newly installed packages grep ">" /tmp/package-changes.txt # Check for removed packages grep "<" /tmp/package-changes.txt ``` **Check for orphaned processes:** ```bash # Processes still running after skill completion grep ">" /tmp/process-changes.txt | grep -v "ps\|grep\|ssh" ``` **System modifications:** ```bash # Check for systemd services multipass exec "$VM_NAME" -- systemctl list-units --type=service --state=running # Check for cron jobs multipass exec "$VM_NAME" -- crontab -l # Check for environment modifications multipass exec "$VM_NAME" -- cat /etc/environment ``` ### Step 9: Generate Comprehensive Report ```markdown # VM Isolation Test Report: [skill-name] ## Environment **VM Platform**: Multipass / UTM / virsh **OS**: Ubuntu 22.04 LTS **VM Name**: $VM_NAME **Resources**: 2 vCPU, 2GB RAM, 10GB disk ## Execution Results **Status**: โœ… Completed successfully **Duration**: 45 seconds **Exit Code**: 0 ## Filesystem Changes **Files Added**: 12 - `/home/ubuntu/.claude/cache/skill-data.json` (15KB) - `/tmp/skill-temp-*.log` (3 files, 45KB total) - `/home/ubuntu/.cache/skill-assets/` (8 files, 120KB) **Files Modified**: 2 - `/home/ubuntu/.claude/config.json` (updated skill registry) - `/home/ubuntu/.bash_history` (normal) **Files Deleted**: 0 ## Package Changes **Installed Packages**: 2 - `jq` (1.6-2.1ubuntu3) - `tree` (2.0.2-1) **Removed Packages**: 0 ## System Modifications โœ… No systemd services added โœ… No cron jobs created โœ… No environment variables modified โš ๏ธ Found leftover temp files in /tmp ## Process Analysis **Orphaned Processes**: 0 **Background Jobs**: 0 **Network Connections**: 0 ## Security Assessment โœ… No unauthorized file access attempts โœ… No privilege escalation attempts โœ… No suspicious network activity โœ… All operations within user home directory ## Dependency Analysis **System Packages Required**: - `jq` (for JSON processing) - Not documented in README - `tree` (for directory visualization) - Optional **NPM Packages Required**: None beyond Claude Code **Hardcoded Paths Detected**: โš ๏ธ `/home/ubuntu/.claude/cache` (line 67) โ†’ Should use `$HOME/.claude/cache` or `~/.claude/cache` ## Recommendations 1. **CRITICAL**: Document `jq` dependency in README.md 2. **HIGH**: Fix hardcoded path on line 67 3. **MEDIUM**: Clean up /tmp files before skill exits 4. **LOW**: Consider making `tree` dependency optional ## Overall Grade: B (READY with minor fixes) **Portability**: 85/100 **Cleanliness**: 75/100 **Security**: 100/100 **Documentation**: 70/100 **Final Status**: โœ… **APPROVED** for public release after addressing CRITICAL and HIGH priority items ``` ### Step 10: Cleanup or Preserve **Ask user:** ``` Test complete. VM: $VM_NAME Options: 1. Keep VM for manual inspection Command: multipass shell $VM_NAME 2. Stop VM (can restart later) Command: multipass stop $VM_NAME 3. Delete VM and snapshots (full cleanup) Command: multipass delete $VM_NAME && multipass purge 4. Rollback to "before" snapshot and retest (virsh/UTM only) Your choice? ``` **Cleanup commands:** ```bash # Option 2: Stop VM multipass stop "$VM_NAME" # Option 3: Full cleanup multipass delete "$VM_NAME" multipass purge # Cleanup temp files rm -rf /tmp/skill-test-logs rm /tmp/before-*.txt /tmp/after-*.txt /tmp/*-changes.txt ``` ## Interpreting Results ### โœ… **PASS** - Production Ready - VM still bootable after test - Skill completed successfully - No unauthorized system modifications - All dependencies documented - No security issues detected - Clean cleanup (no orphaned resources) ### โš ๏ธ **WARNING** - Needs Review - Skill works but left system modifications - Installed undocumented packages - Modified system configs (needs user consent) - Performance issues (high resource usage) ### โŒ **FAIL** - Not Safe - VM corrupted or unbootable - Skill crashed or hung indefinitely - Unauthorized privilege escalation - Malicious behavior detected - Critical undocumented dependencies - Data exfiltration attempts ## Common Issues ### Issue: "Multipass not found" **Fix**: ```bash # macOS brew install multipass # Linux sudo snap install multipass ``` ### Issue: "Virtualization not enabled" **Cause**: VT-x/AMD-V disabled in BIOS **Fix**: Enable virtualization in BIOS/UEFI settings ### Issue: "Failed to launch VM" **Cause**: Insufficient resources **Fix**: ```bash # Reduce VM resources multipass launch --cpus 1 --memory 1G --disk 5G ``` ### Issue: "VM network not working" **Cause**: Network bridge issues **Fix**: ```bash # Restart Multipass daemon # macOS sudo launchctl kickstart -k system/com.canonical.multipassd # Linux sudo systemctl restart snap.multipass.multipassd ``` ### Issue: "Can't copy files to VM" **Cause**: SSH/sftp issues **Fix**: ```bash # Mount host directory instead multipass mount ~/.claude/skills "$VM_NAME":/mnt/skills ``` ## Advanced Techniques ### Automated Testing Pipeline ```bash #!/bin/bash # test-skill-vm.sh SKILL_NAME="$1" VM_NAME="skill-test-$SKILL_NAME-$(date +%s)" # Launch VM multipass launch --name "$VM_NAME" 22.04 # Setup multipass exec "$VM_NAME" -- bash -c " sudo apt-get update sudo apt-get install -y nodejs npm npm install -g @anthropic/claude-code " # Copy skill multipass transfer ~/.claude/skills/$SKILL_NAME "$VM_NAME":/home/ubuntu/.claude/skills/ # Run test multipass exec "$VM_NAME" -- claude skill test $SKILL_NAME # Cleanup multipass delete "$VM_NAME" multipass purge ``` ### Testing on Multiple OS Versions ```bash # Test on Ubuntu 20.04, 22.04, and 24.04 for version in 20.04 22.04 24.04; do VM="skill-test-ubuntu-${version}" multipass launch --name "$VM" $version # ... run tests ... multipass delete "$VM" done ``` ### Network Isolation Testing ```bash # Create VM without internet access (if supported by hypervisor) # Then test if skill fails gracefully without network ``` ## Best Practices 1. **Always take snapshots** before running skills 2. **Test on clean VMs** - don't reuse VMs between tests 3. **Monitor resource usage** - catch runaway processes 4. **Check system logs** (`/var/log/syslog`) for warnings 5. **Test rollback** - ensure VM can be restored 6. **Document all system dependencies** found 7. **Use minimal VM resources** to catch resource issues 8. **Archive test results** before destroying VMs ## Quick Command Reference ```bash # Launch VM multipass launch --name test-vm 22.04 # List VMs multipass list # Shell into VM multipass shell test-vm # Execute command in VM multipass exec test-vm -- # Copy file to VM multipass transfer local-file test-vm:/remote/path # Copy file from VM multipass transfer test-vm:/remote/path local-file # Stop VM multipass stop test-vm # Start VM multipass start test-vm # Delete VM multipass delete test-vm && multipass purge # VM info multipass info test-vm ``` --- **Remember:** VM isolation is the gold standard for testing high-risk skills. It's slower but provides complete security and accurate testing of system-level behaviors. Use for skills from untrusted sources or skills that modify system state.