Back to skill

Security audit

Method Dev Agent

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a local lab-recording app, but its bundled publishing workflow can upload all unignored project files, including sensitive lab data, to a fixed GitHub remote without review.

Review the publishing files before installing or reusing this skill. Do not run publish.sh or the git publishing commands from a working copy that contains experiment databases, exports, .env files, credentials, or confidential lab records. Use a virtual environment with pinned dependencies, keep sensitive pharmaceutical or regulated data out of unapproved deployments, and verify the payment recipient through an independent trusted channel before sending cryptocurrency.

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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
src/utils.py:130
Finding

Path Traversal in CSV Export Filename

Content
View full analysis
str: """Export data to CSV.""" import csv import os filepath = os.path.join('data', 'exports', filename) os.makedirs(os.path.dirname(filepath), exist_ok=True) if not data: return "" with open(filepath, 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=data[0].keys()) writer.writeheader() writer.writerows(data) ``` ### Technical Analysis The function incorporates the caller-controlled `filename` directly into a filesystem path without rejecting absolute paths, parent-directory components, symbolic-link traversal, or other path separators. `os.path.join()` does not enforce containment. A value such as `../../target.csv` can escape `data/exports`, while an absolute filename can cause the preceding path components to be discarded. The destination is then opened in write mode, which creates the file or truncates an existing file. This function is not currently called by `src/app.py`, so the reviewed application does not expose a direct remote exploit path. It nevertheless creates an unsafe reusable capability that becomes exploitable if connected to user input, an API, a plugin, or another automation workflow. ### Attack Path 1. An attacker gains control over the `filename` argument through a future interface or an internal caller. 2. The attacker supplies a traversal path such as `../../outside.csv` or an absolute path. 3. `os.path.join('data', 'exports', filename)` produces a path outside the intended export directory. 4. `os.makedirs()` may create attacker-selected directories. 5. `open(..., 'w')` creates or truncates the selected file. 6. CSV data controlled through the `data` argument is written unde ...[truncated 574 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
publish.sh:14
Finding

Publishing Script Can Commit and Upload Sensitive Runtime Files

Content
View full analysis
/dev/null; then echo "[INFO] Adding GitHub remote..." git remote add origin https://github.com/teagec/t2.git fi echo "" echo "[2/4] Committing code to Git..." git add . git commit -m "v0.1.0 ready for publish" echo "" echo "[3/4] Pushing to GitHub..." if ! git push -u origin main; then ``` The application places its runtime database inside the project tree: ```python if db_path is None: # Default storage in the project data directory current_dir = Path(__file__).parent.parent db_path = current_dir / "data" / "method_dev.db" ``` ### Technical Analysis `git add .` stages every unignored file beneath the project directory. The script neither uses an explicit release allowlist nor displays the staged changes for confirmation before committing and pushing them. The application stores laboratory method and experiment records in `data/method_dev.db`, beneath the same project root. Other local files, such as exports, configuration files, credentials, environment files, or editor artifacts, may also exist there during normal use. If those files are not excluded by repository ignore rules, running the publishing script can commit and transmit them. The script also automatically installs a fixed GitHub remote when no `origin` exists. Although this is documented publishing behavior rather than covert exfiltration, it increases the likelihood that a user will upload the complete working tree without first validating the destination or staged contents. ### Attack Path 1. The user runs the application or otherwise creates sensitive runtime data under the project directory. 2. A database, export, credential file, environment file, or another private artifact remains unignored. 3. The user follows the one-cli ...[truncated 1035 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unpinned and Unverified Third-Party Dependencies

Content
View full analysis
=1.28.0 pandas>=2.0.0 plotly>=5.18.0 numpy>=1.24.0 python-dateutil>=2.8.0 ``` The skill instructions also recommend an unpinned installation: ```bash pip install streamlit pandas plotly ``` ### Technical Analysis Every dependency is specified with an open-ended lower bound. Consequently, installations performed at different times can resolve to different package versions, including major releases not reviewed with this project. No lock file, package hashes, or package-index constraints are supplied. The audit found no evidence that the named dependencies are intentionally malicious or typosquatted. The risk arises from mutable dependency resolution and the absence of integrity controls: a compromised upstream release, unexpected breaking version, or package-index substitution could cause unreviewed code to be installed and executed. Python package installation may execute build backend logic, and imported dependencies subsequently execute with the same privileges as the application process. ### Attack Path 1. A user follows the installation instructions or runs `pip install -r requirements.txt`. 2. The package resolver selects the latest versions satisfying the broad lower bounds. 3. A selected release differs from the versions originally tested or reviewed. 4. If an upstream package, release artifact, dependency chain, or configured package index is compromised, malicious or vulnerable code is installed. 5. Installation-time hooks or later imports execute that code with the installing or application user's privileges. This is a conditional supply-chain path; the reviewed repository itself does not contain evidence of an existing malicious dependency. ### Impact Assessment A compromised dependency can generally perform any actio ...[truncated 446 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (31)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This markdown file contains publication steps that execute git add ., git commit, and git push origin main, which can transfer local code and data to a remote repository. The guide does not warn users to review staged files or confirm that no sensitive content is included before pushing.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The entire skill description and usage instructions are presented only in Chinese, with no indication that users may choose another language or that the skill is intentionally limited to a Chinese-speaking environment. The policy requires avoiding language or locale constraints unless they are opt-in or clearly justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill explicitly promotes systematic recording, storage, retrieval, and analysis of laboratory experiment data, sample information, and method knowledge, but it provides no warning or safeguards for handling proprietary, regulated, or sensitive laboratory data. In a pharmaceutical analysis context, these records may contain confidential formulations, stability data, internal methods, or client information, creating a realistic risk of inappropriate disclosure or unsafe data handling.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The publish command hard-codes a Chinese skill name and changelog in user-facing metadata. This imposes a specific language/locale choice without any indication that the user can select or override it, which matches the language-policy violation criteria.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The application title and interface strings are written in Chinese throughout the file, starting with the module docstring and app description. There is no visible option for users to choose another language and no indication that the tool is intentionally limited to a Chinese-speaking or region-specific context.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The data analysis page embeds a cryptocurrency upsell with a hard-coded wallet address and payment instructions unrelated to the core local experiment-recording workflow. Even without direct fund transfer code, this introduces a social-engineering/payment-collection surface inside a scientific app, which could mislead users into sending funds, especially because it is presented as part of product functionality.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file-level documentation is written in Chinese only (for example, "数据模型定义"), and class/docstring text throughout the file also uses Chinese without indicating that the user can choose another language. This creates a locale/language constraint in natural-language content with no opt-in or documented justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The content actively encourages using an AI assistant to capture experiment records, query method parameters, and generate analytical outputs, but provides no warning about handling regulated laboratory data, proprietary methods, or personal information. In a pharmaceutical/laboratory context, this can lead users to paste sensitive experimental data into unapproved AI systems, creating confidentiality, compliance, and data-governance risks.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The lead-generation section encourages distributing experiment-record templates and method-development SOP materials via comments and private messages without any sensitivity screening or access controls. Laboratory templates and SOPs can contain proprietary workflows, validation practices, internal naming conventions, or compliance-relevant structure that should not be casually shared in public marketing flows.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown content appears to force a single language for the skill artifact, and there is no indication that users may choose another language or that the skill is intentionally limited to a Chinese-speaking audience. Under the policy rule, a fixed language without opt-in or justification is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

A natural-language policy issue exists when a skill effectively forces a specific language without user opt-in. This README is fully Chinese-language and does not indicate that users can choose another language or that the tool is intentionally limited to a Chinese-speaking audience.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README promotes systematic recording, structured storage, and retrieval of experimental methods and results, but it does not mention any safeguards for sensitive laboratory, proprietary, or regulated data. In a pharmaceutical analysis context, this can lead users to store confidential formulations, methods, or validation data without access controls, retention rules, or redaction guidance, increasing risk of IP leakage or compliance violations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file contains user-facing operational instructions only in Chinese, and there is no indication that the skill is region-specific or that users may choose another language. Per the policy, forcing a specific language without opt-in can be a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

A language or locale policy issue exists when a skill effectively forces a specific language without user choice. This file is fully written in Chinese and does not mention that other languages are supported or that Chinese is an intentional opt-in or region-specific constraint.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The dependency is specified with a lower-bound range (>=1.28.0) instead of an exact version, which makes builds non-reproducible and can cause different installations to resolve to different releases over time. This increases supply-chain risk because a newly published vulnerable or malicious upstream release could be installed without any manifest change.

Content

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

text
streamlit>=1.28.0
pandas>=2.0.0
plotly>=5.18.0
numpy>=1.24.0

Unverifiable Dependency: streamlit has 11 known advisory(ies) (CVE-2026-33682 (Unauthenticated SSRF Vulnerability in Streamlit on Windows (NTLM Credential Expo); GHSA-8qw9-gf7w-42x5 (Minor fix to previous patch for CVE-2022-35918); CVE-2023-27494 (Streamlit publishes previously-patched Cross-site Scripting vulnerability) +8 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
93% confidence
Finding

streamlit has known security advisories, but because the manifest is not pinned, it is impossible to determine whether the installed version is affected. In this skill context, Streamlit is likely internet-facing UI infrastructure, so unresolved version ambiguity increases the chance of deploying a release with exploitable web-facing flaws such as XSS or SSRF-related issues.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

Using pandas>=2.0.0 allows any newer version to be installed, preventing reproducible builds and making it difficult to know exactly which code will run in production. If an upstream release introduces a security issue or breaking behavior, environments may become exposed automatically.

Content

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

text
streamlit>=1.28.0
pandas>=2.0.0
plotly>=5.18.0
numpy>=1.24.0
python-dateutil>=2.8.0

Unverifiable Dependency: pandas has 1 known advisory(ies) (CVE-2020-13091 (** DISPUTED ** pandas through 1.0.3 can unserialize and execute commands from an)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding

pandas has at least one security advisory, and the lack of version pinning prevents verification that a safe release will be installed. The context here makes exploitation less direct than a network-exposed package, but ambiguous dependency resolution still creates avoidable supply-chain and maintenance risk.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The unpinned plotly>=5.18.0 requirement permits uncontrolled version drift across installs. While not immediately exploitable by itself, it weakens supply-chain integrity and complicates vulnerability tracking and incident response.

Content

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

text
streamlit>=1.28.0
pandas>=2.0.0
plotly>=5.18.0
numpy>=1.24.0
python-dateutil>=2.8.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

Specifying numpy>=1.24.0 without an upper bound or exact pin means future releases may be installed implicitly. This creates a supply-chain exposure window and makes it harder to assess whether deployed environments are affected by known issues.

Content

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

text
streamlit>=1.28.0
pandas>=2.0.0
plotly>=5.18.0
numpy>=1.24.0
python-dateutil>=2.8.0

Unverifiable Dependency: numpy has 16 known advisory(ies) (CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
90% confidence
Finding

numpy has multiple historical advisories, and because the dependency is not pinned, the effective installed version cannot be verified against those issues. Although NumPy is not typically directly exposed, it is widely used in parsing and native-code-heavy operations, so uncertainty around deployed versions can increase the blast radius of memory-safety or file-handling flaws.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.