Back to skill

Security audit

Notion Integration

Security checks for vulnerabilities and agentic risk

Overview

This is a straightforward Notion integration that uses a Notion API key to search, query, and create Notion pages, with no evidence of hidden or unrelated behavior.

Install only if you are comfortable giving this skill a Notion integration token. Share only the Notion pages or databases it needs, treat NOTION_API_KEY as a secret, and confirm page-creation requests before letting an agent write content to Notion.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (12)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill declares use of an environment secret and network-capable code but does not define any explicit tool scope such as permissions or allowed-tools. This creates an over-permissive trust boundary where an agent runtime may grant broader access than necessary, increasing the risk of secret exposure or unintended outbound requests if the implementation is modified or behaves unexpectedly.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest exposes a content-modifying capability via notion_create_page but provides no user-facing warning or constraint about when writes to Notion should occur. In an agent setting, this can lead to unintended page creation, spam, or unauthorized content changes if the skill is invoked from ambiguous prompts or without explicit confirmation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill explicitly supports creating pages and querying/searching databases in an external SaaS system, but the instructions do not warn that use of the skill can create or modify third-party data. This can mislead users or agents into taking state-changing actions without adequate confirmation, increasing the risk of unintended data creation, modification, or disclosure in Notion.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instructions tell users to set a NOTION_API_KEY but provide no guidance on secure credential handling. This increases the chance that users expose the API key in prompts, logs, screenshots, shell history, or insecure environment configurations, which could allow unauthorized access to Notion workspaces and their contents.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · notion.py (reported line 6)May include surrounding context.

python
from typing import Optional, Dict, Any, List

NOTION_API_KEY = os.getenv("NOTION_API_KEY", "")
BASE_URL = "https://api.notion.com/v1"


class NotionClient:

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The create_page function transmits the provided title and content to the Notion API using requests.post, which can affect user data and privacy. In this code file there is no confirmation prompt, user-facing disclosure, or warning string indicating that the content will be sent to an external service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · notion.py (reported line 41)May include surrounding context.

python
try:
            loop = asyncio.get_event_loop()
            resp = await loop.run_in_executor(None, lambda: requests.post(url, headers=self.headers, json=payload, timeout=30))
            data = resp.json()
            if resp.status_code == 200:
                return {"success": True, "page_id": data.get("id")}

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · notion.py (reported line 57)May include surrounding context.

python
try:
            loop = asyncio.get_event_loop()
            resp = await loop.run_in_executor(None, lambda: requests.post(url, headers=self.headers, json=payload, timeout=30))
            data = resp.json()
            if resp.status_code == 200:
                return {"success": True, "page_id": data.get("id")}

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · notion.py (reported line 74)May include surrounding context.

python
try:
            loop = asyncio.get_event_loop()
            resp = await loop.run_in_executor(None, lambda: requests.post(url, headers=self.headers, json=payload, timeout=30))
            data = resp.json()
            if resp.status_code == 200:
                return {"success": True, "page_id": data.get("id")}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The query_database function issues a network request to the Notion API that retrieves database contents from the user's workspace. The code contains no visible warning, prompt, or disclosure that workspace data will be accessed from an external service.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The description 'Manage pages, databases, and content in Notion' is broad and does not define safe invocation boundaries, making it easier for an agent to over-select this skill for loosely related requests. Because the skill includes both read and write actions, vague scope increases the chance of unnecessary access to Notion data or accidental modifications.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The search function sends the user's query to the Notion API via an HTTP request, but there is no confirmation prompt, print/log disclosure, or explanatory docstring in this file. Because search terms may contain sensitive information, users should be informed before transmission.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.