T09 · Insecure Skill Coding Practices
- Location
docs/examples/slack-ingestion-workflow.md:69- Finding
Unredacted internal content and personal metadata are disclosed to external services
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is coherent RAG workflow guidance, but its examples can expose internal chats, meetings, and documents unless strong security controls are added before use.
Review this skill before installing if you plan to use it with real company data. Treat the examples as architecture sketches, not secure defaults: restrict approved sources, redact secrets and personal data before external AI calls, require authenticated webhooks and document-level filters, use least-privilege credentials, secure Qdrant and Google Drive backups, define retention/deletion handling, and pin the n8n community node version.
docs/examples/slack-ingestion-workflow.md:69Unredacted internal content and personal metadata are disclosed to external services
docs/examples/rag-agent-workflow.md:151RAG endpoints retrieve company data without caller authentication or document-level authorization
docs/examples/rag-agent-workflow.md:230Untrusted retrieved documents are inserted directly into LLM prompts
docs/examples/rag-agent-workflow.md:181Sensitive search queries may be sent to a sparse encoder over plaintext HTTP
docs/workflows/collection-setup.md:111Full Qdrant payloads are exported to Google Drive without backup security controls
docs/NODE-REFERENCE.md:1Privileged n8n community dependency is installed without version or integrity pinning
The markdown explains collecting payload fields such as authors, source URLs, channel/folder context, participants, and message/transcript content, which are privacy-relevant and can affect user data handling. Under the markdown-specific SQP-2 criteria, the file omits any warning or disclosure about privacy, consent, or sensitivity implications of embedding and storing this data.
The Slack ingestion guidance instructs users to collect channel messages and then later route content through metadata extraction, embeddings, and Qdrant storage without any privacy, consent, or data-handling warning. This is dangerous because users may unknowingly transmit internal communications, personal data, or secrets from Slack to third-party AI/embedding providers and long-term vector storage.
The Fireflies transcript flow covers transcripts, participants, topics, and meeting content, then later sends normalized content into AI extraction and embedding steps, but it never warns that sensitive meeting data may leave the source system. This creates risk of exposing confidential discussions, attendee identities, and regulated information to external processors and searchable vector databases without informed review.
The Google Drive workflow tells users to list, download, and extract file text, which is then fed into downstream AI and vectorization stages, but it omits any warning that document contents may be transmitted externally. This is dangerous because Drive folders often contain confidential business documents, credentials, legal material, or personal data that users may not expect to be processed by external models and persisted for retrieval.
This section explicitly instructs users to send the full document text into an Information Extractor powered by Gemini Flash or GPT-4o-mini, but it does not disclose that entire source documents are being sent to an external LLM. Because the full pre-chunked document is transmitted, the exposure can include all sensitive content in one request, increasing privacy, compliance, and data-leakage risk.
The embedding and upsert stages instruct users to send chunked content to OpenAI embeddings or another embedding API and then persist the resulting representations and metadata in Qdrant, but they do not warn about this external transmission and durable storage. This can lead to silent exfiltration of sensitive text and creation of a long-lived searchable corpus, expanding both breach impact and unauthorized-discovery risk.
The documentation explicitly shows sending retrieved document payloads and user queries to an external re-ranking API, which can disclose internal knowledge-base contents, conversation text, and potentially sensitive metadata to a third party. In a RAG skill, this is materially risky because users may implement the pattern as written without adding consent, minimization, or vendor trust controls.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
- Qdrant n8n Platform Docs: https://qdrant.tech/documentation/platforms/n8n
- Qdrant n8n Tutorial: https://qdrant.tech/documentation/tutorials-build-essentials/qdrant-n8n/
- n8n Qdrant Vector Store Docs: https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.vectorstoreqdrant
- Qdrant API Reference: https://api.qdrant.tech/api-reference
- n8n Self-hosted AI Starter Kit: https://github.com/n8n-io/self-hosted-ai-starter-kit
- FastEmbed (sparse encoding): https://github.com/qdrant/fastembed
The example documents a RAG setup that searches Slack conversations, meeting transcripts, and documents using external LLM and embedding providers, but it does not warn that sensitive company content and user queries may be transmitted to third-party services. In a documentation-driven workflow, this omission can lead operators to deploy the pattern without understanding privacy, compliance, or data residency consequences.
The hybrid search example sends user queries to a sparse encoder service over plain HTTP and later sends query/context to OpenAI, yet the markdown does not disclose these transmissions or their security implications. Because the context is assembled from internal knowledge-base payloads, this can expose sensitive internal data in transit or to external processors without readers realizing it.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
"type": "n8n-nodes-base.httpRequest",
"position": [-600, -80],
"parameters": {
"url": "https://api.openai.com/v1/embeddings",
"method": "POST",
"sendHeaders": true,
"headerParameters": {
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
"type": "n8n-nodes-base.httpRequest",
"position": [-600, -80],
"parameters": {
"url": "https://api.openai.com/v1/embeddings",
"method": "POST",
"sendHeaders": true,
"headerParameters": {
The workflow sends Slack message content to external OpenAI and Qdrant services, but the description and prerequisites omit any privacy, consent, or data-classification warning. In this context, Slack channels frequently contain sensitive internal discussions, credentials, customer data, or regulated information, so silently forwarding that content to third parties materially increases data exposure and compliance risk.
The documentation explicitly states that already-ingested messages are filtered out, but the workflow shown does not implement any deduplication check before sending records to Qdrant. In an ingestion pipeline, this can cause repeated indexing of the same Slack content, leading to duplicated vectors, corrupted retrieval quality, inflated storage/costs, and downstream analysis errors.
The workflow explicitly exports full collection payloads and stores them in Google Drive, which can expose sensitive document content and metadata to a secondary storage location with different access controls, retention, and sharing settings. In a collection-management skill, this is more dangerous because vector collections often contain aggregated application data, and the instructions provide no warning, scoping, redaction, encryption, or least-privilege guidance before exfiltrating the dataset.
The document promotes targeted deletion and filtering out content before ingestion, both of which can affect retained user data and system completeness. However, the markdown does not warn readers that misconfigured identifiers, filters, or deletion criteria could remove needed records or silently omit content.
The examples instruct users to send query text to external embedding and sparse-encoder APIs without noting that search terms may contain sensitive user input or proprietary business context. Although common in AI workflows, omitting any disclosure or caution can lead to unintended data exposure when operators copy the pattern directly into production.
The connections reference a Normalize Fields (passthrough) node that is not defined, which means the merge step may not actually combine original message fields with extracted metadata as intended. This is primarily an integrity and reliability issue: missing original fields can result in malformed upserts, incomplete metadata, or silent failures that undermine traceability of ingested content.
No suspicious patterns detected.