T09 · Insecure Skill Coding Practices
- Location
build.sh:20- Finding
Configured Secrets Can Be Included in Release Archives
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent customer-support automation skill, but it needs Review because it encourages broad customer-data processing, CRM/ticket mutations, and automatic customer replies without enough scoping or approval controls.
Review this before installing in a real support environment. Use least-privilege credentials only for integrations you explicitly enable, avoid putting live secrets in config.yaml, require human approval for refunds, outbound customer messages, and CRM writes, and narrow triggers to deliberate commands or approved channels.
build.sh:20Configured Secrets Can Be Included in Release Archives
SKILL.md:5Skill Requests Credentials Beyond Its Implemented Requirements
The skill is designed to process customer messages, CRM records, contact details, order history, sentiment, and support analytics, yet the description does not warn users that sensitive personal and business data will be transmitted across third-party APIs and integrations. This omission increases the risk of privacy violations, unsafe deployment, and noncompliance with internal policy or legal obligations.
The trigger set contains broad generic phrases such as 'тикет', 'helpdesk', 'customer support', and other everyday support-related terms that can cause accidental invocation in unrelated conversations. Because this skill can categorize tickets, generate customer replies, and drive escalation workflows, unintended activation could expose customer data, create records, or send misleading automated responses.
Stating that the module activates on any incoming customer message creates an effectively universal trigger within connected channels. In a system with CRM access, ticket creation, sentiment-based escalation, and autoresponse behavior, such ambiguity can cause over-collection of customer data and autonomous actions without sufficient user intent or operator review.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp "$SRC_DIR/SKILL.md" "$SRC_DIR/config.yaml" "$SRC_DIR/README.md" "$SRC_DIR/install.sh" "$SRC_DIR/.env.example" "$TARGET/"
cp -r "$SRC_DIR/docs" "$SRC_DIR/examples" "$SRC_DIR/proof" "$SRC_DIR/test" "$TARGET/"
chmod +x "$TARGET/install.sh" "$TARGET/test/smoke-test.sh" 2>/dev/null || true
echo "[✓] Файлы скопированы в $TARGET" # 3. Создать .env из шаблона если нет
if [[ ! -f "$TARGET/.env" ]]; then cp "$SRC_DIR/.env.example" "$TARGET/.env" echo "[✓] Создан $TARGET/.env (заполнять только если нужны интеграции)"
else echo "[i] $TARGET/.env уже существует — не перезаписываю"
fi # 4. Напомнить про OBLIGATORY-поля
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp "$SRC_DIR/SKILL.md" "$SRC_DIR/config.yaml" "$SRC_DIR/README.md" "$SRC_DIR/install.sh" "$SRC_DIR/.env.example" "$TARGET/"
cp -r "$SRC_DIR/docs" "$SRC_DIR/examples" "$SRC_DIR/proof" "$SRC_DIR/test" "$TARGET/"
chmod +x "$TARGET/install.sh" "$TARGET/test/smoke-test.sh" 2>/dev/null || true
echo "[✓] Файлы скопированы в $TARGET" # 3. Создать .env из шаблона если нет
if [[ ! -f "$TARGET/.env" ]]; then cp "$SRC_DIR/.env.example" "$TARGET/.env" echo "[✓] Создан $TARGET/.env (заполнять только если нужны интеграции)"
else echo "[i] $TARGET/.env уже существует — не перезаписываю"
fi # 4. Напомнить про OBLIGATORY-поля
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp "$SRC_DIR/SKILL.md" "$SRC_DIR/config.yaml" "$SRC_DIR/README.md" "$SRC_DIR/install.sh" "$SRC_DIR/.env.example" "$TARGET/"
cp -r "$SRC_DIR/docs" "$SRC_DIR/examples" "$SRC_DIR/proof" "$SRC_DIR/test" "$TARGET/"
chmod +x "$TARGET/install.sh" "$TARGET/test/smoke-test.sh" 2>/dev/null || true
echo "[✓] Файлы скопированы в $TARGET" # 3. Создать .env из шаблона если нет
if [[ ! -f "$TARGET/.env" ]]; then cp "$SRC_DIR/.env.example" "$TARGET/.env" echo "[✓] Создан $TARGET/.env (заполнять только если нужны интеграции)"
else echo "[i] $TARGET/.env уже существует — не перезаписываю"
fi # 4. Напомнить про OBLIGATORY-поля
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp -r "$SRC_DIR/docs" "$SRC_DIR/examples" "$SRC_DIR/proof" "$SRC_DIR/test" "$TARGET/"
chmod +x "$TARGET/install.sh" "$TARGET/test/smoke-test.sh" 2>/dev/null || true
echo "[✓] Файлы скопированы в $TARGET" # 3. Создать .env из шаблона если нет
if [[ ! -f "$TARGET/.env" ]]; then cp "$SRC_DIR/.env.example" "$TARGET/.env" echo "[✓] Создан $TARGET/.env (заполнять только если нужны интеграции)"
else echo "[i] $TARGET/.env уже существует — не перезаписываю"
fi # 4. Напомнить про OBLIGATORY-поля
echo ""
Suspicious Unicode normalization or mixed-script content
Suspicious Unicode normalization or mixed-script content
The README encourages processing customer support tickets and generating replies, which commonly involves personal data, account details, order information, and potentially sensitive complaint content, yet it provides no privacy, retention, access-control, or human-review guidance. This creates a realistic risk of mishandling customer data or allowing the model to act on sensitive inputs without appropriate safeguards.
Refund decisions, CRM-card generation, and NPS/CSAT reporting can directly influence money movement, customer records, and business decision-making, but the README does not warn about verification, authorization, auditability, or data sensitivity. In a support automation context, this increases the chance of unauthorized refunds, inaccurate CRM enrichment, privacy leakage, or flawed automated decisions affecting customers and operations.
Suspicious Unicode normalization or mixed-script content
The description says "Русский язык нативно" and states that prompts, templates, and triggers are tailored to Russian-speaking business, presenting the language choice as fixed rather than optional. The file does not offer user opt-in for language/locale selection or clearly justify the restriction as a region-specific compliance requirement.
The skill claims L1 has read-only CRM access, but later workflows instruct the bot to create tickets, update CRM records, set tags, and log events automatically. This mismatch can cause deployments to grant broader privileges than operators expect, increasing the chance of unauthorized writes, data corruption, or unintended customer-impacting actions.
The skill can automatically create tickets, send customer-facing replies, and escalate issues, but it does not present a clear warning that these actions may happen without human review. In customer support contexts, silent automation can generate erroneous commitments, reputational harm, or workflow disruption if classification or sentiment analysis is wrong.
Suspicious Unicode normalization or mixed-script content
The header states the script only builds a ZIP, but later it unpacks the newly created archive and executes bash test/smoke-test.sh from its contents. That discrepancy can mislead reviewers and users into running a script that performs code execution beyond packaging, increasing the risk of unnoticed execution of untrusted test logic bundled in the skill.
The script's human-readable instructions and comments are presented in Russian only, with no indication of language choice or opt-in. This can violate language/locale policy where skills should not force a specific language unless the constraint is documented and justified.
The listed trigger phrases are generic business requests such as 'Set up ticket management' and 'Create support dashboard', which can plausibly appear in normal workplace conversation and unintentionally activate the skill. Accidental invocation can cause the wrong workflow or guidance to be applied, creating operational confusion and increasing the chance of unintended actions in support environments.
Suspicious Unicode normalization or mixed-script content
This markdown repeatedly presents Russian language support as a fixed characteristic ("Русский язык | ... | ДА") and later states competitors are "EN-only," but does not mention any user option to choose language. Under the policy, forcing a specific language without opt-in is a natural-language locale violation unless clearly justified as region-specific.
Line L47 explicitly says "Русский язык — все 3 конкурента EN-only," describing Russian as a defining behavior of the skill. Because no user language choice or region-specific justification is provided in the file, this can violate the language/locale policy for natural-language instructions.
Suspicious Unicode normalization or mixed-script content
The setting auto_approve_return_under_rub: 1000 authorizes a business action without human review, creating a pathway for financial abuse, policy bypass, or repeated low-value fraudulent returns at scale. In a customer-support automation context, this is more dangerous because the same system also includes escalation and CRM automation, increasing the chance that approvals are executed operationally without sufficient fraud checks.
# TONE-OF-VOICE
# ═══════════════════════════════════════════════════ tone: default: "дружелюбный деловой" on_negative_sentiment: "спокойный эмпатичный" on_vip: "персональный профессиональный" on_legal_threat: "нейтральный официальный" address_form: "вы" use_emoji: false response_length: "medium" # ═══════════════════════════════════════════════════
# ВОЗВРАТЫ
# ═══════════════════════════════════════════════════ returns: return_policy_days: 14 return_processing_days: "5-7 рабочих" auto_approve_return_under_rub: 1000 requires_reason_code: true # ═══════════════════════════════════════════════════
# CRM-ИНТЕГРАЦИЯ (опционально)
# ═══════════════════════════════════════════════════ crm: enabled: false type: "bitrix24" # bitrix24 / amocrm / hubspot / freshdesk / zendesk api_url: "" api_key: "" auto_create_ticket: true auto_update_client_card: true required_fields: - "client_id" - "ticket_category" - "priority" - "channel" - "status" # ═══════════════════════════════════════════════════
# КАЧЕСТВО И NPS/CSAT
The config explicitly sets language: "ru" and elsewhere defaults to Russian locale values such as timezone: "Europe/Moscow", but the file does not indicate that language selection is optional or limited to a clearly justified region-specific deployment. This creates a natural-language policy concern because the skill appears to enforce a single language/locale without user opt-in.
No suspicious patterns detected.