T08 · Insecure Dependencies
- Location
SKILL.md:14- Finding
Unpinned Executable Dependency Creates a Supply-Chain Risk
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is not malicious, but it can change Notion data and delegates credentialed requests to an unpinned or overrideable helper, so it should be reviewed before installation.
Install only if you trust the `notion-api-automation` dependency source and can restrict the Notion integration to the intended DIY_PC data sources. Avoid setting `NOTIONCTL_PATH` unless it points to a reviewed local helper, keep unrelated secrets out of the runtime environment, use plan mode before apply, and do not invoke the deprecated Python script.
SKILL.md:14Unpinned Executable Dependency Creates a Supply-Chain Risk
scripts/notion_apply_records.js:69Configurable Tool Path Allows Execution of Substituted Code with Inherited Secrets
scripts/_deprecated/notion_apply_records.py:495Deprecated Direct-Page Update Bypasses Configured Target Boundaries
scripts/_deprecated/notion_apply_records.py:92Deprecated Script Supports Plaintext Notion Credentials
scripts/_deprecated/notion_apply_records.py:132Raw Notion Error Responses May Leak Private Data into Logs
This second mismatch finding is substantively valid because the skill performs direct Notion create/update/archive operations and additional transformation behavior despite an innocuous ingestion-focused description and no explicit declared permissions. In security review terms, hidden write and archive capabilities are dangerous because they can bypass user expectations and cause integrity loss in a connected SaaS workspace.
This second mismatch finding is substantively valid because the skill performs direct Notion create/update/archive operations and additional transformation behavior despite an innocuous ingestion-focused description and no explicit declared permissions. In security review terms, hidden write and archive capabilities are dangerous because they can bypass user expectations and cause integrity loss in a connected SaaS workspace.
Referenced artifact was not completely inspected
- If `NOTIONCTL_PATH` is set, `scripts/notion_apply_records.js` uses that
Referenced artifact was not completely inspected
- If `NOTIONCTL_PATH` is set, `scripts/notion_apply_records.js` uses that
Referenced artifact was not completely inspected
- If `NOTIONCTL_PATH` is set, `scripts/notion_apply_records.js` uses that
Referenced artifact was not completely inspected
- If `NOTIONCTL_PATH` is set, `scripts/notion_apply_records.js` uses that
Referenced artifact was not completely inspected
- If `NOTIONCTL_PATH` is set, `scripts/notion_apply_records.js` uses that
Referenced artifact was not completely inspected
- If `NOTIONCTL_PATH` is set, `scripts/notion_apply_records.js` uses that
Referenced artifact was not completely inspected
Run from the installed skill directory identified by `SKILL.md` (including owner-qualified paths). Keep private input and plan output outside the repository.
The skill advertises operational capabilities through metadata and workflow steps that rely on environment secrets, file input, and networked Notion access, but it does not declare an explicit tool scope such as permissions or allowed-tools. That weakens reviewability and policy enforcement, making it easier for a host agent to grant broader access than users expect, especially because the skill can write, update, and archive remote Notion data.
The file instructs the agent to "Prefer Japanese column names" as a general rule. This is a natural-language locale constraint, and the document does not provide user opt-in or clearly justify that the skill is region-specific enough to require Japanese naming.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Notion API:
- Query/schema via data_sources
- Create rows via pages with parent.database_id
"""
from __future__ import annotations
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import urllib.request
from dataclasses import dataclass
API = "https://api.notion.com/v1"
DEFAULT_NOTION_VERSION = "2025-09-03"
The page_id/archive escape hatch allows the caller to archive an arbitrary Notion page by ID after only checking that the requested target has configured IDs, but it does not verify that the page actually belongs to that target’s allowed database. In an agent setting, if an upstream LLM or user can supply a page_id, this expands the tool from scoped ingest/upsert into general destructive modification of any page accessible to the integration token.
The manual page_id update path permits direct modification of any Notion page reachable by the API token, bypassing the script’s normal target-scoped lookup and upsert logic. That is dangerous because a caller can write to unrelated records simply by knowing or guessing a page ID, which exceeds the skill’s stated receipt/spec ingestion role and weakens least-privilege assumptions.
This manifest-style JSON includes several hard-coded Japanese property names such as "名前", "型番", "シリアル", and "取り外し表示名" alongside English names. Because the file provides no indication that Japanese locale is required or user-selectable, it may impose a language-specific configuration convention without explicit opt-in.
The manifest says the skill ingests records into DIY_PC Notion tables, but a storage record with mirror_to_pcconfig triggers additional writes into the pcconfig table as a second side effect. This is more than a straightforward ingest/upsert of the provided target record and introduces cross-table propagation not mentioned in the description.
Detected: suspicious.dangerous_exec