Files
WSL/msipackage
Ben Hillis 77c348355f Isolate plugins in out-of-process COM host
Plugin DLLs are now loaded in isolated wslpluginhost.exe processes
instead of directly in wslservice.exe via LoadLibrary. This prevents
a buggy or malicious plugin from crashing the WSL service.

Architecture:
- New IWslPluginHost/IWslPluginHostCallback COM interfaces
  (WslPluginHost.idl) for cross-process plugin lifecycle management
- New wslpluginhost.exe: COM local server (REGCLS_SINGLEUSE), one
  per plugin, loads the plugin DLL and dispatches notifications
- Refactored PluginManager: CoCreateInstance replaces LoadLibrary,
  PluginError returned via [out] parameter, crash recovery via
  IsHostCrash() detecting RPC_E_DISCONNECTED/SERVER_DIED

Callback safety:
- Plugin callbacks (MountFolder, ExecuteBinary) arrive on a different
  COM RPC thread and use std::shared_lock(m_callbackLock) instead of
  m_instanceLock to avoid re-entrancy deadlocks
- _VmTerminate takes exclusive m_callbackLock before destroying the
  VM, blocking until in-flight callbacks complete
- Lock ordering: m_instanceLock -> m_callbackLock (never reverse)
- All writes to m_runningInstances take m_callbackLock exclusive to
  prevent data races with concurrent callback reads

Security:
- COM AppID with SYSTEM-only launch/access permissions
- Plugin signature validation (ValidateFileSignature) keeps the file
  handle open until after LoadLibrary to prevent TOCTOU attacks
- Plugin host processes use minimal access rights for handles

Process lifecycle:
- Plugin hosts added to a job object with KILL_ON_JOB_CLOSE for
  automatic cleanup if wslservice exits
- g_pluginHost is process-wide (REGCLS_SINGLEUSE guarantees one
  plugin per process), nulled on destruction to prevent UAF
- std::call_once for thread-safe initialization and job creation

Packaging:
- WslPluginHost.idl compiled into existing wslserviceproxystub.dll
- MSI: COM class/interface registration, AppID security, proxy/stub
- wslpluginhost.exe added to build/signing pipeline, WER crash dump
  list, LSP registration, and test validation

Plugins are not loaded for WSL1-only sessions since all plugin hooks
require a WSL2 VM. WslPluginApi.h is unchanged - existing plugin DLLs
work unmodified.
2026-04-10 16:03:32 -07:00
..