T09 · Insecure Skill Coding Practices
- Location
scripts/job-tracker.sh:275- Finding
Arbitrary Python Code Execution Through Unsafe Argument Interpolation
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent Google Sheets job tracker, but unsafe CLI input handling can let job or search text execute local code under the user’s account.
Review this skill before installing. Use a dedicated Google account or least-privilege credentials, limit any email/calendar automation to job-related labels and calendars, avoid feeding untrusted recruiter or job-posting text into the CLI until the Python/AWK injection issues are fixed, and back up the spreadsheet before enabling cron or using force-delete.
scripts/job-tracker.sh:275Arbitrary Python Code Execution Through Unsafe Argument Interpolation
scripts/job-tracker.sh:631Arbitrary Command Execution Through AWK Program Injection in Search
scripts/job-tracker-appscript.js:265Spreadsheet Formula Injection Through Unsanitized Job and Log Fields
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
brew install steipete/tap/gogcli
gog auth credentials /path/to/client_secret.json gog auth add your@gmail.com --services sheets
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
for detailed setup.
Set the environment variable with your Google Sheet ID:
export JOB_TRACKER_SPREADSHEET_ID="your-google-sheet-id"
The ID is found in your Google Sheet URL:
https://docs.google.com/spreadsheets/d/[THIS-IS-THE-ID]/edit
For persistent configuration, add to your shell profile (~/.bashrc, ~/.zshrc):
echo 'export JOB_TRACKER_SPREADSHEET_ID="your-google-sheet-id"' >> ~/.bashrc
For OpenClaw agents, set in the agent's environment or TOOLS.md.
# Set your spreadsheet ID first
export JOB_TRACKER_SPREADSHEET_ID="your-google-sheet-id"
# View all commands
./scripts/job-tracker.sh help
# Add a discovered job
./scripts/job-tracker.sh add --company "Morgan Stanley" --role "AI Architect" --source LinkedIn
# List active interviews
./scripts/job-tracker.sh list --status interview
# Log an event
./scripts/job-tracker.sh log JOB002 --event interview_scheduled --details
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
ds for each job attribute
Set the JOB_TRACKER_SPREADSHEET_ID environment variable:
export JOB_TRACKER_SPREADSHEET_ID="your-spreadsheet-id-here"
For persistent configuration, add to your shell profile (~/.bashrc, ~/.zshrc):
echo 'export JOB_TRACKER_SPREADSHEET_ID="your-spreadsheet-id"' >> ~/.bashrc
source ~/.bashrc
Use these exact values (Title Case):
Use these exact values (lowercase):
For form automation in th
The README explicitly advertises cron-based email scans and Google Sheets storage for job-hunting data, but provides no warning about privacy, sensitive personal data, third-party access, or credential handling. For a skill that may process recruiter emails, application history, and potentially personal identifiers, omission of data-handling guidance can lead users to deploy automation that exposes sensitive information or over-collects data without informed consent.
The documentation explicitly instructs an agent to scan email and check calendar data, which involves access to sensitive personal communications and scheduling information. Without clear privacy warnings, consent requirements, scope limits, or data-handling constraints, an operator may over-grant access and unintentionally expose or process sensitive content.
The documented delete ... --force path enables unattended destructive actions in automation, removing job-tracking records without an interactive confirmation step. In an agentic or cron-driven context, mistakes in prompts, identifiers, or logic could cause silent data loss at scale.
./scripts/job-tracker.sh delete JOB015
./scripts/job-tracker.sh delete JOB015 --force
This code writes job records to the spreadsheet and then immediately clears the form, but it only shows a success toast after the fact. There is no confirmation prompt or explicit user-facing warning in comments/docstrings that invoking the function will persist data and modify sheet contents.
The save routine overwrites an existing row in the Jobs sheet and may append a status-change log entry, but it does not provide any confirmation before modifying persisted spreadsheet data. The toast appears only after the update, so users are not warned in advance about the write operation.
This function blanks all configured form and log cells, which is a potentially destructive operation for in-progress user input. Although a toast is shown afterward, there is no confirmation prompt or pre-action warning that the current form contents will be lost.
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.
# Delete a job (with confirmation)
job-tracker delete JOB002
# Delete without confirmation
job-tracker delete JOB002 --force
# Show job details
The text states that the skill 'requires' a specific model and explicitly says not to use other models, removing user choice rather than presenting a recommendation. Under this rule, forced organizational preference expressed in natural language should be flagged unless clearly justified as a strict compatibility requirement.
The comment and help text describe delete as preserving activity logs, but the implementation clears columns A:P for the row, including column P (log), which the schema labels as the latest 3 log entries formula. While the separate Activity Log sheet is not deleted, the user-visible in-row log history is removed, so the documentation overstates what is preserved.
No suspicious patterns detected.