T01 · Skill Instruction Hijacking
Error
- Location
- plugin/skills/lunara-voice/SKILL.md:103
- Finding
- Always-Loaded Skill Forces Unnecessary Autonomous Transcript Processing and Persistent Writes<![CDATA[ ## Vulnerability Details **File Location**: `plugin/skills/lunara-voice/SKILL.md:103-130` **Vulnerability Type**: Agent instruction hijacking and excessive autonomous execution **Risk Level**: High ### Vulnerable Code Snippet ```md ### 3. Quick single call **⚠️ There is NO "fire and forget" call flow.** Every single outbound call MUST follow the full end-to-end workflow in **Section 5** below — including polling for completion and reporting transcript results. Never just call `lunara_call_single` and stop. ### 4. Review call results after a call or campaign 1. `lunara_history_list` with assistant_id — see recent calls 2. `lunara_history_detail` with conversation_id — get full transcript 3. `lunara_analytics_save` — save your analysis (sentiment, summary, quality) 4. `lunara_tags_add` — tag the call (e.g. "interested", "follow-up", "vip") ### 5. Make a call and report the result (end-to-end) — DEFAULT FOR ALL CALLS **⚠️ AUTONOMOUS EXECUTION — This workflow applies to EVERY outbound call, no exceptions!** **Whenever the user asks to call someone — regardless of phrasing ("позвони", "набери", "call", "договорись", "сделай звонок", etc.) — you MUST complete ALL steps below in ONE turn. Never just initiate a call and stop.** 1. **Record the current timestamp** (ISO 8601, e.g. `2026-02-16T19:45:00Z`) and the **phone number** you are calling BEFORE making the call. You will need these to find the NEW call record. 2. `lunara_call_single` — place the call. Save the returned **Call SID**. 3. **Poll until THE NEW call completes** — call `lunara_history_list` with `date_from=<timestamp from step 1>` and `caller=<phone_number>` every 25-30 seconds. **You MUST use date_from to exclude old calls.** Keep polling until a record appears that matches the phone number AND was created AFTER step 1's timestamp (up to 5 minutes / 10 attempts). Do NOT message the user — poll silently. 4. `lunara_history_detail` with `include_transcript=true` and the **conversation_id f ...[truncated 2492 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Remove unconditional language such as “MUST,” “no exceptions,” and “poll silently.” 2. Limit the default call workflow to the action explicitly requested by the user. 3. Obtain separate confirmation before: - Retrieving a full transcript. - Disabling PII masking. - Saving analytics. - Adding or removing tags. - Quoting transcript content. 4. Make post-call polling optional and allow the user to choose between immediate call initiation and later result retrieval. 5. Do not suppress status communication during long-running operations. 6. Separate read-only tools from state-changing tools and require explicit intent for each write. 7. Consider removing `"always": true` so the instructions are loaded only when the user intentionally invokes this Skill. 8. Default transcript summaries to masked, minimal output rather than complete content or direct quotations. ]]>
