T09 · Insecure Skill Coding Practices
- Location
scripts/semantic_router.py:29- Finding
Predictable Shared Cache Permits Local Route Poisoning
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent local semantic routing skill with some deployment hardening issues but no artifact-backed evidence of exfiltration, deception, or destructive behavior.
Reasonable to install for local routing if you trust the Python dependency chain. For shared or security-sensitive systems, use a private cache directory, clear or rebuild the ChromaDB cache when routes change, pin dependencies, and avoid sending sensitive messages through the API until cache and model provenance are controlled.
scripts/semantic_router.py:29Predictable Shared Cache Permits Local Route Poisoning
SKILL.md:7Unpinned Executable Dependencies and Implicit Model Retrieval
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
python3 scripts/router-api.py --port 8321
curl -X POST http://localhost:8321/route
-H "Content-Type: application/json"
-d '{"message": "Check the firewall logs for suspicious activity"}'
The top-level docstring presents action-verb scoring as part of the router's configurable behavior, and the example routes include per-route 'action_verbs' fields. In practice, _detect_action_verbs uses only fixed internal lists and never reads the configured action_verbs values, so the documented intent diverges from the implemented behavior.
The documentation highlights that the router understands French/English bilingual queries and later describes mandatory French normalization in the processing pipeline. Because the skill presents this language behavior as built-in rather than user-selectable or explicitly scoped to a bilingual environment, it may impose locale-specific behavior without opt-in.
The documentation explicitly states that embeddings persist in /tmp/semantic_router_cache/, but it does not warn users that routed content or derived representations may be written to disk. In a message-routing skill, users may submit sensitive operational or security-related prompts, so undocumented local persistence creates a privacy and data-handling risk even without any external exfiltration.
These notes describe language handling in a way that centers English and treats French as a secondary normalization case, but they do not mention any user opt-in, language selection, or explicit justification for this locale constraint. Because SQP-3 applies to natural-language policy issues in any file type, this is a mild language-policy concern.
The module docstring advertises a "41-message bilingual benchmark," and the implementation specifically normalizes French text and hard-codes English/French verb lists. This suggests the skill is designed around a fixed language set but does not clearly disclose language limitations or offer user choice, which can be a natural-language locale policy concern.
The manifest frames this as a fully local semantic router, and the code comments reinforce that no external model is needed. However, the actual semantic capability is delegated to ChromaDB's built-in embedding mechanism, which is an undeclared dependency on an external model package/runtime rather than logic implemented in this skill itself. This is a mild description mismatch because the router is still local, but the claimed implementation simplicity/scope is overstated.
No suspicious patterns detected.