Back to skill

Security audit

Senior Backend

Security checks for vulnerabilities and agentic risk

Overview

The skill is a backend-development guide, but several examples could lead agents to generate insecure production code that mishandles passwords, rate limits, or database migration tooling.

Review this skill before installing for production backend work. Its guidance is coherent and not malicious, but users should correct the password persistence/response examples, avoid raw X-Forwarded-For based rate limits, and replace unpinned npx commands with lockfile-pinned local tooling before letting an agent apply these patterns.

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

Error
Location
SKILL.md:78
Finding

Credential fields may cross the persistence boundary and be exposed in API responses

Content
View full analysis
; ``` ```typescript export class UserService { constructor(private db: Database) {} async create(input: CreateUserInput): Promise { const existing = await this.db.findUserByEmail(input.email); if (existing) throw new ConflictError('Email already registered'); const passwordHash = await hash(input.password); return this.db.createUser({ ...input, passwordHash }); } } ``` ```typescript app.post('/api/users', async (c) => { const body = createUserSchema.parse(await c.req.json()); const user = await userService.create(body); return c.json(user, 201); }); ``` ```typescript app.get('/api/me', authenticate, async (c) => { const user = await userService.getById(c.get('userId')); return c.json(user); }); ``` ### Technical Analysis The validated `CreateUserInput` contains the user's plaintext `password`. The service hashes that password, but then uses `{ ...input, passwordHash }` when calling the database layer. Consequently, both `password` and `passwordHash` cross the persistence boundary. Whether the plaintext password is ultimately stored depends on the database implementation, but the pattern unnecessarily exposes it to ORM hooks, query logging, instrumentation, permissive persistence methods, and future schema changes. An implementation that accepts all supplied fields may store the plaintext password alongside its hash. The create-user and authenticated profile routes also serialize the returned `User` object directly. The documented user schema includes `pass ...[truncated 1704 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
references/backend-patterns.md:30
Finding

Rate limiting relies on an untrusted X-Forwarded-For header

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
references/database-patterns.md:8
Finding

Unpinned npx commands may download and execute mutable registry packages

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest description contains very broad trigger phrases and auto-trigger conditions covering many common backend-related terms and framework imports. This can cause the skill to activate in situations where it was not explicitly intended, increasing the chance that a high-privilege implementation skill is invoked on unrelated tasks and expands attack surface for prompt/skill routing abuse.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The documentation instructs users to run npx drizzle-kit without pinning a version, which can fetch and execute whatever package version is current at runtime. This creates a supply-chain risk: a compromised latest release, dependency confusion, or unexpected breaking change could result in execution of unreviewed code on a developer or CI machine.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The command npx drizzle-kit migrate is unpinned and may download and execute the latest matching package version at execution time. In backend and database workflows, this is especially risky because the tool often runs with access to schemas, credentials, and production-adjacent environments.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding

npx prisma migrate dev --name add_users_table executes Prisma without a pinned version, allowing runtime resolution of whatever package version is available. Because migration tooling can modify databases and may run with elevated access, executing an unpinned package increases the blast radius of a compromised or unexpected release.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding

The production-oriented command npx prisma migrate deploy is especially sensitive because it may be executed in deployment pipelines against live infrastructure. If the package version is not pinned, the environment could run newly published or malicious code with database and deployment privileges.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
84% confidence
Finding

npx tsx seed.ts is an unpinned runtime execution path that may fetch and run an arbitrary current version of tsx. Even though the text says 'dev only', seed scripts often have database write access, so an unpinned package still presents meaningful supply-chain and code-execution risk on developer machines or shared environments.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.