Back to skill

Security audit

Data Management Plan Creator

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent DMSP draft generator, but it should be reviewed because it always saves research details to disk and accepts unrestricted output paths that can overwrite writable files.

Install only if you are comfortable with this tool writing DMSP drafts locally. Avoid entering PHI, patient identifiers, unpublished sensitive study details, or confidential grant information unless the workspace is approved for that data. Use a controlled output location and do not pass untrusted paths to --output.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/main.py:415
Finding

Unrestricted Output Path Allows Arbitrary File Overwrite

Content
View full analysis
str: """Save generated plan to file.""" if not filepath: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filepath = f"dmsp_{timestamp}.md" Path(filepath).write_text(self.generated_content, encoding="utf-8") return filepath ``` ### Technical Analysis The `--output` argument is passed to `save_to_file()` and then used directly by `Path.write_text()`. There is no canonicalization, allowed-directory check, filename validation, exclusive-create mode, or symbolic-link protection. Consequently, the program can overwrite any existing file writable by the process. Absolute paths and parent-directory traversal sequences such as `../` are accepted. `Path.write_text()` also follows symbolic links, permitting a link at the selected output location to redirect the write to another writable target. This is especially relevant because the documentation's security checklist states that output should be restricted to the workspace and that `../` traversal should be rejected, but the implementation does neither. ### Attack Path 1. An attacker gains control over the `--output` value, such as through an automation job, service wrapper, CI parameter, or other system that invokes this script with externally supplied arguments. 2. The attacker supplies an absolute path or traversal path pointing to a file writable by the script's operating-system account: ```bash python scripts/main.py \ --project-title "Injected content" \ --pi-name "Attacker" \ --institutio ...[truncated 1411 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unnecessary and Unpinned Third-Party Dataclasses Dependency

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill documents local file-writing behavior and script execution, but it does not declare any explicit tool scope such as permissions or allowed-tools. That omission weakens least-privilege controls because an agent or runner may permit file write operations without a clear, reviewable policy boundary, increasing the chance of unintended writes or abuse if the skill is invoked with unsafe paths.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The usage examples encourage generating DMSP drafts from project, institutional, and potentially clinical research details, then saving them to markdown files, but they do not warn users that sensitive or regulated information may be included in those outputs. In this context, the omission matters because DMSPs for biomedical research can contain identifying, confidential, or sensitive study details that may be written to shared workspaces or later exposed inadvertently.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The tool always persists generated content to disk, even when the user may only expect stdout or JSON output. Because the content includes project titles, PI names, institutions, repository choices, access restrictions, and contact emails, this creates an unintended data exposure and retention risk on shared systems or agent environments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script stores user-supplied research and contact information without explicit consent, warning, or opt-in. In the context of a data-management planning skill, the inputs may include sensitive operational details about data handling, access restrictions, and personnel, so silent persistence raises confidentiality and compliance concerns.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
dataclasses

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The CLI help text says JSON output is an alternative to Markdown, but the implementation still writes the generated Markdown content to a file afterward. This mismatch can mislead users into believing no Markdown artifact is created, increasing the chance that sensitive planning data is silently left behind on disk.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · scripts/main.py (reported line 525)May include surrounding context.

python
# Validate required args
        required = ["project_title", "pi_name", "institution", "data_types"]
        missing = [f"--{r.replace('_', '-')}" for r in required 
                   if not getattr(args, r)]
        if missing:
            parser.error(f"Missing required arguments: {', '.join(missing)}")

Static analysis

No suspicious patterns detected.