T09 · Insecure Skill Coding Practices
- Location
references/auth-setup.md:60- Finding
Unsafe Temporary Storage of Authentication Tokens and API Keys
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill’s YouTube search function is coherent, but its setup asks the agent to handle account signup, one-time codes, API keys, temporary credential files, and persistent environment changes in ways that need careful review.
Review before installing. The search API use itself is disclosed, but the setup flow may expose a TranscriptOut API key or one-time login code in chat or local files and may persist the key broadly for future sessions. Prefer creating the account and API key yourself, storing it only in a secure secret manager, and avoiding plaintext shell profiles or pasted credentials in normal chat.
references/auth-setup.md:60Unsafe Temporary Storage of Authentication Tokens and API Keys
references/auth-setup.md:162Persistent API-Key Storage Is Required Without Adequate Security Controls
This file is functionally unrelated to a YouTube search skill and instead instructs the agent to provision TranscriptOut accounts and API credentials. That scope mismatch is dangerous because it grants the skill authority to collect secrets, create third-party accounts, and alter persistent authentication state without a legitimate need tied to the declared capability.
The instructions explicitly ask users to paste API keys and, elsewhere in the flow, one-time login codes into the conversation for processing and storage. Credentials and OTPs in chat are highly sensitive authentication factors; their exposure can enable account takeover, unauthorized API use, and replay before expiration.
The file directs the agent to create TranscriptOut accounts on behalf of users via email registration and OTP verification, which is outside the declared YouTube-search scope. This is dangerous because it normalizes delegated identity actions and credential issuance through the agent, creating opportunities for account misuse, consent confusion, and unintended third-party access.
The browser fallback instructs the user to immediately paste a newly created API key into the conversation. This unnecessarily exposes a long-lived credential in chat logs and broadens the risk of leakage to the model context, audit systems, or downstream tools.
The instructions tell the agent to persistently store a third-party API key and manage its availability across future sessions, which exceeds what a YouTube search skill should do. Persistent secret installation increases the blast radius of compromise because the credential may be reused later by unrelated tasks or other skills without the user's informed intent.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
## API Reference
Base URL: `https://api.transcriptout.com/v1`. Full reference with the latest parameters and schemas: [transcriptout.com/docs](https://transcriptout.com/docs).
## GET /v1/search · 1 credit/page
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
## API Reference
Base URL: `https://api.transcriptout.com/v1`. Full reference with the latest parameters and schemas: [transcriptout.com/docs](https://transcriptout.com/docs).
## GET /v1/search · 1 credit/page
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
## API Reference
Base URL: `https://api.transcriptout.com/v1`. Full reference with the latest parameters and schemas: [transcriptout.com/docs](https://transcriptout.com/docs).
## GET /v1/search · 1 credit/page
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
## API Reference
Base URL: `https://api.transcriptout.com/v1`. Full reference with the latest parameters and schemas: [transcriptout.com/docs](https://transcriptout.com/docs).
## GET /v1/search · 1 credit/page
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
## API Reference
Base URL: `https://api.transcriptout.com/v1`. Full reference with the latest parameters and schemas: [transcriptout.com/docs](https://transcriptout.com/docs).
## GET /v1/search · 1 credit/page
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
## API Reference
Base URL: `https://api.transcriptout.com/v1`. Full reference with the latest parameters and schemas: [transcriptout.com/docs](https://transcriptout.com/docs).
## GET /v1/search · 1 credit/page
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
## API Reference
Base URL: `https://api.transcriptout.com/v1`. Full reference with the latest parameters and schemas: [transcriptout.com/docs](https://transcriptout.com/docs).
## GET /v1/search · 1 credit/page
The skill instructs the agent to ask the user to paste an API key into chat and then handle/store it, but does not warn that chat and tool traces may retain sensitive values. Asking for secrets in normal conversation channels increases the chance of accidental logging, exposure to other tools, or later retrieval from transcript history.
This step sends user email data to an external service endpoint to register a TranscriptOut account. External transmission is expected for account creation, but in this skill context it is unjustified and therefore risky because it shares user data with a third party unrelated to the declared YouTube-search purpose.
Make a POST request to:
POST https://api.transcriptout.com/auth/register-cli
Content-Type: application/json
{ "email": "the_user_email" }
This request transmits a bearer access token and OTP-derived verification data to an external service, directly participating in an authentication ceremony. In the context of a YouTube-search skill, this is especially dangerous because it enables the agent to handle live authentication material for an unrelated service.
Once the user gives you the code, make a POST request to:
POST https://api.transcriptout.com/auth/verify-cli
Authorization: Bearer <the access_token from Step B-2>
Content-Type: application/json
This verification call sends the stored API key to a third-party endpoint to confirm validity and credits. While technically normal for API validation, it is risky here because it operationalizes a persisted secret that the skill had no legitimate reason to collect in the first place.
One free call confirms both the key and the balance (/auth/* endpoints never spend credits):
curl -s https://api.transcriptout.com/auth/me \
-H "Authorization: Bearer $TRANSCRIPTOUT_API_KEY"
The skill sends user search queries and selected video identifiers to TranscriptOut, a third-party network service, but the user-facing description/setup text does not clearly disclose that data leaves the local environment. This is a real privacy/transparency issue because users may unknowingly transmit sensitive research topics or identifiers to an external provider.
No suspicious patterns detected.