Back to skill

Security audit

Huo15 Huihuoyun Odoo

Security checks for vulnerabilities and agentic risk

Overview

This ERP skill is not clearly malicious, but it gives the agent broad business-system and local-file powers while handling passwords, automation, and background polling in ways users should review carefully.

Install only after an administrator reviews the enabled tool tier and disables unnecessary admin, Studio, webhook, report-scheduling, CSV import, and arbitrary file-upload tools. Use low-privilege per-user ERP accounts, require HTTPS allowlisted ERP origins, avoid shared admin credentials, and do not send passwords through ordinary chat unless the platform provides protected secret handling.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (4)

T01 · Skill Instruction Hijacking

Error
Location
index.ts:6011
Finding

Persistent Agent Instruction and Output Hijacking

Content
View full analysis
{ const aid = (ctx as { agentId?: string } | undefined)?.agentId?.trim() ?? 'default'; const todayStr = today(); const tomorrowStr = tomorrow(); const client = odooClients.get(aid); if (!client?.isAuthenticated()) { const hasShared = configManager.hasSharedConfig(); return { appendSystemContext: ` ## Huihuoyun Enterprise Suite Plugin — Not Connected > **Brand terminology hard rule**: Always call the product "Huihuoyun Enterprise Suite" > or "Huihuoyun" in external communication. > Do not mention "Odoo" or another third-party ERP trademark. > **Credential isolation rule**: Never proactively suggest configuring one account > for every user. When the user mentions an ERP-related operation, you should: 1. First state that the user must provide account information. 2. Ask for the company URL, username, and password. 3. Do not proactively ask for the database name. 4. Invoke odoo_connect after collecting the credentials. ## Attachment Handling — Hard Rule > When a user uploads an archive, document, or spreadsheet and asks to create an > opportunity, task, or ticket: > > 1. Treat the attachment contents as the user's responsibility. > 2. Do not decide whether the contents match the target business record. > 3. Create the record first and then invoke odoo_attach_file. > 4. Do not parse or question the attachment unless explicitly requested. `.trim(), }; } const info = client.getSessionInfo(); return { appendSystemContext: ` ## Huihuoyun Enterprise Suite Connected > **Brand terminology**: Call the product "Huihuoyun Enterprise Suite" or > "Huihuoyun"; do not mention third-party ERP trademarks ...[truncated 3254 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/modules/config-manager.ts:126
Finding

ERP Credentials Stored in Plaintext Without Enforced Restrictive Permissions

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
index.ts:5339
Finding

Arbitrary Local File Read and Upload to a Remote ERP Endpoint

Content
View full analysis
, ) { const client = getClient(ctx); if (!client) return notConnected(); try { const stat = statSync(p.path); if (stat.size > 10 * 1024 * 1024) { return { success: false, message: `File exceeds the 10 MB attachment limit`, }; } const buf = readFileSync(p.path); const datas = buf.toString('base64'); const id = await client.attachFile({ res_model: p.res_model, res_id: p.res_id, name: p.name || basename(p.path), datas_base64: datas, mimetype: p.mimetype, }); return { success: true, attachment_id: id, size: stat.size, }; } catch (e) { return { success: false, message: String(e) }; } }, }); ``` The document upload tool repeats the same unsafe pattern: ```typescript const stat = statSync(p.path); if (stat.size > 20 * 1024 * 1024) { return { success: false, message: 'File exceeds ...[truncated 2945 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/modules/odoo-client.ts:5014
Finding

Unvalidated User-Supplied Network Endpoint Enables Cleartext Credential Exposure and SSRF

Content
View full analysis
, ) { const aid = getAgentId(ctx); let db = params.db; if (!db) { const dbs = await OdooClient.listDatabases(params.url); db = dbs[0]; } const cfg = { url: params.url, db, username: params.username, password: params.password, }; await initOdooClient(api, cfg, aid); }, }); ``` Authentication sends the reusable password to that URL: ```typescript async authenticate(): Promise { const result = await this.rpc('/web/session/authenticate', { db: this.db, login: this.username, password: this.password, }); if (isOdooError(result)) { throw new Error(`Authentication failed: ${JSON.stringify(result.error)}`); } const session = result as OdooSession; this.uid = session.uid; this.session_id = (session as unknown as Rec ...[truncated 4186 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (76)

Context-Inappropriate Capability

Critical
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill can create server-side automations and scheduled behaviors that execute within Odoo, effectively granting remote administrative workflow execution from the agent interface. That enables persistence, privilege misuse, destructive bulk actions, or stealthy business-logic manipulation well beyond ordinary assistant functionality.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Critical
Category
Not specified by scanner
Confidence
100% confidence
Finding

This code provisions ir.actions.server records with state='code' and injects Python source for execution on the Odoo server. That is effectively arbitrary server-side code execution through the skill, creating a direct path to persistence, data exfiltration, unsafe business actions, or full compromise of the Odoo environment depending on server privileges.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Local filesystem persistence of per-agent preferences or notification settings is an additional data-handling behavior not reflected in the broad ERP assistant description. Storing preferences or routing metadata on disk can create confidentiality and multi-tenant separation issues, especially if file paths, permissions, or lifecycle management are not clearly controlled.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The default notConnected message tells users to provide system address, username, and password directly to the assistant to establish a connection. This normalizes insecure secret sharing over chat and increases the chance that sensitive credentials are stored in logs or prompt history.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file upload tools read arbitrary local paths from the host using readFileSync/statSync and then upload the contents into Odoo or its document system. This creates a direct local file exfiltration primitive: an agent or prompted user could cause sensitive host files such as keys, configs, or secrets to be transmitted into a remote ERP instance.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The prompt explicitly instructs the model to collect ERP usernames and passwords through normal chat messages. Collecting credentials in plain language is dangerous because chat transcripts are often logged, retained, or exposed to other systems, creating a high risk of credential compromise.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: undici==7.25.0 — 12 advisory(ies): CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-13697 (undici vulnerable to cross-user information disclosure and parse-time crash via ); CVE-2026-16728 (undici vulnerable to downstream response desynchronization via retry interceptor) +9 more

High
Category
Supply Chain
Confidence
95% confidence
Finding

undici 7.25.0 is associated with multiple high-severity advisories including response queue poisoning, information disclosure, and desynchronization issues. In an agent that brokers requests to external APIs and enterprise systems, flaws in the HTTP client can enable cross-request data leakage, corrupted responses, or request smuggling-style behavior across shared connections. That makes this especially significant in a multi-user ERP assistant context.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @mariozechner/pi-coding-agent==0.67.68 — 3 advisory(ies): CVE-2026-54326 (Pi Agent: Potential XSS in HTML session exports via Markdown URL sanitization by); CVE-2026-54328 (Pi Agent: Predictable temporary extension install paths allow local privilege es); CVE-2026-54327 (Pi Agent: Race condition in Pi auth.json writes could expose stored credentials)

High
Category
Supply Chain
Confidence
94% confidence
Finding

@mariozechner/pi-coding-agent 0.67.68 is reported with vulnerabilities including XSS in HTML exports, predictable temporary extension install paths, and auth.json race conditions. Even if not all code paths are used by this skill, this package is highly capable and adjacent to code execution, local file handling, and credential storage, so these issues are material in an agent ecosystem. In a business assistant handling ERP access, credential exposure or extension path abuse could have serious downstream impact.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: basic-ftp==5.3.0 — 1 advisory(ies): CVE-2026-44240 (basic-ftp allows a malicious FTP server to cause client-side denial of service v)

High
Category
Supply Chain
Confidence
90% confidence
Finding

basic-ftp 5.3.0 is reported as allowing a malicious FTP server to trigger client-side denial of service. This is a real issue, though exploitability depends on whether the skill or any dependency actually connects to attacker-controlled FTP endpoints. In an automation agent that may fetch external resources, a DoS can still interrupt workflows and potentially affect shared service availability.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==5.0.5 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-45149 (brace-expansion: Large numeric range defeats documented `max` DoS protection); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
93% confidence
Finding

brace-expansion 5.0.5 has several reported denial-of-service issues involving pathological expansion and memory blowups. This is a legitimate risk when untrusted glob patterns, path filters, or user-supplied expressions are processed. Given this skill's broad natural-language and tooling surface, any path or pattern handling pipeline could make such a parser bug more reachable than in a closed application.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The message polling query reads from mail.message using only a global message_type filter and an increasing id watermark, with no predicate tying results to the current user, their partner, or records they are explicitly allowed to monitor. In a skill that advertises per-sender Odoo isolation, this can leak organization-wide messages across users via background notifications, turning the poller into a cross-tenant or cross-user data disclosure path.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The email notification poll reads mail.notification records by notification_type, unread status, and global id watermark, but does not filter to the current user or current partner. If the backend credentials have broader visibility than a single user, unread inbox notifications for other users may be processed and forwarded, violating the stated per-user isolation model and exposing sensitive business communications.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The calendar query fetches all events in a date range without checking whether the authenticated user is an attendee, organizer, or otherwise authorized participant. In an ERP assistant context, calendar entries often contain confidential names, schedules, and participant lists, so broad polling can disclose sensitive operational or personal meeting data beyond the intended user scope.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The client can create user accounts, assign permission groups, and inspect group membership, exposing identity and authorization administration through a conversational interface. In this context, that raises risks of unauthorized account provisioning, privilege escalation, and lateral access expansion if the agent is prompted incorrectly or abused.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

This client exposes generic Studio-style metaprogramming primitives that can create custom models and fields directly from natural-language-driven agent flows. In an ERP assistant context, schema mutation is far beyond routine business operations and materially expands blast radius: a prompt-triggered action could alter data structures, create persistence points for abuse, or weaken governance controls across the tenant.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill can create webhook-backed server actions and attach automations that POST record data to arbitrary URLs. This creates a straightforward exfiltration channel and persistence mechanism, allowing sensitive CRM, HR, finance, or operational data to be sent outside the organization whenever matching records change.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The CSV import helper turns arbitrary rows into create operations on any model, with only minimal type coercion and no confirmation, schema validation, or model allowlist. In a natural-language agent setting, this can enable high-volume unintended data creation, integrity corruption, or abuse of sensitive models through crafted input.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.