Back to skill

Security audit

EvidenceOps - Forensic Evidence Management

Security checks for vulnerabilities and agentic risk

Overview

The skill fits an evidence-vault purpose, but its implementation overclaims security protections and can expose sensitive files or case data without enough enforced access control.

Review before installing. Use only in a tightly controlled environment with a dedicated staging directory, least-privilege OS account, restricted vault and S3 permissions, explicit per-case authorization, and clear user consent for evidence and metadata retention. Do not rely on its current immutable-storage, redaction, pairing, or channel-control claims for legal-grade evidence without fixing and independently validating those controls.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (5)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
plugin-evidence-vault/src/tools/index.ts:115
Finding

Caller-Controlled Source Path Enables Arbitrary Local File Ingestion and S3 Upload

Content
View full analysis
{ this.validateChannel(params.channel); try { const stats = await fs.stat(params.filePath); const mimeType = this.detectMimeType(params.filePath, params.filename); const input: IngestInput = { filePath: params.filePath, filename: params.filename, mimeType, size: stats.size, caseId: params.caseId, sourceContext: { channel: params.channel ?? 'unknown', sender: params.sender ?? 'unknown', messageId: params.messageId, sessionId: params.sessionId, }, retentionPolicy: params.retentionDays ? { retentionDays: params.retentionDays, legalHold: false, deleteAfter: new Date( Date.now() + params.retentionDays * 24 * 60 * 60 * 1000 ).toISOString(), } : undefined, metadata: params.metadata, }; return this.driver.ingest(input); } catch (error) { ``` ```ts // plugin-evidence-vault/src/drivers/filesystem.ts:193-202 const sha256 = await hashFile(input.filePath); await fs.copyFile(input.filePath, targetPath); try { await fs.chmod(targetPath, 0o444); } catch { // Ignore chmod errors on Windows } ``` ```ts // plugin-evidence-vault/src/drivers/s3.ts:228-244 const sha256 = await hashFile(input.filePath); const fileContent = await fs.readFile(input.filePath); const s3Key = this.getS3Key(sanitizedCaseId, `originals/${storedFilename}`); await this.s3Client.send( new PutObjectCommand({ Bucket: this.s3Config.bucket, ...[truncated 2485 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
plugin-evidence-vault/src/tools/index.ts:67
Finding

Pairing and Per-Case Authorization Controls Are Not Enforced

Content
View full analysis
0 && !this.channelAllowlist.includes(channel)) { throw createVaultError( VAULT_ERRORS.CHANNEL_BLOCKED, `Channel ${channel} is not in allowlist` ); } } ``` ```ts // plugin-evidence-vault/src/tools/index.ts:155-169 async verify(params: VerifyParams): Promise { return this.driver.verify(params.evidenceId, params.caseId); } async manifest(params: ManifestParams): Promise<{ success: boolean; manifest?: CaseManifest; error?: { code: string; message: string } }> { return this.driver.getManifest(params.caseId); } async export(params: ExportParams): Promise { return this.driver.export(params.caseId, params.format); } async accessLog(params: AccessLogParams): Promise { return this.driver.getAccessLog(params.caseId, params.limit); } ``` ### Technical Analysis The constructor records `requirePairing`, but no method checks it. Therefore, enabling the option does no ...[truncated 1673 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
plugin-evidence-vault/src/drivers/filesystem.ts:218
Finding

Sensitive Source Data and Arbitrary Metadata Are Stored Unredacted in Manifests

Content
View full analysis
{ const s3Key = this.getS3Key(caseId, 'manifest.json'); const content = JSON.stringify(manifest, null, 2); await this.s3Client.send( new PutObjectCommand({ Bucket: this.s3Config.bucket, Key: s3Key, Body: content, ContentType: 'application/json', Metadata: { 'case-id': caseId, 'schema-version': SCHEMA_VERSION, 'updated-at': manifest.updatedAt, }, }) ); } ``` ### Technical Analysis The plugin applies recursive redaction to selected audit-log details, but it does not apply redaction before adding `sourceContext` and arbitrary `metadata` to the case manifest. The manifest is serialized in plaintext to the local filesystem and is also uploaded in plaintext through the S3 driver. The affected values can include sender email addresses, phone numbers, message i ...[truncated 1280 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
plugin-evidence-vault/src/drivers/filesystem.ts:199
Finding

Advertised Immutable and Tamper-Evident Evidence Storage Is Not Enforced

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
.github/workflows/security.yml:19
Finding

Security Workflow Executes Mutable and Runtime-Resolved Third-Party Components

Content
View full analysis
- p/security-audit p/secrets p/owasp-top-ten p/typescript continue-on-error: true ``` ### Technical Analysis The workflow references TruffleHog through the mutable `main` branch and Semgrep through a mutable major-version tag. These references can resolve to different code after repository review. The workflow also uses `npx` and performs a runtime `npm install`, allowing registry state at execution time to determine which code runs. The TruffleHog invocation uses `--only-verified`. Verification typically requires contacting the service associated with a detected credential to determine whether the credential is active. As a result, detected credential material may be used in outbound authentication requests. This behavior explains the pre-scan network-transfer signal. It may be intentional for secret scanning, but it is not necessary for offline secret detection and should be explicitly risk-approved. No explicit ...[truncated 1468 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (50)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .gitignore (reported line 25)May include surrounding context.

text
Thumbs.db

# Environment
.env
.env.local
.env.*.local

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .gitignore (reported line 26)May include surrounding context.

text
# Environment
.env
.env.local
.env.*.local

# Logs

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .gitignore (reported line 46)May include surrounding context.

text
# Sensitive files
*.pem
*.key
credentials.json
secrets.json

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .gitignore (reported line 47)May include surrounding context.

text
*.pem
*.key
credentials.json
secrets.json

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The declared description describes operational forensic evidence-processing capabilities. The actual code chunk contains only development/testing configuration for Jest and ts-jest. This is unrelated infrastructure code and does not itself perform the claimed forensic functions or interact with media/documents. Based on this chunk alone, the description does not accurately represent the code’s actual behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The supplied code does not implement forensic media triage or evidence-handling features. Instead, it provides generic redaction helpers that scan strings and objects for sensitive patterns and replace them with '[REDACTED]'. It can redact fields in parsed JSON and create filtered/redacted object copies. There is no handling of images, videos, audio, PDFs, or documents as forensic artifacts, and no functionality related to chain of custody, hashing/integrity verification, evidence logging, or audit trails. This is a materially different primary purpose, so the description does not accurately represent the code chunk.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · docs/DESIGN.md (reported line 282)May include surrounding context.

md
});
    
    it('should sanitize dangerous characters', () => {
      expect(sanitizeFilename('../../../etc/passwd')).not.toContain('..');
      expect(sanitizeFilename('file<>:"|?.txt')).not.toMatch(/[<>:"|?]/);
    });

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · plugin-evidence-vault/tests/driver.test.ts (reported line 53)May include surrounding context.

ts
});
    
    it('should sanitize dangerous characters', () => {
      expect(sanitizeFilename('../../../etc/passwd')).not.toContain('..');
      expect(sanitizeFilename('file<>:"|?.txt')).not.toMatch(/[<>:"|?]/);
    });

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · plugin-evidence-vault/tests/driver.test.ts (reported line 78)May include surrounding context.

ts
});
    
    it('should sanitize dangerous characters', () => {
      expect(sanitizeFilename('../../../etc/passwd')).not.toContain('..');
      expect(sanitizeFilename('file<>:"|?.txt')).not.toMatch(/[<>:"|?]/);
    });

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · plugin-evidence-vault/tests/driver.test.ts (reported line 83)May include surrounding context.

ts
});
    
    it('should sanitize dangerous characters', () => {
      expect(sanitizeFilename('../../../etc/passwd')).not.toContain('..');
      expect(sanitizeFilename('file<>:"|?.txt')).not.toMatch(/[<>:"|?]/);
    });

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · CHANGELOG.md (reported line 43)May include surrounding context.

md
- `FilesystemDriver` - Local filesystem storage with:
    - Append-only storage mode
    - Hash chain for manifest integrity
    - Read-only original files (chmod 444)
    - JSONL audit logging with redaction
  - `S3Driver` - S3/MinIO backend with:
    - Object Lock support (when available)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The changelog states the skill teaches agents to accept media from any channel, which weakens the otherwise security-focused posture described elsewhere and omits a clear warning about privacy, provenance, and untrusted-content risks. In a forensic evidence-handling context, broad channel acceptance increases the chance of ingesting sensitive or malicious material without appropriate user consent, chain-of-custody controls, or transport restrictions.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares powerful capabilities including Bash, Read, and Write, but does not define an explicit tool scope such as allowed-tools or permissions. In a security-sensitive forensic workflow, this creates unnecessary ambiguity and increases the risk that the agent could use shell access in ways not clearly constrained by policy, including mishandling evidence or accessing unrelated files.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill handles highly sensitive evidence and explicitly captures source channel, sender identifiers, message IDs, EXIF, and other metadata, but it does not present a prominent user-facing warning at the point of collection about the privacy and legal sensitivity of this data. In forensic contexts, users may unknowingly submit personal or regulated information, creating privacy, compliance, and consent risks if collection and retention are not clearly disclosed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

This markdown file documents evidence_exported and retention_applied behaviors, which can affect user data confidentiality and data lifecycle, but it does not include any warning or caution to users/operators about those impacts. Under the markdown-file criteria for missing user warnings, descriptions of privacy- or integrity-impacting behaviors should disclose those risks.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
85% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · examples/config/openclaw.example.yaml (reported line 83)May include surrounding context.

yaml
security:
  execApproval:
    enabled: true
    mode: ask  # ask, auto-approve, auto-deny

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code sets an appendOnly flag and presents evidence-grade chain-of-custody semantics, but it rewrites manifest and index files in place via writeFile. In a forensic evidence context, mutable metadata undermines tamper resistance: an attacker or insider who can invoke update paths can alter case state, evidence records, or chain-of-custody history without true append-only guarantees.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The manifest frames this skill as forensic media triage with chain of custody and integrity verification. This code also creates portable export bundles containing originals, derivatives, and manifests, which is a broader evidence dissemination capability rather than a necessary implementation detail of triage.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code sends the contents of input.filePath and associated metadata to an S3 bucket, which is a network transmission of potentially sensitive evidence data. While the operation is core functionality, this file contains no user-facing disclosure, confirmation, or explanatory comment warning that local evidence will be transmitted to remote object storage.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The S3-backed driver's export path delegates only to the local cache, so exports may be produced from stale, incomplete, or locally tampered data rather than the authoritative S3 evidence store. In an evidence-handling system, this breaks integrity and chain-of-custody assumptions and can yield non-forensic-grade exports.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

Audit writes and access-log retrieval are handled only through the local cache, meaning custody records are not durably stored in the S3 vault and can be lost, altered, or diverge across hosts. For forensic tooling, non-authoritative audit trails undermine accountability and admissibility even if evidence objects themselves remain intact.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The ingest method collects a local file path plus source-context metadata such as sender and message identifiers, then passes them to the configured vault driver for storage. This is a safety-relevant data handling operation, and this code includes no confirmation prompt, user-facing disclosure, or warning string about uploading or storing potentially sensitive evidence.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
79% confidence
Finding

The export method triggers creation of a ZIP or TAR archive for an evidence case, which is a potentially sensitive data-disclosure operation. In this file there is no confirmation, warning, or user-facing notice that exporting bundles case evidence into a retrievable archive.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill handles forensic evidence, extracts metadata such as EXIF/GPS, and specifies long default retention periods, but the user-facing workflow does not prominently warn that highly sensitive personal data may be collected, preserved, and retained for years. In a forensics context this omission can lead to uninformed submission of personal or third-party data, creating privacy, legal, and compliance risk even if the underlying storage and audit controls are well designed.

Content

No source excerpt is available for this finding.