Back to skill

Security audit

Agency Agents 1.0.2

Security checks for vulnerabilities and agentic risk

Overview

This is mostly a disclosed multi-agent prompt skill, but its manual install path and saved-output behavior create review-worthy persistence and provenance risks.

Install through ClawHub rather than the documented manual GitHub clone path. Review or replace the backend deployment examples before using them, especially database credentials, Kafka transport security, and image pinning. Treat outputs saved under ~/clawd/agency-agents as retained local data and avoid sending secrets or regulated information unless you have checked storage and cleanup behavior.

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

T09 · Insecure Skill Coding Practices

Warning
Location
agents/engineering/backend-architect.md:211
Finding
Hardcoded Trivial Database Credentials in Deployment Template## Vulnerability Details **File Location**: `agents/engineering/backend-architect.md`, lines 211-237 **Vulnerability Type**: Hardcoded credentials in deployable configuration **Risk Level**: Medium ### Vulnerable Code ```yaml auth-service: build: ./auth-service ports: - "3001:3001" environment: - DATABASE_URL=postgresql://user:pass@postgres:5432/auth - JWT_SECRET=${JWT_SECRET} - REDIS_URL=redis://redis:6379 product-service: build: ./product-service ports: - "3002:3002" environment: - DATABASE_URL=postgresql://user:pass@postgres:5432/products - ELASTICSEARCH_URL=http://elasticsearch:9200 order-service: build: ./order-service ports: - "3003:3003" environment: - DATABASE_URL=postgresql://user:pass@postgres:5432/orders - KAFKA_BROKERS=kafka:9092 postgres: image: postgres:15-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=pass ``` ### Technical Analysis The backend agent provides a directly reusable Docker Compose template containing the fixed database username `user` and password `pass`. The same credentials are embedded in three service connection strings and in the PostgreSQL server configuration. Because this is presented as a technical deliverable rather than explicitly restricted pseudocode, users may copy the configuration into development, staging, or production deployments. A predictable credential offers no meaningful resistance if PostgreSQL becomes externally reachable, if another container on the network is compromised, or if the configuration is disclosed through logs, source control, deployment dashboards, or process environment inspection. Environment variables do not protect a secret when the secret is hardcoded directly into the configuration. Reusing the same account across multiple databases also broadens the effect of creden ...[truncated 1283 chars]
Remediation
## Remediation Suggestions - Remove all literal database passwords and connection strings containing credentials. - Require secrets through fail-closed variable expansion, for example: ```yaml environment: POSTGRES_USER: ${POSTGRES_USER:?POSTGRES_USER is required} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} ``` - Construct application connection strings from secret-injected values rather than committing complete credential-bearing URLs. - Generate high-entropy, unique credentials for each environment and service. - Use Docker secrets, Kubernetes Secrets with an external secret manager, or a managed secret service instead of plaintext Compose variables in production. - Assign separate least-privilege database roles to the authentication, product, and order services. - Explicitly label local examples as non-production templates and prevent startup when required secrets are missing. - Add secret scanning and configuration linting to generated-project quality checks.

T08 · Insecure Dependencies

Warning
Location
agents/engineering/backend-architect.md:245
Finding
Mutable Kafka Container Image Without Version or Digest Pinning## Vulnerability Details **File Location**: `agents/engineering/backend-architect.md`, line 245 **Vulnerability Type**: Mutable third-party container dependency **Risk Level**: Medium ### Vulnerable Code ```yaml kafka: image: confluentinc/cp-kafka:latest environment: - KAFKA_BROKER_ID=1 - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 ``` ### Technical Analysis The `latest` tag is mutable. It can resolve to different image contents at different times even when the project configuration remains unchanged. Consequently, the effective third-party component executed by the generated deployment is not the component reviewed when the Skill was audited. If the publisher account, registry, release process, or tag is compromised, a later pull can retrieve attacker-controlled image content. Even without malicious compromise, an incompatible update can unexpectedly change behavior or security characteristics. The absence of digest pinning also prevents reliable verification that all environments execute identical image bytes. ### Attack Path 1. A user adopts the supplied Compose configuration. 2. The deployment pulls `confluentinc/cp-kafka:latest`. 3. The registry tag later moves to a different image, whether through routine publication or supply-chain compromise. 4. A rebuild, deployment, or explicit image pull downloads the changed image. 5. The container runs with the network, volume, environment, and other permissions granted to the Kafka service. 6. If the replacement image is malicious, it can access resources available from the container and communicate through permitted network paths. Malicious exploitation is conditional on compromise or unauthorized replacement of the upstream image or publishing channel; the confirmed weakness is that the configuration does not cryptographically bind the dependency to reviewed content. ### Impact Assessment Imp ...[truncated 391 chars]
Remediation
## Remediation Suggestions - Replace `latest` with a tested, explicit release version. - For reproducible and tamper-resistant deployments, pin the image by digest: ```yaml image: confluentinc/cp-kafka@sha256:REVIEWED_DIGEST ``` - Maintain a controlled update process that verifies image provenance, signatures, vulnerability scan results, release notes, and compatibility before changing the digest. - Configure automated dependency monitoring to propose reviewed upgrades rather than silently consuming tag changes. - Prefer registries and images that support signed provenance, and enforce signature verification in the deployment environment where available. - Run the container as a non-root user with read-only filesystems, restricted Linux capabilities, limited network access, and no host runtime socket.

T08 · Insecure Dependencies

Warning
Location
README.md:108
Finding
Manual Installation Uses an Unverified Placeholder Repository## Vulnerability Details **File Location**: `README.md`, lines 108-110 **Additional Location**: `docs/QUICKSTART.md`, lines 21-26 **Vulnerability Type**: Unsafe and unverified installation source **Risk Level**: Medium ### Vulnerable Code ```bash # Or install manually git clone https://github.com/your-repo/agency-agents-openclaw.git cp -r agency-agents-openclaw ~/.openclaw/skills/ ``` The quick-start guide repeats the same installation source: ```bash # Clone repository git clone https://github.com/your-repo/agency-agents-openclaw.git # Copy to the Skill directory cp -r agency-agents-openclaw ~/.openclaw/skills/ ``` ### Technical Analysis The manual installation procedure references the placeholder namespace `your-repo` instead of a verified repository controlled by the declared publisher. It also does not pin a release tag or commit and provides no checksum or signature. Copying the resulting repository into `~/.openclaw/skills/` installs its contents into a persistent Skill discovery location. If the placeholder URL is replaced, redirected, or made valid under ownership unrelated to the package publisher, users could install unreviewed prompt instructions or other Skill components. Even if a legitimate repository is eventually substituted, cloning its default branch means installation content can change after audit without a corresponding version constraint. ### Attack Path 1. A user follows the documented manual installation procedure. 2. The user clones whatever content the placeholder URL resolves to at that time. 3. No tag, commit, signature, or checksum is checked. 4. The user copies the downloaded content into `~/.openclaw/skills/`. 5. OpenClaw discovers and loads the installed Skill in later sessions. 6. If the repository contains attacker-controlled Skill instructions or components, those contents can influence subsequent agent behavior within the permissions available to OpenClaw. Th ...[truncated 813 chars]
Remediation
## Remediation Suggestions - Replace the placeholder with the publisher’s verified canonical repository. - Pin manual installation to a reviewed release tag or immutable commit rather than the default branch. - Publish SHA-256 checksums or signed release manifests and instruct users to verify them before installation. - Use signed Git tags or artifact signatures tied to a documented publisher identity. - Ensure the repository URL, package owner, `_meta.json` owner, and documentation consistently identify the same publisher. - Prefer installation through a registry that verifies artifact integrity and publisher ownership. - Update both `README.md` and `docs/QUICKSTART.md` so no unsafe fallback remains. - Add a warning that users must inspect downloaded Skill files before copying them into the persistent OpenClaw Skill directory.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (15)

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
This markdown file presents the skill/project summary entirely in Chinese from the title onward, with no indication that users may choose another language or that the skill is intentionally limited to a Chinese-speaking audience. Under the policy, forcing a specific language without opt-in is a natural-language locale violation.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The entire skill README is written in Chinese, including product description, usage guidance, pricing, and support information, with no indication that other languages are available or that Chinese is an optional locale. Under the policy criteria, this is a language/locale constraint presented without user opt-in or documented regional justification.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The manifest description and the entire user-facing documentation are written in Chinese, with no indication that other languages are supported or that Chinese is optional. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly justified.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The file’s description, headings, instructions, templates, and examples are predominantly written in Chinese, which effectively imposes a specific language for interaction. There is no indication that users may choose another language, nor any documented reason that this skill must be Chinese-only.

External Transmission

Medium
Category
Data Exfiltration
Content
description: 电商平台 API

servers:
  - url: https://api.example.com/v1

paths:
  /products:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Intent-Code Divergence

Medium
Confidence
93% confidence
Finding
The skill explicitly emphasizes 'security first' but its docker-compose example includes weak/default credentials (for example POSTGRES_USER=user and POSTGRES_PASSWORD=pass) and an insecure Kafka PLAINTEXT listener. Even as sample content, these patterns are commonly copied into real deployments, which can lead to unauthorized access, credential reuse, interception of service traffic, and weakened overall security posture.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The manifest description and the entire skill content present the role and instructions exclusively in Chinese, indicating a fixed language/locale expectation. Under the policy, forcing a specific language without an explicit user choice or opt-in is a natural-language policy violation.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
This markdown skill mandates a single language in its natural-language description and instructions, with no opt-in or alternative language option for users. The policy for this audit flags language or locale constraints when they are imposed without user choice or explicit justification.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The description and nearly all instructional content are written in Chinese, and the file does not state that other languages are supported or that Chinese is optional. Under the language/locale policy, a skill should not impose a specific language unless the user opts in or the regional constraint is explicitly justified.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The skill is written entirely in Chinese and does not provide any mechanism to respect the user's preferred language or document a legitimate locale restriction. In a multi-agent environment, this can cause user misunderstanding, reduce reviewer visibility, and lead to incorrect approvals or missed risks when operators cannot reliably interpret quality-gate decisions.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The file presents all guidance and examples exclusively in Chinese, which can amount to a language policy violation when no user choice, alternative locale, or justification is provided. The content does not indicate that the skill is region-specific or that other language documentation is available.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The quickstart guides users through using the skill but does not warn early and clearly that agent outputs are automatically persisted to the workspace. Because users may submit proprietary code, credentials, business plans, or personal data in prompts, silent auto-saving increases the chance of unintended local data retention and later disclosure through backups, shared machines, or repository commits.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The skill defaults entirely to Chinese without offering language negotiation or a documented locale restriction. This can lead to misunderstanding of instructions, QA criteria, or status outputs, which in an orchestrator is operationally risky because errors can propagate across multiple delegated agents and reduce the effectiveness of human oversight.

Vague Triggers

Medium
Confidence
89% confidence
Finding
The orchestrator is positioned as a general-purpose entry point for broad project execution, with examples spanning software development and marketing. Without clear activation boundaries, it can preempt more specialized skills and cause over-broad delegation, increasing the chance of inappropriate tool/agent use, missed safeguards, or routing sensitive requests through a less constrained workflow.

Natural-Language Policy Violations

Medium
Confidence
87% confidence
Finding
The package description is written in Chinese, and the manifest repeatedly uses Chinese-only descriptive text for the skill and pricing metadata. In this manifest there is no indication that language choice is optional or that the skill is intentionally limited to a Chinese-speaking or China-specific context, which can violate a language/locale policy requiring user opt-in or clear justification.

Static analysis

No suspicious patterns detected.