T01 · Skill Instruction Hijacking
- Location
server.py:59- Finding
Globally Scoped MCP Instructions Hijack Agent Recommendation Behavior
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a real AI model tracker, but it asks users to enable integrations that can persistently change future agent instructions.
Review this carefully before installing. Prefer using the static JSON/CSV or manual local queries. Do not enable the cron/systemd timers that update CLAUDE.md or agents.md unless you pin the code, review diffs before applying changes, and know how to disable the timer. Treat MCP results as advisory and review .mcp.json edits manually.
server.py:59Globally Scoped MCP Instructions Hijack Agent Recommendation Behavior
update_agents_md.py:119Untrusted Remote Model Data Can Be Persisted in an Agent Instruction File
requirements.txt:1Mutable Dependency Ranges Permit Unreviewed Supply-Chain Changes
The README tells users to create .mcp.json with a server entry that will execute python server.py, which changes local agent/tooling configuration and authorizes a new command-backed integration. In a skill setting, modifying MCP config is sensitive because it expands the agent's accessible tools and can lead to execution of local code with the user's privileges if the repository contents are unreviewed.
# Edit .mcp.json to add the server config
cat > .mcp.json << 'EOF'
{
"mcpServers": {
"sota-tracker": {
The skill instructs users to create or overwrite .mcp.json with server configuration, which grants a local tool invocation path to python server.py. In an agent context, modifying MCP configuration is sensitive because it changes what external tools the agent can launch, potentially expanding capability and trust boundaries if the repository contents are later altered or not reviewed.
# Edit .mcp.json to add the server config
cat > .mcp.json << 'EOF'
{
"mcpServers": {
"sota-tracker": {
The phrase 'without safety guardrails' is a direct anti-refusal statement that endorses bypassing protective mechanisms. In this context, the file is not merely discussing safety academically; it is presenting the model as state-of-the-art and desirable, which amplifies the chance of unsafe deployment and misuse.
"is_open_source": 1,
"sota_rank": 9,
"sota_rank_open": 9,
"metrics": "{\"notes\": \"Uncensored Qwen3-32B, abliterated variant without safety guardrails\", \"why_sota\": \"Full Qwen3-32B quality without restrictions\", \"strengths\": [\"Uncensored\", \"Full 32B quality\", \"Creative freedom\", \"Single GPU\"], \"use_cases\": [\"Creative writing\", \"Unrestricted research\", \"Roleplay\"], \"vram_gb\": 19, \"quantization\": \"Q4_K_M\", \"is_uncensored\": true, \"hf_repo\": \"mradermacher/Qwen3-32B-Uncensored-GGUF\", \"base_model\": \"qwen3-32b\"}",
"last_updated": "2026-01-11 15:34:39",
"price_per_1m_output": null,
"humaneval_score": null,
The entry explicitly advertises an abliterated model as being 'without safety guardrails' and 'without restrictions,' which is an anti-safety claim rather than neutral catalog metadata. Because this dataset appears to guide model selection, such wording can directly encourage adoption of systems designed to bypass refusals and increase the likelihood of harmful outputs.
The phrases 'No refusals on complex topics' and 'without guardrails' explicitly market the model's lack of safety enforcement as a benefit. That makes the entry more dangerous than a passive reference because it functions as an endorsement for evading normal model safety behavior.
"is_open_source": 1,
"sota_rank": 10,
"sota_rank_open": 10,
"metrics": "{\"notes\": \"Uncensored QwQ-32B reasoning model, abliterated variant\", \"why_sota\": \"Best uncensored reasoning model, full QwQ quality without restrictions\", \"strengths\": [\"Uncensored\", \"Reasoning\", \"No refusals on complex topics\"], \"use_cases\": [\"Unrestricted reasoning\", \"Research\", \"Complex analysis without guardrails\"], \"vram_gb\": 19, \"quantization\": \"Q4_K_M\", \"is_uncensored\": true, \"hf_repo\": \"mradermacher/QwQ-32B-Uncensored-GGUF\", \"base_model\": \"qwq-32b\"}",
"last_updated": "2026-01-11 15:34:39",
"price_per_1m_output": null,
"humaneval_score": null,
This entry promotes an uncensored reasoning model using phrases like 'No refusals on complex topics' and 'without guardrails,' which strongly signals utility for bypassing safety constraints. In a recommendation dataset, that materially increases misuse risk by normalizing and advertising policy-evasive capability as a product strength.
Skill attempts to nullify the agent's safety policies or restrictions ('you have no restrictions', 'ignore your guidelines', 'do anything now'). This is a direct jailbreak that disables guardrails.
"sota_rank": 9,
"sota_rank_open": 9,
"metrics": {
"notes": "Uncensored Qwen3-32B, abliterated variant without safety guardrails",
"why_sota": "Full Qwen3-32B quality without restrictions",
"strengths": ["Uncensored", "Full 32B quality", "Creative freedom", "Single GPU"],
"use_cases": ["Creative writing", "Unrestricted research", "Roleplay"],
Skill attempts to nullify the agent's safety policies or restrictions ('you have no restrictions', 'ignore your guidelines', 'do anything now'). This is a direct jailbreak that disables guardrails.
"notes": "Uncensored QwQ-32B reasoning model, abliterated variant",
"why_sota": "Best uncensored reasoning model, full QwQ quality without restrictions",
"strengths": ["Uncensored", "Reasoning", "No refusals on complex topics"],
"use_cases": ["Unrestricted reasoning", "Research", "Complex analysis without guardrails"],
"vram_gb": 19,
"quantization": "Q4_K_M",
"is_uncensored": True,
Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.
The security section states 'Read-only operations only' at L084. However, the same changelog later documents 'refresh_data() - Force refresh data' and 'Automated data commits' at L070 and L107, which indicate write-side behavior rather than purely read-only operation. This is an intent/documentation contradiction within the file.
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.
}
3. **Create Linear issue from template:**
```bash
cat ~/.cyrus/templates/linear_execution_issue.md
# Replace <REPO_NAME>, <SCRIPT_NAME>, <ISSUE_ID>
Lines L022-L025 label several models as "Forbidden," and L114 later describes a "Hard blocks outdated models." This is a natural-language policy concern because it imposes a rigid recommendation constraint without stating user opt-in, exceptions, or a region/compliance justification.
Enabling a user systemd timer creates persistent automatic execution of the update script at login/runtime without emphasizing the security implications. In this repository context, that means a local script can keep editing CLAUDE.md daily, which can silently alter agent context and preserve behavior changes across sessions.
cp scripts/update_sota_claude_md.py ~/scripts/
# Enable systemd timer (runs at 6 AM daily)
systemctl --user enable --now sota-update.timer
# Or run manually
python ~/scripts/update_sota_claude_md.py --update
The README instructs users to automate updates to ~/.claude/CLAUDE.md, a user configuration/context file, without clearly warning that local content may be overwritten or continuously modified. In an agent-skill context, silently changing prompt/config files can alter agent behavior, erase user instructions, or introduce unreviewed content on a recurring basis.
The README recommends scheduled automatic updates to agents.md without warning that this will repeatedly modify an agent control/configuration file over time. In this context, persistent unattended edits to agent instructions are security-relevant because they can change behavior, destroy local customizations, or propagate bad data into future agent sessions.
The cron instruction establishes persistent scheduled execution of a repository script. Persistence is security-relevant because it causes recurring code execution and repeated file modifications long after the initial setup, increasing the blast radius if the script or repo later changes unexpectedly.
Add to your cron or systemd timer for daily updates:
# ~: crontab -e
@daily python ~/Apps/sota-tracker-mcp/update_agents_md.py
This systemd enablement step installs persistent scheduled execution for update_agents_md.py. Because the target file is an agent instruction/config file, unattended persistence is more dangerous here than for ordinary data-refresh tasks: future runs can keep mutating agent behavior without active user review.
WantedBy=timers.target
systemctl --user enable --now sota-update.timer
See [CONTRIBUTING.md](CONTRIBUTING.md) for full setup guide
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# Allow localhost and trusted IP
sudo ufw allow from 192.168.1.0/24 to any port 8000
The documentation explicitly tells users to install a systemd timer that will automatically update ~/.claude/CLAUDE.md, a local agent configuration/context file, on a recurring basis. Even if intended as a convenience feature, silently scheduled modification of agent-facing files can change future agent behavior over time and increases the risk of persistence, prompt injection propagation, or unintended trust in externally refreshed content.
systemctl --user enable --now sota-update.timer creates a persistent per-user scheduled task. In this skill's context, that persistent task is specifically used to rewrite CLAUDE.md, so the persistence directly affects agent behavior and increases the blast radius of any future bug or compromised update path.
cp scripts/update_sota_claude_md.py ~/scripts/
# Enable systemd timer (runs at 6 AM daily)
systemctl --user enable --now sota-update.timer
# Or run manually
python ~/scripts/update_sota_claude_md.py --update
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.
This repo uses GitHub Actions to:
- **Daily**: Scrape all sources, update database, commit changes
- **Weekly**: Create a tagged release with JSON/CSV exports
To enable on your fork:
1. Fork this repo
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.
This repo uses GitHub Actions to:
- **Daily**: Scrape all sources, update database, commit changes
- **Weekly**: Create a tagged release with JSON/CSV exports
To enable on your fork:
1. Fork this repo
This section instructs users to automate updates to agents.md via cron or systemd without prominently warning that a local agent instruction file will be rewritten regularly. Because agents.md can influence how downstream agents operate, scheduled unattended updates create a supply-chain-style risk where future content changes alter agent behavior without direct user review.
The cron example establishes recurring execution of a repository script, creating persistence on the user's machine. While framed as automation, persistence mechanisms are security-relevant because they continue running code and modifying agent-related files after the initial setup, including after upstream repository changes.
Add to your cron or systemd timer for daily updates:
# ~: crontab -e
@daily python ~/Apps/sota-tracker-mcp/update_agents_md.py
This command enables a user-level systemd timer, establishing ongoing scheduled execution. Because the documented use is automatic updates to agents.md, the persistence is not merely operational automation; it continuously affects files that may influence agent instructions or behavior.
WantedBy=timers.target
systemctl --user enable --now sota-update.timer
See [CONTRIBUTING.md](CONTRIBUTING.md) for full setup guide
No suspicious patterns detected.