Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MVMRelay

Authenticated Command Execution for Isolated Windows Research VMs

RustLinux relayWindows agent

MVMRelay provides authenticated remote command execution for isolated Windows research VMs without opening an RDP session. It creates temporary or persistent user accounts, executes commands under SYSTEM, Medium Integrity, or Low Integrity, cleans up ephemeral identities, and transfers selected research artifacts through the existing authenticated relay channel.

The project addresses a common limitation of QEMU Guest Agent workflows: qemu-ga executes commands as NT AUTHORITY\SYSTEM, while reverse engineering, security research, and malware analysis often require repeatable execution under constrained security contexts. MVMRelay automates that lifecycle without repeatedly creating users, switching contexts, and performing manual cleanup.

Project Documentation


What MVMRelay Does

  • Routes authenticated commands from a local Linux control socket to a selected Windows VM.
  • Executes commands as LocalSystem or through bounded Medium and Low Integrity identities.
  • Supports interactive consoles, one-shot automation, cancellation, and remote deadlines.
  • Creates, disables, expires, and removes ephemeral Windows accounts automatically.
  • Pulls resumable, SHA-256-verified artifacts through the agent's existing outbound connection.
  • Provides native Linux and Windows embedding surfaces for authorized host applications.
  • Bounds frames, queues, retained output, concurrency, execution time, and account lifetime.

The relay does not expose a host shell, Docker API, or network-facing operator endpoint.


How It Works

A Windows LocalSystem service establishes one outbound mutual-TLS connection to a Linux relay host. Operators use mvmctl through a local mode-0660 Unix socket. The relay authenticates agents, correlates requests to a specific client and connection generation, and returns bounded output or verified artifact chunks over the same channel.

flowchart LR
operator["Operator<br/>mvmctl"] -->|"Mode-0660 Unix socket"| relay["Linux relay host<br/>mvmrelay-server"]
relay <-->|"Outbound mutual TLS<br/>Bounded relay protocol"| agent["Windows VM<br/>LocalSystem agent"]
agent -->|"Create bounded child"| command["SYSTEM, Medium, or Low<br/>Integrity command"]
command -->|"Output and artifact chunks"| agent
Loading
ComponentRuns onPurpose
mvmrelay-serverLinux relay hostAuthenticates agents and routes bounded messages
libmvmrelay_server.soNative Linux hostEmbeds the same relay runtime in a larger service
mvmctlLinux relay hostUses the local administrative Unix socket
mvmrelay-agent.exeWindows VMBoot-start LocalSystem agent and command executor
mvmrelay_agent.dllNative Windows hostEmbeds the same agent runtime in an authorized host process

Security Boundary

  • The relay binds an explicit administrator-selected VM-network address and rejects peers outside configured CIDRs.
  • Mutual TLS authenticates both sides, and each client ID is pinned to its leaf-certificate SHA-256 fingerprint.
  • The network listener accepts authenticated agents only. Operator access remains on the local Unix socket.
  • Filesystem access is limited to pull-only reads of an explicit operator-selected regular file.
  • Routing is scoped by client ID, request ID, and connection generation.
  • Windows children use kill-on-close Job Objects.
  • Temporary integrity identities are non-administrators, immediately disabled, and deleted on completion, expiry, or startup recovery.

Review the complete security architecture before deployment.


Requirements

  • A Linux relay host with an isolated VM-network interface
  • Docker Engine with Compose for the packaged relay deployment
  • A stable Rust toolchain when building from source
  • One or more Windows VMs for the agent service
  • A private PKI with a unique client identity for each VM

Getting Started

The examples use 10.10.10.1/24 and client ID vm01. Replace them with your private VM network.

1) Build the Linux components

CARGO_BUILD_JOBS=1 cargo build --release -p mvmrelay-server -p mvmctl

2) Create the private PKI

scripts/init-pki.sh ./pki 10.10.10.1 mvmrelay.internal
scripts/issue-client.sh ./pki vm01

3) Configure the relay

Copy config/server.example.toml to an ignored runtime directory, set listen, allowed_agent_networks, and [clients.<id>], then place only these runtime certificates under its pki/ directory:

server.crt
server.key
client-ca.crt

Keep both CA private keys outside the container. Configure Compose from a private .env based on deploy/.env.example, then start the relay:

cp deploy/.env.example deploy/.env
docker compose -f deploy/compose.yaml up -d --build
target/release/mvmctl clients

4) Build and install the Windows agent

Build on a Windows Rust host:

cargo build --release -p mvmrelay-agent

Create the VM bundle described in Deployment, then install from elevated PowerShell:

.\Install-MVMRelay.ps1`-SourceDirectory .`-ClientId vm01 `-ServerAddress 10.10.10.1`-ServerName mvmrelay.internal

Operate

Interactive console:

$ mvmctl
mvmctl> use vm01
mvmctl>vm01[10.10.10.20]> system
mvmctl>vm01[10.10.10.20]>System> whoami /all
mvmctl>vm01[10.10.10.20]>System> :back
mvmctl>vm01[10.10.10.20]> low --ttl 300
mvmctl>vm01[10.10.10.20]>Low> :userinfo
mvmctl>vm01[10.10.10.20]>Low> :cmd
mvmctl>vm01[10.10.10.20]>Low>Cmd> whoami /all

Interactive commands have a bounded remote deadline. Pressing Ctrl+C requests cancellation of the exact command UUID in the selected VM, and the agent terminates that command's kill-on-close Job Object. Use :context powershell|cmd, :powershell, or :cmd to switch interpreters without changing identity.

One-shot automation:

mvmctl clients
mvmctl exec --client vm01 -- C:\Windows\System32\whoami.exe /all
mvmctl exec --client vm01 --ephemeral-integrity low --account-ttl 60 --timeout 30 -- C:\Windows\System32\whoami.exe /groups
mvmctl exec --client vm01 --powershell-file ./instrument.ps1
mvmctl pull --client vm01 --remote 'C:\dumps\kernel.dmp' --output ./kernel.dmp --resume

Artifact pulls use the agent's existing outbound mTLS connection and the relay's local Unix control socket. Chunks are compressed when beneficial, verified individually and end-to-end with SHA-256, and resumable from a remote-verified local partial prefix. No HTTP receiver or firewall change is involved.

See the command reference for every command, prompt directive, option, environment variable, limit, and exit status.

About

A Remote Administration Secure Command Relay for executing commands at different Integrity Level's (IL) on Windows VM's

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages