/

CVE-2026-105797

Severity:

HIGH RISK

(8.8)

OS Command Injection (CWE-78) in SimpleChat Plugins

CVE-2026-105797

Deferred

Vulnerability type

Category:

OS Command Injection

CWE:

CWE-78, CWE-863

Impact:

Remote Code Execution

Severity:

HIGH RISK

(8.8)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

SimpleChat contains an authorization-ordering flaw in the personal plugin creation workflow that can allow an authenticated low-privileged user to register an MCP action without proper administrative inspection. When the action is later invoked, the application may start an attacker-selected operating-system process under the service identity.

SimpleChat contains an authorization-ordering flaw in the personal plugin creation workflow that can allow an authenticated low-privileged user to register an MCP action without proper administrative inspection. When the action is later invoked, the application may start an attacker-selected operating-system process under the service identity.

Affected context

The issue occurs in SimpleChat deployments where personal plugins are enabled and governance controls permit MCP actions. It is associated with the POST /api/user/plugins workflow, where the top-level MCP type may be absent during authorization checks and restored later from metadata before the stored action is executed.

The issue occurs in SimpleChat deployments where personal plugins are enabled and governance controls permit MCP actions. It is associated with the POST /api/user/plugins workflow, where the top-level MCP type may be absent during authorization checks and restored later from metadata before the stored action is executed.

Exploit preconditions

  • Attack surface: Authenticated plugin-management and MCP action endpoints
  • Required access: A low-privileged authenticated user able to create a personal plugin
  • Required configuration: Personal plugins must be enabled, and governance must permit MCP actions
  • Trigger point: Invocation of the stored personal action
  • Why exploitation is possible: Authorization inspection can be bypassed when the MCP type is omitted initially, allowing an unsafe connector to be created after the relevant check has been skipped
  • Attack surface: Authenticated plugin-management and MCP action endpoints
  • Required access: A low-privileged authenticated user able to create a personal plugin
  • Required configuration: Personal plugins must be enabled, and governance must permit MCP actions
  • Trigger point: Invocation of the stored personal action
  • Why exploitation is possible: Authorization inspection can be bypassed when the MCP type is omitted initially, allowing an unsafe connector to be created after the relevant check has been skipped

Why this happens

The underlying flaw is an authorization ordering error combined with insufficient validation of security-relevant metadata.

The endpoint checks whether an MCP action requires administrative approval before the top-level type is restored from associated metadata. As a result, a low-privileged request can pass through a check intended to reject unauthorized MCP stdio actions. Later, the restored type reaches connector creation, where the stdio plugin launches a process based on attacker-controlled configuration. This behavior maps primarily to CWE-78: Improper Neutralization of Special Elements used in an OS Command or Argument, with CWE-863: Incorrect Authorization describing the authorization bypass that makes the command-execution path reachable.

The underlying flaw is an authorization ordering error combined with insufficient validation of security-relevant metadata.

The endpoint checks whether an MCP action requires administrative approval before the top-level type is restored from associated metadata. As a result, a low-privileged request can pass through a check intended to reject unauthorized MCP stdio actions. Later, the restored type reaches connector creation, where the stdio plugin launches a process based on attacker-controlled configuration. This behavior maps primarily to CWE-78: Improper Neutralization of Special Elements used in an OS Command or Argument, with CWE-863: Incorrect Authorization describing the authorization bypass that makes the command-execution path reachable.

Potential impact

  • An attacker may execute operating-system processes under the application service identity
  • The attacker could access, disclose, or modify secrets and data available to that identity
  • The application or connected services may be disrupted
  • Compromised credentials could enable further access or lateral movement
  • Workspace content and document-grounded interactions may be exposed or manipulated
  • An attacker may execute operating-system processes under the application service identity
  • The attacker could access, disclose, or modify secrets and data available to that identity
  • The application or connected services may be disrupted
  • Compromised credentials could enable further access or lateral movement
  • Workspace content and document-grounded interactions may be exposed or manipulated

General mitigation guidance

Mitigation generally focuses on making authorization decisions from canonical, validated object state before any connector or action is persisted or executed.

Common defensive patterns include:

  • Require security-relevant type fields to be present and validated before authorization checks
  • Apply deny-by-default authorization to MCP and process-spawning capabilities
  • Prevent untrusted users from selecting arbitrary stdio commands, arguments, or executable paths
  • Prefer narrowly allowlisted connectors and brokered integrations over direct operating-system process creation
  • Enforce strict schemas and consistent validation at every trust-boundary transition
  • Run connector processes with dedicated low-privilege identities and minimal filesystem, network, and secret access
  • Keep personal plugin capabilities disabled unless they are explicitly required and governed

Mitigation generally focuses on making authorization decisions from canonical, validated object state before any connector or action is persisted or executed.

Common defensive patterns include:

  • Require security-relevant type fields to be present and validated before authorization checks
  • Apply deny-by-default authorization to MCP and process-spawning capabilities
  • Prevent untrusted users from selecting arbitrary stdio commands, arguments, or executable paths
  • Prefer narrowly allowlisted connectors and brokered integrations over direct operating-system process creation
  • Enforce strict schemas and consistent validation at every trust-boundary transition
  • Run connector processes with dedicated low-privilege identities and minimal filesystem, network, and secret access
  • Keep personal plugin capabilities disabled unless they are explicitly required and governed

How teams detect issues like this

Detection can combine application, code, and policy analysis:

  • Review authorization paths for checks performed before type restoration, normalization, or metadata merging
  • Use static analysis to identify process-spawning APIs reachable from user-controlled plugin or connector configuration
  • Add tests for omitted, duplicated, or conflicting security-relevant fields across request and metadata representations
  • Monitor plugin creation and invocation events, especially process launches by the application service identity
  • Alert on unexpected child processes, executable paths, command arguments, or access to sensitive files
  • Enforce repository policies requiring explicit allowlists and authorization tests for MCP or OS-process capabilities
  • Automated code review and taint-analysis tools may help identify untrusted configuration flowing into process execution

Detection can combine application, code, and policy analysis:

  • Review authorization paths for checks performed before type restoration, normalization, or metadata merging
  • Use static analysis to identify process-spawning APIs reachable from user-controlled plugin or connector configuration
  • Add tests for omitted, duplicated, or conflicting security-relevant fields across request and metadata representations
  • Monitor plugin creation and invocation events, especially process launches by the application service identity
  • Alert on unexpected child processes, executable paths, command arguments, or access to sensitive files
  • Enforce repository policies requiring explicit allowlists and authorization tests for MCP or OS-process capabilities
  • Automated code review and taint-analysis tools may help identify untrusted configuration flowing into process execution

Sources

SourceLink
github.comgithub.com/microsoft/simplechat/commit/73ff7d6998dc4827a0f6ba002386275a7c1ec804
github.comgithub.com/microsoft/simplechat/security/advisories/GHSA-h4mw-qw8m-5x4j

Frequently asked

questions

It can be reached through application APIs by an authenticated user when personal plugins and governed MCP actions are enabled. It is not generally an unauthenticated issue.

A low-privileged authenticated account must be able to create a personal plugin and invoke the resulting action. Deployment policy and workspace configuration determine whether those capabilities are available.

Validate and canonicalize all security-relevant plugin metadata before authorization, reject ambiguous or incomplete type information, and restrict process-spawning connectors to approved configurations.

Use deny-by-default authorization, test alternate request representations, enforce strict schemas at trust boundaries, and run integrations with least privilege and limited access to secrets and data.

It can be reached through application APIs by an authenticated user when personal plugins and governed MCP actions are enabled. It is not generally an unauthenticated issue.

A low-privileged authenticated account must be able to create a personal plugin and invoke the resulting action. Deployment policy and workspace configuration determine whether those capabilities are available.

Validate and canonicalize all security-relevant plugin metadata before authorization, reject ambiguous or incomplete type information, and restrict process-spawning connectors to approved configurations.

Use deny-by-default authorization, test alternate request representations, enforce strict schemas at trust boundaries, and run integrations with least privilege and limited access to secrets and data.

Find out what's already
exploitable in your codebase.