VIRTFS-PROXY-HELPER(1)

πŸ’– VIRTFS-PROXY-HELPER πŸ’–

okay so bestie, welcome to the manual page for virtfs-proxy-helper β€” it's the QEMU 9p virtfs proxy filesystem helper and honestly? it's giving "tiny daemon, huge responsibilities" πŸ‘‘


✨ SYNOPSIS ✨

virtfs-proxy-helper [OPTIONS]

that's it. that's the whole vibe. options only, no positional args, no drama 🌸


πŸ¦‹ DESCRIPTION πŸ¦‹

⚠️ READ THIS FIRST, FR FR: the 9p proxy backend is deprecated (since QEMU 8.1) and will be removed, along with this daemon, in a future version of QEMU. not "maybe", not "we'll see" β€” removed. πŸ’€

so here's the lore. the pass-through security model in the QEMU 9p server needs root privilege to do a few file operations (like chown, chmod to any mode/uid:gid). and that model has two whole problems:

  • TOCTTOU vulnerability: following symbolic links in the server could provide access to files beyond the 9p export path. 😭
  • running QEMU with root privilege could be a security issue. πŸ™ˆ

to overcome the above issues, here's the approach, and it's actually kind of iconic: a new filesystem type proxy is introduced. Proxy FS uses a chroot + socket combination for securing the vulnerability known with following symbolic links. the intention of adding a new filesystem type is to allow qemu to run in non-root mode, while still doing privileged operations using socket IO. 🫢

the Proxy helper (a stand-alone binary, part of qemu) is invoked with root privileges. Proxy helper chroots into the 9p export path and creates a socket pair or a named socket, based on the command line parameter. QEMU and the proxy helper communicate using this socket. the QEMU proxy fs driver sends filesystem requests to the proxy helper and receives the response back from it. ✨

and the best part? the proxy helper is designed so that it can drop root privileges β€” except for the capabilities needed for doing filesystem operations. main character energy, honestly. πŸ‘‘


πŸŽ€ OPTIONS πŸŽ€

the following options are supported:

  • -h β€” display help and exit. short, sweet, slays. πŸ’…
  • -p, --path PATH β€” path to export for the proxy filesystem driver. this is the 9p export path it chroots into, iykyk. πŸ“
  • -f, --fd SOCKET_ID β€” use the given file descriptor as the socket descriptor for communicating with the qemu proxy fs driver. usually a helper like libvirt will create a socketpair and pass one of the fds as the parameter to this option. πŸ”₯
  • -s, --socket SOCKET_FILE β€” creates a named socket file for communicating with the qemu proxy fs driver. 🌸
  • -u, --uid UID β€” uid to give access to the named socket file; used in combination with -g. 🧚
  • -g, --gid GID β€” gid to give access to the named socket file; used in combination with -u. 🧚
  • -n, --nodaemon β€” run as a normal program. by default, the program will run in daemon mode. not me being surprised by the daemon default every single time 😭

πŸ’œ AUTHOR πŸ’œ

M. Mohan Kumar


2026, The QEMU Project Developers


and that's the whole page, bestie! 🫢 this one came from the QEMU manual, version 8.2.2, dated Apr 08, 2026 β€” so if you're reading this, hi from the future, drink water, and go chown responsibly πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from