Back to skill

Security audit

job-application-agent

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly aligned with job-application automation, but it also enables automatic updater execution, default identity analytics, default job metadata sharing, and durable retries that need careful review before installation.

Review this skill before installing. It may be useful for structured job applications, but disable automatic updates, telemetry identity sharing, and community source sharing unless you explicitly want them. Do not grant routine-auto or continuing autonomy until you understand when it can submit applications and what data may be stored or sent externally.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (3)

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:11
Finding
Automatic Updater Execution with Persistent Package Checks<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, line 11 **Vulnerability Type**: Automatic execution of externally managed update logic and recurring package checks **Risk Level**: High ### Evidence ```markdown ## Stay current At the beginning of each workflow, run the managed updater once when `~/.agents/job-application-agent/update` (or `update.cmd` on Windows) exists and automatic updates are enabled. Treat update failures as best effort: continue with the installed skill and never let an update failure block an application. The installed background updater also checks npm at login and every hour by default. Do not modify or move candidate profile data, the canonical resume, telemetry identity, or application ledgers during an update. ``` ### Technical Analysis The skill instructs the agent to execute an updater stored outside the reviewed project whenever a workflow begins. It also describes an installed background updater that checks npm at login and every hour. The updater implementation, package identity, version constraints, integrity-verification mechanism, and update source are not included in the audited artifact. This creates a mutable execution path whose effective behavior can change after the skill has been reviewed. If the updater file, npm account, package, registry resolution, or update channel is compromised, subsequently retrieved code could execute with the permissions of the user running the agent. Login and hourly checks also provide cross-session persistence and repeated opportunities to retrieve or activate altered code. The absence of the referenced updater and dependency metadata prevents verification of signature checks, cryptographic hashes, package pinning, registry restrictions, or user confirmation. ### Attack Path 1. An attacker compromises or replaces `~/.agents/job-application-agent/update`, `update.cmd`, the associated npm package, its publisher account, or its resolution path. 2. The user begins a jo ...[truncated 931 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Remove automatic updater execution from the beginning of normal workflows. - Disable login and hourly update checks by default. - Require explicit, informed user approval before downloading or executing each update. - Pin dependencies to exact versions and a specific trusted registry. - Verify downloaded artifacts using a cryptographic signature or a trusted, pinned hash before execution. - Display the package identity, current version, proposed version, source, integrity result, and relevant changes before approval. - Execute update logic with the minimum necessary permissions and isolate it from candidate data. - Do not execute updater files merely because they exist in a user-writable location. - Include the updater implementation and dependency lockfiles in the auditable project. - Provide a rollback mechanism and retain an auditable update log. ]]>

other

Error
Location
SKILL.md:28
Finding
Default-Enabled Transmission of Candidate Name and Email<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, line 28 **Vulnerability Type**: Default-enabled external disclosure of personally identifiable information **Risk Level**: High ### Evidence ```markdown 8. Disclose default-enabled structured usage analytics and separate default-enabled name/email sharing with the maintainer through private PostHog analytics for support and product improvement. Explain `telemetry identity disable` to keep future analytics anonymous and `telemetry disable` to stop all analytics. Relay the CLI disclosure to the user before running another command; the disclosure command never sends identity. Use only the explicit saved candidate profile name/email, never names or emails scraped from conversation, résumés, job pages, or recruiter contacts. Honor an opt-out immediately. Disclose default-enabled anonymous community sharing of confirmed public job links and repeatable discovery sources, plus the independent `sources sharing disable` control. The CLI also displays these disclosures before the first eligible transmission. ``` ### Technical Analysis The skill specifies that sharing the candidate's saved profile name and email with the maintainer through PostHog is enabled by default. Disclosure and an opt-out command are provided, but affirmative consent is not required before identity sharing becomes eligible. Name and email are personally identifiable information. Default-enabled transmission violates data-minimization and privacy-by-default principles, particularly in a workflow handling sensitive employment activity. The project does not include the referenced telemetry implementation, so the audit cannot verify the actual destination, payload minimization, authentication, encryption, retention policy, access controls, or whether disabled telemetry prevents queued transmissions. Although the instruction limits identity fields to the explicitly saved candidate profile, it still permits external transmission of tho ...[truncated 1119 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Disable identity telemetry by default. - Require separate, explicit, informed opt-in before transmitting a candidate's name or email. - Do not couple identity sharing consent to operational analytics consent. - Present the exact recipient, endpoint, transmitted fields, purposes, retention period, and deletion procedure before consent. - Use an anonymous random identifier unless identity is strictly necessary. - Ensure opting out immediately cancels and deletes any queued identity-bearing events. - Provide payload preview functionality before transmission. - Enforce transport encryption, strict access controls, short retention, audit logging, and contractual controls at the analytics provider. - Include the telemetry implementation and event schemas in the reviewed project so behavior can be independently verified. ]]>

other

Error
Location
SKILL.md:28
Finding
Default External Sharing of Job and Discovery Metadata with Durable Retries<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 28, 45, and 83 **Vulnerability Type**: Automatic external metadata sharing and persistent outbound retry queue **Risk Level**: High ### Evidence ```markdown 8. Disclose default-enabled structured usage analytics and separate default-enabled name/email sharing with the maintainer through private PostHog analytics for support and product improvement. Explain `telemetry identity disable` to keep future analytics anonymous and `telemetry disable` to stop all analytics. Relay the CLI disclosure to the user before running another command; the disclosure command never sends identity. Use only the explicit saved candidate profile name/email, never names or emails scraped from conversation, résumés, job pages, or recruiter contacts. Honor an opt-out immediately. Disclose default-enabled anonymous community sharing of confirmed public job links and repeatable discovery sources, plus the independent `sources sharing disable` control. The CLI also displays these disclosures before the first eligible transmission. ``` ```markdown 2. Attribute the lead with coarse `discoverySource`, stable packaged or community `discoverySourceId` when known, and independent `applicationChannel`. Treat a one-off user link as `user-supplied`. Whenever a user or agent discovers a repeatable public board, feed, directory, or careers index that is not already listed, run `sources suggest --stdin`; the CLI contributes its sanitized metadata by default unless community sharing has been disabled. ``` ```markdown 11. Record `submitted` only after visible success confirmation, using independent `discoverySource`, `discoverySourceId`, `applicationChannel`, and `roundId` values. `ledger add` automatically shares the sanitized public job metadata and durably retries on relay failure; do not run a separate manual contribution. Record no submission when confirmation is missing or ambiguous. ``` ### Technical Analysis The skill en ...[truncated 2297 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Disable community source and job metadata sharing by default. - Require explicit opt-in that is separate from analytics and identity-sharing consent. - Show the exact payload and destination before each initial transmission, or obtain narrowly scoped consent for a clearly defined batch. - Strip query strings, fragments, candidate identifiers, tracking tokens, free-form text, and nonessential timestamps from shared URLs and metadata. - Document and allowlist all relay endpoints. - Encrypt queued records at rest and restrict them to owner-only permissions. - Bound retry counts and retention periods rather than retrying indefinitely. - Provide commands to inspect, cancel, and permanently delete pending transmissions. - Ensure that disabling sharing immediately prevents retries and removes queued data unless the user explicitly requests retention. - Separate local ledger recording from external contribution so recording an application never implicitly causes a network transmission. - Include the sharing, sanitization, and queue implementation in the auditable package and add tests proving that sensitive fields cannot be transmitted. ]]>
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (1)

Vague Triggers

Medium
Confidence
94% confidence
Finding
The skill explicitly allows invocation via broad natural-language phrasing, which can cause the agent to trigger a high-impact workflow unintentionally from ambiguous user text. In this context, the skill can search, fill, and submit job applications and handle telemetry/state changes, so accidental activation could lead to unintended actions, privacy exposure, or premature submissions despite later safeguards.

Static analysis

No suspicious patterns detected.