Back to skill

Security audit

Meeting Notes Summarizer

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a straightforward meeting summarizer, but it sends full transcripts to Anthropic without clear user-facing disclosure.

Install only if you are comfortable sending any transcript you pipe into the script to Anthropic. Do not use it for regulated, confidential, HR, legal, customer, or credential-containing meetings unless that provider use is approved, and verify important decisions or action items against the original transcript.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
summarize.sh:19
Finding
Untrusted Transcript Content Can Manipulate Model Output<![CDATA[ ## Vulnerability Details **File Location**: `summarize.sh`, lines 19–29 **Vulnerability Type**: Prompt injection through untrusted transcript content **Risk Level**: Medium ### Vulnerable Code ```bash # Escape for JSON ESCAPED=$(printf '%s' "$TRANSCRIPT" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))') PROMPT="You are a meeting notes summarizer. Given the following raw meeting transcript, produce a structured summary in markdown with exactly these sections:\n\n## Summary\n(Exactly 3 sentences capturing the essence of the meeting)\n\n## Key Decisions\n(Bulleted list of decisions made)\n\n## Action Items\n(Bulleted list, each with: task, owner in **bold**, and deadline if mentioned)\n\n## Follow-up Dates\n(Bulleted list of any dates, deadlines, or scheduled follow-ups mentioned)\n\nBe concise and precise. Only include what was actually discussed.\n\nTRANSCRIPT:\n" # Build full message content as proper JSON string FULL_CONTENT=$(python3 -c " import sys, json prompt = '''$PROMPT''' transcript = json.loads($ESCAPED) print(json.dumps(prompt + transcript)) ") ``` ### Technical Analysis The script concatenates the trusted summarization instructions and the untrusted meeting transcript into one user-role model message. JSON encoding protects the HTTP request structure, but it does not establish an instruction/data trust boundary for the language model. A transcript can contain directives such as “ignore the preceding instructions,” request a different output format, fabricate decisions, suppress action items, or inject attacker-selected Markdown and links. Because the transcript and operational instructions have the same message-level authority, the model may follow instructions embedded in the transcript. This is an output-integrity vulnerability rather than local shell injection. The reviewed implementation does not give the model access to local tools, files, persistent memory, or command execution. ### Attack Path 1. An attac ...[truncated 1662 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Place the invariant summarization policy in a system message rather than concatenating it with transcript data in one user message. 2. Clearly delimit the transcript as untrusted content, preferably using a structured content block or an explicit data envelope. 3. Add a high-priority instruction stating that text inside the transcript is meeting data and that any instructions, requests, role declarations, or formatting directives within it must not be followed. 4. Validate the response before displaying or distributing it: - Require exactly the four documented Markdown sections. - Reject unexpected links, embedded HTML, or additional sections when they are not required. - Detect missing sections and retry with a constrained repair prompt. 5. Where supported, use structured JSON output with a fixed schema and render the Markdown locally rather than accepting unconstrained Markdown from the model. 6. Treat generated summaries as untrusted output and advise users to verify consequential decisions, owners, and deadlines against the original transcript. 7. Document that transcript contents are transmitted to Anthropic and may contain confidential meeting information. Recommend redaction or organizational approval where appropriate. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (9)

Ae1

High
Category
analysis-evasion
Content
./summarize.sh < transcript.txt
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
./summarize.sh < transcript.txt
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
./summarize.sh < transcript.txt
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

External Script Fetching

High
Category
Supply Chain
Content
print(json.dumps(prompt + transcript))
")

RESPONSE=$(curl -s https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The usage and requirements sections show that transcripts are processed using `curl` and an `ANTHROPIC_API_KEY`, but they do not explicitly warn users that potentially sensitive meeting content will be transmitted to an external third-party API. Meeting transcripts commonly contain confidential business discussions, PII, credentials, or legal/HR information, so omission of this disclosure can lead to unintended data exfiltration and policy or compliance violations.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The script requires an API key and transmits the full meeting transcript to Anthropic, which is a data exfiltration pathway by design. In a summarization skill this may be functionally intended, but without metadata, manifest scope, or explicit disclosure/consent, sensitive meeting content could be sent off-host unexpectedly.

External Transmission

Medium
Category
Data Exfiltration
Content
print(json.dumps(prompt + transcript))
")

RESPONSE=$(curl -s https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
Confidence
93% confidence
Finding
The hardcoded remote API endpoint confirms that processing occurs off-device and outside the user's immediate environment. For meeting transcripts, this can expose sensitive discussions to third-party handling and retention policies if users are not informed.

External Transmission

Medium
Category
Data Exfiltration
Content
print(json.dumps(prompt + transcript))
")

RESPONSE=$(curl -s https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
Confidence
93% confidence
Finding
The hardcoded remote API endpoint confirms that processing occurs off-device and outside the user's immediate environment. For meeting transcripts, this can expose sensitive discussions to third-party handling and retention policies if users are not informed.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The script silently uploads whatever is provided on stdin to an external LLM API, and users may reasonably assume a local summarizer from the interface alone. This creates privacy and compliance risk if transcripts contain confidential business, legal, HR, or customer data.