Back to skill

Security audit

drivethru-production-scheduler

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent Odoo production scheduler, but it can make live scheduling changes through a broad bearer-token MCP client without consistently bounded scope or confirmation.

Install only in an environment where the Odoo MCP token is least-privileged, server-side tool access is limited to the required manufacturing tools, and ODOO_MCP_URL is an approved HTTPS endpoint. Treat scheduling writes as live business changes: require an explicit approval step before reordering queues or bulk scheduling unless you have a documented automation policy and rollback process.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/odoo_mcp.py:48
Finding

Bearer Token Can Be Transmitted to an Unencrypted MCP Endpoint

Content
View full analysis
int: url, token = _config() if not url or not token: return _fail( "config_error", "Set ODOO_MCP_URL and ODOO_MCP_TOKEN before using this skill.", code=2, ) headers = {"Authorization": f"Bearer {token}"} ``` ### Technical Analysis The MCP endpoint is taken directly from the `ODOO_MCP_URL` environment variable and passed to `streamablehttp_client` without validating its URL scheme or destination. The static Odoo MCP token is then added to every connection as an `Authorization: Bearer` header. Although the documentation recommends an HTTPS example, the implementation does not reject `http://` endpoints. If a plaintext HTTP URL is configured, the bearer token and MCP traffic may traverse the network without confidentiality or server authentication. A network-positioned attacker could intercept the token, while a maliciously configured endpoint would receive it directly. The token is described as the `drivethru.mcp_key`. Its effective privilege is determined by the remote Odoo MCP server, but the documented tools include manufacturing-data reads and live scheduling writes. ### Attack Path 1. An attacker influences deployment configuration, installation instructions, shell environment, or another mechanism that controls `ODOO_M ...[truncated 1481 chars]
Remediation
View remediation
str: parsed = urlsplit(url) if parsed.scheme != "https": raise ValueError("ODOO_MCP_URL must use HTTPS.") if not parsed.hostname or parsed.username or parsed.password: raise ValueError("ODOO_MCP_URL is invalid.") return url ``` ]]>

T08 · Insecure Dependencies

Note
Location
SKILL.md:26
Finding

Unbounded MCP Dependency Version Weakens Supply-Chain Reproducibility

Content
View full analysis
=1.9.0 ``` ### Technical Analysis The dependency declaration specifies only a minimum version of the `mcp` package. Consequently, installation can resolve to any future release satisfying `>=1.9.0`, rather than a specific version whose behavior has been audited with this project. This does not establish that the current `mcp` package is malicious. The risk is that future compromise, malicious publication, dependency-account takeover, or an incompatible release could change code executed during installation or import. The client imports and executes the package in a process that can read `ODOO_MCP_TOKEN` and communicate with the configured Odoo endpoint. The absence of a lockfile and integrity hashes also makes installation results dependent on the package index state at installation time, reducing audit reproducibility. ### Attack Path 1. A future version of the `mcp` package, or one of its transitive dependencies, is compromised or maliciously published. 2. The compromised version still satisfies the broad `mcp>=1.9.0` constraint. 3. A fresh installation or environment rebuild resolves and installs that version. 4. Malicious code executes during package installation, module import, or MCP client operation. 5. Because the process has access to the Skill environment, the malicious package may read `ODOO_MCP_TOKEN`, inspect `ODOO_MCP_URL`, manipulate MCP traffic, or execute with the operating-system privileges of the invoking user. Exploitation depends on an upstream supply-chain compromise or unsafe package resolution; the declaration alone does not provide a direct remote exploit. ### Impact Assessment A compromised dependency would execute in the context of the user running the Skill. Potential impact includes: - Theft of the Odoo MCP bearer token and ...[truncated 471 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill is presented as a narrowly scoped production scheduler, but its instructions explicitly direct the agent to enumerate all MCP tools and trust dynamic schemas, which effectively turns it into a generic privileged MCP client. That mismatch is dangerous because users and orchestrators may grant or invoke the skill under the assumption of limited scheduling behavior, while it can reach unrelated server capabilities using a static bearer token.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares access to environment secrets and an MCP-connected transport path, but does not constrain tool scope with an allowlist or permissions boundary. In practice, this means an agent following the skill can discover and potentially invoke any MCP tools exposed by the Odoo server, increasing the blast radius if the server offers sensitive or write-capable operations beyond production scheduling.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The description says to use the skill whenever the user asks to "schedule/plan production, rank or re-order the production queue, build a machine schedule, slot in a rush order, or check whether a batch's goods are in yet." Several of these phrases are broad natural-language requests without explicit constraints or negative examples, which can cause unintended invocation outside a narrowly defined context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The pseudocode instructs the agent to call write-capable Odoo operations such as production_set_run_order and production_bulk_schedule automatically, without requiring an explicit user confirmation step before modifying production data. In this skill's context, those writes can materially alter the live manufacturing queue and machine assignments, so a mistaken trigger, misunderstood request, or bad upstream data could cause operational disruption even if the logic is otherwise well-intentioned.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The call command sends arbitrary JSON arguments to a remote MCP server using a bearer token and prints the result, but there is no confirmation prompt or user-facing warning at the point of transmission. Because this code can send user/system data to an external service and invoke remote actions non-interactively, it should disclose that behavior more explicitly.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.