Back to skill

Security audit

huawei-cloud-cloudrobo-inference-adapter

Security checks for vulnerabilities and agentic risk

Overview

This skill needs review because its test client can disclose images outside the chosen folder, and its server has avoidable exposure and resource-exhaustion risks.

Use only in an isolated test environment until these issues are addressed. Constrain image paths to the selected directory, validate camera names, and verify the server certificate before sending real images. Restrict server access, enforce finite message and array limits, and return sanitized errors. The review covered every bundled file; user-supplied model code and actual deployment protections remain unverified.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/test_client.py
Finding

Server-controlled image keys escape the selected image directory and disclose local images

Content
View full analysis

Impact

Readable JPEG or PNG images outside the authorized directory can be disclosed as resized RGB pixels. This does not establish arbitrary non-image file disclosure.

T09 · Insecure Skill Coding Practices

Warning
Location
references/server_template.py
Finding

Unauthenticated network clients can exhaust server memory through unlimited WebSocket messages

Content
View full analysis

Impact

Oversized messages can exhaust process memory and interrupt inference service for legitimate clients. Malformed observations need not pass model validation because buffering occurs first.

Vulnerability Patterns
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (4)

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: env, file_read, network.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

The workflow requires sending full tracebacks to clients without warning about disclosure of internal system information.

Medium
Category
Output Handling
Confidence
98% confidence
Finding

The skill mandates returning full exception tracebacks to remote clients, which can disclose filesystem paths, implementation details, and sensitive values included in exception messages. Malformed inference requests can trigger these disclosures; making this behavior a reusable protocol requirement spreads the weakness beyond local debugging.

Content

No source excerpt is available for this finding.

The server workflow disables message-size limits without warning about resource-exhaustion risks.

Medium
Category
Output Handling
Confidence
98% confidence
Finding

Setting max_size=None removes the WebSocket message-size ceiling, allowing a reachable client to submit oversized payloads that exhaust memory or processing capacity. Large image arrays justify a higher limit, not unlimited input, and copying this setting into inference deployments can disrupt an expensive shared service.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · scripts/verify_adapter.py (reported line 43)May include surrounding context.

python
f"class '{class_name}' not found in {adapter_path}. "
            f"available: {[k for k in dir(mod) if not k.startswith('_')]}"
        )
    return getattr(mod, class_name)


def verify_obs_conversion(adapter_class, constructor_kwargs=None,