Back to skill

Security audit

Job Application Manager

Security checks for vulnerabilities and agentic risk

Overview

This skill has a coherent job-tracking purpose, but it asks for sensitive email access and tracker writes while using under-scoped local persistence and unsafe SQLite command patterns.

Review before installing. Use this only if you are comfortable letting the agent read job-related Gmail threads and write extracted application details to Notion or a local SQLite database. Prefer the Notion backend or a fixed trusted SQLite path, and do not let the agent run sqlite3 commands with a user-supplied or profile-loaded path unless it validates and safely passes the path without shell interpolation.

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

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:115
Finding

Shell Command Injection Through Unquoted SQLite Database Path

Content
View full analysis
Tracker Backend > SQLite DB path` - Default: `~/.offerplus/applications.db` - On first use, initialize the DB: `swelist tracker init --db ` Or directly: `sqlite3 "CREATE TABLE IF NOT EXISTS applications (name TEXT PRIMARY KEY, status TEXT NOT NULL, job_id TEXT, applied_on TEXT, notes TEXT, updated_at TEXT DEFAULT (datetime('now')));"` ``` The unsafe pattern is repeated throughout the workflow: ```text existing_rows = sqlite3 DB_PATH "SELECT name, company, status FROM applications" ``` ```text sqlite3 DB_PATH "INSERT OR IGNORE INTO applications (name,status,company,job_id,applied_on,last_touch,interview_date,next_action,link,tags) VALUES (?,?,?,?,?,?,?,?,?,?)" ``` ```text sqlite3 DB_PATH "UPDATE applications SET status=?, last_touch=?, next_action=?, interview_date=COALESCE(?,interview_date), link=COALESCE(?,link), tags=COALESCE(?,tags), updated_at=datetime('now') WHERE name=?" ``` ```text stale = sqlite3 DB_PATH "SELECT name, status, last_touch FROM applications WHERE status NOT IN ('Rejected','Withdrawn','Offer') AND (date(COALESCE(last_touch, updated_at)) < date('now','-30 days')) AND COALESCE(next_action,'') != 'Follow up'" FOR each stale row: sqlite3 DB_PATH "UPDATE app ...[truncated 2657 chars]
Remediation
View remediation
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • 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
Findings (8)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The description emphasizes convenience but does not clearly warn that the skill reads email contents and may write extracted data into Notion, SQLite, local profile.md, and optionally Google Calendar. Missing disclosure undermines informed consent for handling sensitive employment and correspondence data, making accidental over-sharing more likely.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · SKILL.md (reported line 60)May include surrounding context.

md
reason: Search and read job application emails
          optional: false
        - name: claude_ai_Notion
          reason: Create and update application entries in Notion
          optional: true
        - name: claude_ai_Google_Calendar
          reason: Create calendar events for scheduled interviews

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases are broad enough that the skill could activate during ordinary discussion about job searching, application updates, or note-taking. Overbroad activation increases the chance of unintended Gmail searches or writes to Notion/SQLite without the user clearly intending to run an automation workflow.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill instructs the agent to read from and write to a local profile.md file to persist user configuration and aliases outside the declared integrations. This creates an undeclared local storage channel for sensitive career metadata and can cause privacy leakage or unintended modification of user files, especially because the path and trust boundary for profile.md are not constrained.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill directs execution of local shell and sqlite3/swelist CLI commands for database initialization and schema changes. Allowing shell-based local command execution expands the attack surface beyond the stated SaaS integrations and can lead to arbitrary local file modification, unsafe path handling, or command-injection style risks if any arguments are derived from user-controlled values.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
80% confidence
Finding

The skill stores extracted application information into a local SQLite database via CLI commands, creating persistent local records of sensitive employment activity. In context this is intentional functionality, but it becomes a security issue because the persistence path, access controls, and user consent/visibility around local storage are not sufficiently constrained or disclosed.

Content

Scanner excerpt · SKILL.md (reported line 669)May include surrounding context.

}

text

### SQLite — Create
```bash
swelist tracker add "Amazon — SDE, AWS" \
  --status "Applied / Received" \

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% 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 · SKILL.md (reported line 810)May include surrounding context.

md
| Funnel counts fetched from Notion but all_pages is empty | Skip pipeline line; note "0 applications tracked" |
| Funnel query when syncing a single company | Skip pipeline summary entirely |
| Fuzzy match finds a candidate but user declines merge | Treat as new company; create new row; do not add alias |
| Fuzzy match distance is 1 (e.g. "Gogle" vs "Google") | Still prompt user — never auto-merge without confirmation |
| Two existing rows both match fuzzily (ambiguous) | Show top 2 candidates; let user pick or decline all |
| Alias resolved but role title doesn't match | Do not merge — same company, different role is a different application |
| Bulk re-enrichment on SQLite backend | Not supported; print "Page enrichment requires Notion backend" and exit |

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
75% confidence
Finding

Beyond reading job-application emails, the skill instructs listing all Gmail labels and having the user classify which ones are job-related. Enumerating mailbox metadata across the account is a broader mailbox-inspection capability than the manifest's simple description of syncing application emails.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.