Back to skill

Security audit

Odoo Manager

Security checks for vulnerabilities and agentic risk

Overview

This Odoo skill is mostly purpose-aligned, but it gives agents broad authority over business data and can send Odoo credentials to a user-supplied endpoint without enough safeguards.

Install only if you intend to let the agent operate on real Odoo data. Use a least-privileged Odoo account or API key, prefer staging for testing, verify the exact URL and database before authenticating, and require explicit confirmation before create, update, or delete operations, especially unlink/delete on production records.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:16
Finding

Arbitrary Odoo Endpoint Override Can Disclose Authentication Credentials

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:16-17, 173, 193, 208
Vulnerability Type: Unvalidated user-controlled authentication endpoint
Risk Level: High

Vulnerable Code

text
1. `temporary_url` — one-time URL for a specific operation
2. `user_url` — user-defined URL for the current session
python
common = xmlrpc.client.ServerProxy(f"{resolved_url}/xmlrpc/2/common")
version_info = common.version()
python
uid = common.authenticate(resolved_db, resolved_username, resolved_secret, {})
python
models = xmlrpc.client.ServerProxy(f"{resolved_url}/xmlrpc/2/object")

Technical Analysis

The skill permits temporary_url and user_url to override the configured Odoo endpoint. It does not instruct the agent to validate the URL scheme, verify the destination against an allowlist, reject embedded credentials, or block loopback, link-local, and private-network destinations.

After resolving the user-controlled URL, the documented authentication flow submits resolved_db, resolved_username, and resolved_secret to its /xmlrpc/2/common endpoint. Because resolved_secret is an Odoo password or API key, an attacker-controlled XML-RPC server can capture valid credentials. Allowing arbitrary destinations also creates a server-side request forgery primitive against services reachable from the agent environment.

Attack Path

  1. An attacker or untrusted instruction asks the agent to use a supplied temporary_url or user_url.
  2. The skill gives that value precedence over the trusted ODOO_URL.
  3. The agent creates an XML-RPC client for the supplied URL.
  4. The agent invokes authenticate using the resolved database name, username, and existing password or API key.
  5. An attacker-controlled endpoint records those authentication values.
  6. The attacker uses the captured credentials against the legitimate Odoo instance, subject to the privileges of the compromised account.

For an SSRF variant, the attacker supp ...[truncated 765 chars]

Remediation
View remediation

Remediation Suggestions

  1. Restrict endpoint overrides to an explicit allowlist of trusted Odoo origins configured by an administrator.
  2. Require HTTPS for every non-development endpoint and reject plaintext HTTP.
  3. Parse and normalize URLs before use. Reject embedded credentials, fragments, unexpected ports, malformed hostnames, and non-HTTP schemes.
  4. Resolve hostnames and block loopback, link-local, multicast, reserved, and private-network addresses unless an administrator has explicitly approved them.
  5. Revalidate the destination after every redirect, or disable redirects entirely for XML-RPC authentication calls.
  6. Bind credentials to a specific trusted origin. Never reuse environment or session credentials automatically after changing the endpoint.
  7. Require the user to provide separately scoped credentials for a newly selected origin and clearly display the normalized destination before authentication.
  8. Require explicit confirmation before sending a secret to a temporary or newly configured endpoint.
  9. Apply connection and response-size limits to reduce SSRF and denial-of-service exposure.
  10. Clear temporary URLs and credentials immediately after the logical operation, including on authentication failure or exceptions.
  11. Use a least-privileged Odoo integration account and rotate any credential that may already have been sent to an untrusted endpoint.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (6)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Ce fichier markdown présente des usages tels que créer un partenaire, mettre à jour des coordonnées et supprimer des partenaires de test, mais n’avertit pas explicitement que ces actions modifient potentiellement des données réelles et peuvent être irréversibles. Pour un skill capable d’opérations génériques sur Odoo, une mise en garde visible sur les effets de bord sur les données et l’usage recommandé en environnement de test est attendue.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill documents generic unlink delete operations on arbitrary Odoo models without requiring confirmation, warning about irreversibility, or suggesting safeguards such as dry-run identification first. In a business ERP context, this can lead an agent to delete production records based on ambiguous prompts or user mistakes, causing data loss and operational disruption.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The res.partner deletion example shows direct deletion of a partner record with no warning, confirmation pattern, or recommendation to verify the record first. Because partner records are central to Odoo workflows and can be linked to invoices, sales, and communications, unsafe deletion guidance increases the chance of accidental or harmful business data removal.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

Le contenu, les exemples d’intention utilisateur et les instructions sont entièrement en français, sans mention d’une option de langue ni justification explicite d’un périmètre francophone. Cela peut constituer une contrainte de langue implicite pour les utilisateurs si la politique organisationnelle exige un choix ou un opt-in de locale.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

Le document explique la configuration des identifiants Odoo et l’exécution d’appels vers une instance Odoo distante via XML-RPC, mais ne prévient pas explicitement l’utilisateur que les requêtes et les données métier consultées ou modifiées seront transmises à un système externe. Même si l’intégration réseau est au cœur du skill, un avertissement de confidentialité et de portée des données reste pertinent dans la documentation markdown.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill's user example prompts and interaction examples are written in French, which indicates a language-specific interaction pattern without documenting user opt-in or language alternatives. Under the policy rule, a skill should not implicitly force a specific language or locale unless that constraint is explicit and justified.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.