Back to skill

Security audit

Claw Apply

Security checks for vulnerabilities and agentic risk

Overview

This is not clearly malicious, but it can automatically submit real job applications and share or retain sensitive candidate data with weak approval boundaries.

Install only if you are comfortable with an agent using your LinkedIn/Wellfound sessions to submit applications, sending candidate data to Anthropic and Telegram, and storing reusable answers locally. Start with preview mode, set a low max_applications_per_run, review answers.json regularly, disable crons until tested, and protect .env and data logs as sensitive files.

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

other

Error
Location
lib/form_filler.mjs:232
Finding

Indirect prompt injection through job application fields can disclose stored candidate answers

Content
View full analysis
`Q: "${a.pattern}" -> A: "${a.answer}"`).join('\n'); const optionsHint = opts.options?.length ? `\nAvailable options: ${opts.options.join(', ')}` : ''; const systemPrompt = `You are helping a job candidate fill out application forms. You have access to their profile and previously answered questions. Rules: - If this question is a variation of a previously answered question, return the SAME answer - For yes/no or multiple choice, return ONLY the exact option text - For short-answer fields, be brief and direct (1 line) - Use first person - Never make up facts - Just the answer text — no preamble, no explanation, no quotes`; const userPrompt = `Candidate: ${this.profile.name?.first} ${this.profile.name?.last} Location: ${this.profile.location?.city}, ${this.profile.location?.state} Years experience: ${this.profile.years_experience || 7} Applying for: ${this.jobContext.title || 'a role'} at ${this.jobContext.company || 'a company'} Previously answered questions: ${savedAnswers || '(none yet)'} New question: "${label}"${optionsHint} Answer:`; try { const res = await fetch(ANTHROPIC_API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': this.apiKey, 'anthropic-version': '2023-06-01', }, body: JSON.stringify({ model: 'claude-sonnet-4-6', max_tokens: 256, system: systemPrompt, messages: [{ role: 'user', content: userPrompt }], }), }); if (!res.ok) return null; const data = await res.json(); const answer = data. ...[truncated 3727 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
lib/filter.mjs:21
Finding

AI features transmit candidate data beyond the minimum required scope

Content
View full analysis
, "reason": ""}`; } ``` That complete object is loaded from the user’s profile configuration and passed to the batch API: ```js const candidateProfile = loadConfig(resolve(__dir, 'config/profile.json')); const submitted = await submitBatches( filterable, jobProfilesByTrack, candidateProfile, model, apiKey ); ``` Keyword generation also sends identifying data that is not required to produce search terms: ```js const prompt = `You are an expert job search strategist helping a candidate find the right roles on LinkedIn and Wellfound. ## Candidate Profile - Name: ${profile.name.first} ${profile.name.last} - Location: ${profile.location.city}, ${profile.location.state} (remote only) - Years experience: ${profile.years_experience} - Desired salary: $${pro ...[truncated 4694 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (70)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
ls for job scoring (`lib/filter.mjs`), answer generation (`lib/ai_answer.mjs`, `lib/form_filler.mjs`), and keyword generation (`lib/keywords.mjs`). Those files

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 · README.md (reported line 70)May include surrounding context.

md
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · README.md (reported line 73)May include surrounding context.

md
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · README.md (reported line 74)May include surrounding context.

md
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · README.md (reported line 205)May include surrounding context.

md
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · SKILL.md (reported line 71)May include surrounding context.

md
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · SKILL.md (reported line 145)May include surrounding context.

md
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · job_applier.mjs (reported line 3)May include surrounding context.

js
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · job_searcher.mjs (reported line 8)May include surrounding context.

js
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · lib/env.mjs (reported line 2)May include surrounding context.

js
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · lib/env.mjs (reported line 3)May include surrounding context.

js
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · setup.mjs (reported line 51)May include surrounding context.

js
/**
 * env.mjs — Load .env file if present
 * Reads key=value pairs from .env and sets process.env for any missing vars.
 * Never overwrites vars already set in the environment.
 */

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 · lib/env.mjs (reported line 11)May include surrounding context.

js
import { fileURLToPath } from 'url';

const __dir = dirname(fileURLToPath(import.meta.url));
const envPath = resolve(__dir, '../.env');

export function loadEnv() {
  if (!existsSync(envPath)) return;

Credential Access

High
Category
Privilege Escalation
Confidence
80% confidence
Finding

The script copies sensitive API keys from process environment variables into a plaintext .env file on disk. Even with benign intent and a comment noting gitignore usage, storing long-lived credentials in a local file increases exposure through local compromise, backups, accidental inclusion, or misconfigured permissions in other environments.

Content

Scanner excerpt · setup.mjs (reported line 52)May include surrounding context.

js
console.log('\n✅ Data directory ready');

  // Write .env file with API keys (gitignored — never embedded in cron payloads)
  const envPath = resolve(__dir, '.env');
  const envLines = [];
  if (process.env.KERNEL_API_KEY) envLines.push(`KERNEL_API_KEY=${process.env.KERNEL_API_KEY}`);
  if (process.env.ANTHROPIC_API_KEY) envLines.push(`ANTHROPIC_API_KEY=${process.env.ANTHROPIC_API_KEY}`);

Credential Access

High
Category
Privilege Escalation
Confidence
86% confidence
Finding

This line writes collected API keys into a plaintext .env file. Although mode 600 reduces risk, secrets are still persisted on disk where they may be read by local malware, exposed in backups, or mishandled operationally, making this a real but moderate credential-handling weakness rather than overt malicious behavior.

Content

Scanner excerpt · setup.mjs (reported line 58)May include surrounding context.

js
if (process.env.ANTHROPIC_API_KEY) envLines.push(`ANTHROPIC_API_KEY=${process.env.ANTHROPIC_API_KEY}`);
  if (envLines.length) {
    writeFileSync(envPath, envLines.join('\n') + '\n', { mode: 0o600 });
    console.log('✅ API keys written to .env (mode 600, gitignored)');
  }

  // Test Telegram

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README promotes fully automated job applications and reuse of learned answers without prominently warning that the tool may submit inaccurate, stale, or overly broad responses on the user's behalf. In this context, the skill directly automates high-stakes submissions to third-party employers, so omission of safety warnings materially increases the chance of misrepresentation, unintended disclosure, or reputational harm.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The README states that unknown application questions and AI suggestions are sent through Telegram and Claude, but it does not clearly disclose that profile, resume, job application, and potentially sensitive employment data may be transmitted to third-party services. Because this tool is explicitly designed to process applicant data at scale, the missing privacy warning makes inadvertent exposure more likely and more dangerous than in a generic chatbot integration.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill clearly automates submission of real job applications and stores learned answers in persistent files, but the opening description does not prominently warn users about these consequential actions. This can mislead users into running the skill without fully understanding that it will take irreversible external actions and retain sensitive personal/application data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

Although the skill notes it makes Claude API calls and uses Telegram, it does not present a clear privacy warning that job listings, application responses, and potentially sensitive personal data may be transmitted to Anthropic and Telegram. Users may therefore expose resumes, contact details, compensation targets, or application answers to third-party services without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest explicitly advertises automated job applications via stealth browsers, but provides no user-facing warning or consent boundary for actions that can submit applications, interact with third-party accounts, and potentially violate platform rules. Because these are impactful external actions performed automatically, the missing disclosure materially increases the risk of unintended submissions, account misuse, and reputational harm.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill requests network, browser, filesystem, and messaging permissions and references external credentials, yet the manifest does not explain what data may be read, transmitted, or sent through third-party services. In the context of job applications, this can include resumes, personal identifiers, account session activity, and notification data, making the lack of disclosure and scope limitation a meaningful security and privacy issue.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script monkey-patches stdout and stderr to tee all console output into a persistent local log file. Since later code logs unknown application questions, answer options, AI-generated answers, stack traces, job titles, and companies, this creates durable storage of sensitive application data that could be exposed to other local users, backups, or incidentally shared files.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code sends job title, company, free-form application questions, available answer options, and AI-generated answers to Telegram. That exposes potentially sensitive employment activity and profile-derived content to a third-party messaging service and any party with access to the chat, and there is no consent gate, redaction, or minimization in this file.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script overrides stdout/stderr and persists all runtime output to data/searcher.log, creating an undisclosed retention channel for potentially sensitive data such as job titles, search terms, account state, errors, and possibly secrets echoed by dependencies. Because the logging is automatic and unconditional, sensitive information can accumulate on disk and be exposed to other local users, backups, or later compromise.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

On shutdown, the script sends a partial run summary to Telegram, which transmits operational data to a third-party messaging service. Even if the summary is brief, it can disclose job-search activity, platform usage, and timing metadata outside the local environment without any consent or minimization controls visible in this file.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
debug_webflow.mjs:29

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
test_apply.mjs:37