Back to skill

Security audit

Flexible Data Importer

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent data-import purpose, but its install instructions may point users to a different package while asking for sensitive database and API credentials.

Review before installing. Do not follow the unscoped install or bare npx examples unless the package identity is corrected and verified. Inspect or require the missing implementation files, use least-privilege Supabase credentials instead of a service role key where possible, avoid uploading sensitive datasets without redaction, and rotate any credentials exposed during testing.

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

T08 · Insecure Dependencies

Error
Location
README.md:17
Finding
Package Identity Mismatch Enables Dependency Confusion<![CDATA[ ## Vulnerability Details **File Location**: `README.md:17`, `README.md:29`, `README.md:36`; `package.json:2`, `package.json:5-9` **Vulnerability Type**: Dependency confusion caused by inconsistent npm package identities **Risk Level**: High ### Vulnerable Code Snippets `README.md:16-18`: ```bash ## Installation ```bash npm install flexible-data-importer ``` ``` `README.md:28-30`: ```bash Run the importer: ```bash npx data-importer ./path/to/my-data.csv ``` ``` `README.md:34-38`: ```typescript import { UniversalImporter, NodeFileAdapter, OpenAILLMAdapter, SupabaseAdapter } from 'flexible-data-importer'; const importer = new UniversalImporter( new NodeFileAdapter(), ``` `package.json:1-9`: ```json { "name": "@sschepis/flexible-data-importer", "version": "1.0.0", "description": "AI-driven data ingestion for CSV, JSON, XLSX with auto-schema generation and Supabase integration.", "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", "bin": { "data-importer": "dist/cli.js" ``` ### Technical Analysis The package declared by `package.json` is the scoped npm package `@sschepis/flexible-data-importer`, while the README directs users to install and import the different, unscoped package `flexible-data-importer`. npm treats scoped and unscoped names as separate package identities. Consequently, users following the documented installation command do not necessarily install the package represented by this repository. An attacker who controls, compromises, or publishes the unscoped package can supply arbitrary JavaScript, lifecycle scripts, or a malicious CLI implementation. The documented `npx data-importer` command compounds the risk because `npx` may locate or download a package that provides the requested executable when it is not already installed locally. Users may therefore execute an unintended package rather than the reviewed scoped package. The repository also lacks the declared `dist/index.js`, `dist/ind ...[truncated 2119 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace every unscoped package reference with the exact manifest identity: - Installation: `npm install @sschepis/flexible-data-importer` - Import: `import { ... } from '@sschepis/flexible-data-importer'` 2. Document CLI execution using the verified scoped package and an explicitly pinned version. Avoid commands that permit implicit retrieval of an unrelated package. 3. Prefer installation from a reviewed lockfile followed by execution through a local npm script or `./node_modules/.bin/data-importer`. 4. Publish the declared `dist/index.js`, `dist/index.d.ts`, and `dist/cli.js` artifacts, or include the corresponding source code and reproducible build configuration in the audited repository. 5. Add automated release checks that compare package names in `README.md`, examples, import statements, lockfiles, and `package.json`. 6. Pin security-sensitive production dependencies to reviewed versions and preserve npm integrity hashes through the lockfile. 7. Test package contents with `npm pack --dry-run` before publishing to verify that all declared entry points are present. 8. Instruct users to provide least-privilege Supabase credentials rather than a service-role key wherever possible. Keep credentials outside source files and rotate any credential exposed to an unintended package. 9. Consider reserving or formally deprecating the confusing unscoped npm name, if organizationally possible, to reduce future impersonation risk. ]]>
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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (23)

Known Vulnerable Dependency: handlebars==4.7.8 — 8 advisory(ies): CVE-2026-33916 (Handlebars.js has Prototype Pollution Leading to XSS through Partial Template In); CVE-2026-33937 (Handlebars.js has JavaScript Injection via AST Type Confusion); CVE-2026-33938 (Handlebars.js has JavaScript Injection via AST Type Confusion by tampering @part) +5 more

Critical
Category
Supply Chain
Confidence
94% confidence
Finding
handlebars 4.7.8 has numerous severe advisories including prototype pollution and possible code or script injection paths. Although present here as a dev dependency through ts-jest rather than core runtime logic, such flaws are dangerous if templates or AST-like inputs can be influenced during tests, generation steps, or CI automation.

Hidden Instructions

High
Category
Prompt Injection
Content
# OpenClaw Data Importer Skill

<!-- SKILL-META
id: flexible-data-importer
version: 1.0.0
author: OpenClaw
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Known Vulnerable Dependency: brace-expansion==2.0.2 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
89% confidence
Finding
brace-expansion 2.0.2 has multiple reported DoS issues involving pathological expansion patterns that can hang or exhaust memory. Even though it is transitive and primarily used by tooling, the vulnerability is genuine and could affect any workflow that matches attacker-controlled glob-like patterns.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
84% confidence
Finding
browserslist 4.28.1 is flagged for crash/prototype-write and memory growth issues, indicating real unsafe behavior under untrusted input. In this project it is part of the development toolchain rather than runtime import logic, which reduces but does not eliminate risk if CI or local tooling ingests attacker-controlled configuration or stats.

Known Vulnerable Dependency: picomatch==4.0.3 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
83% confidence
Finding
picomatch 4.0.3 is reported with method-injection and ReDoS issues, which are plausible and materially relevant when matching attacker-controlled glob expressions. Here it is nested under jest tooling, so the vulnerability is real but mainly threatens build/test environments rather than the importer's production runtime.

Known Vulnerable Dependency: js-yaml==3.14.2 — 4 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +1 more

High
Category
Supply Chain
Confidence
90% confidence
Finding
js-yaml 3.14.2 has multiple CPU-consumption issues that can be triggered with crafted YAML merge structures, making it a real denial-of-service risk. In this lockfile it is only a transitive dev dependency, so exploitability depends on whether build/test tooling parses attacker-supplied YAML.

Known Vulnerable Dependency: minimatch==9.0.5 — 3 advisory(ies): CVE-2026-27904 (minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regu); CVE-2026-26996 (minimatch has a ReDoS via repeated wildcards with non-matching literal in patter); CVE-2026-27903 (minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adja)

High
Category
Supply Chain
Confidence
88% confidence
Finding
minimatch 9.0.5 is flagged for several ReDoS-style issues caused by pathological patterns that trigger expensive matching behavior. The issue is real, though in this project it appears as a transitive development dependency, so the main risk is denial of service in tooling that processes attacker-controlled glob patterns.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The README describes sending local CSV/JSON/XLSX data to both an LLM and Supabase for schema inference and import, but it does not warn that file contents and potentially sensitive fields may be transmitted to third-party services. In a data-import skill, this omission is security-relevant because users may unintentionally expose regulated, proprietary, or personal data during analysis and upload.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding
The README instructs users to run an unpinned package via `npx data-importer`, which causes code to be fetched and executed at install/runtime without fixing the version or integrity. If the package is updated maliciously, compromised, or a typosquatted package is resolved, users could execute unexpected code in their environment.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill explicitly requests a Supabase service role key and advertises schema creation, which implies privileged database-modifying operations. Because the skill description does not clearly warn that it can alter database structure and that the supplied credential is highly sensitive, users may provide overprivileged secrets without understanding the risk of destructive changes or credential misuse.

Missing User Warnings

Low
Confidence
82% confidence
Finding
The README tells users to place `SUPABASE_URL`, `SUPABASE_KEY`, and `OPENAI_API_KEY` in a `.env` file but does not include guidance on secure storage, least privilege, or keeping secrets out of source control. This increases the chance of accidental credential exposure, especially in example-driven setups where users may commit `.env` files or use overly privileged keys.

Known Vulnerable Dependency: @babel/core==7.29.0 — 1 advisory(ies): CVE-2026-49356 (@babel/core: Arbitrary File Read via sourceMappingURL Comment)

Low
Category
Supply Chain
Confidence
82% confidence
Finding
@babel/core 7.29.0 is flagged for an arbitrary file read via sourceMappingURL handling. In this lockfile it appears only as a dev/test dependency, so exposure is limited to development or CI workflows that process untrusted JavaScript, but the dependency issue itself is real.

Known Vulnerable Dependency: baseline-browser-mapping==2.9.19 — 1 advisory(ies): CVE-2026-45819 (baseline-browser-mapping process termination on invalid input causes denial of s)

Low
Category
Supply Chain
Confidence
71% confidence
Finding
baseline-browser-mapping 2.9.19 is reported as vulnerable to process termination on invalid input, which is a real dependency-level denial-of-service concern. However, it is a transitive dev dependency used in tooling, so the practical risk to the shipped skill is low unless untrusted input is fed into the affected tooling pipeline.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"author": "OpenClaw",
  "license": "MIT",
  "dependencies": {
    "@supabase/supabase-js": "^2.39.0",
    "csv-parser": "^3.0.0",
    "dotenv": "^16.3.1",
    "xlsx": "^0.18.5",
Confidence
93% confidence
Finding
Using a caret version range for a runtime dependency allows newer package versions to be installed without explicit review, which can introduce supply-chain risk if a compromised or breaking release is published. In a package that integrates with external services and processes imported data, unintended dependency drift can affect security posture and runtime behavior.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"license": "MIT",
  "dependencies": {
    "@supabase/supabase-js": "^2.39.0",
    "csv-parser": "^3.0.0",
    "dotenv": "^16.3.1",
    "xlsx": "^0.18.5",
    "zod": "^3.22.4"
Confidence
93% confidence
Finding
Using a caret version range for a runtime dependency allows newer package versions to be installed without explicit review, which can introduce supply-chain risk if a compromised or breaking release is published. Because this tool ingests external data, dependency changes in parsing libraries can materially affect input handling and security assumptions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"dependencies": {
    "@supabase/supabase-js": "^2.39.0",
    "csv-parser": "^3.0.0",
    "dotenv": "^16.3.1",
    "xlsx": "^0.18.5",
    "zod": "^3.22.4"
  },
Confidence
91% confidence
Finding
Using a caret version range for a runtime dependency permits automatic adoption of later releases, increasing exposure to supply-chain compromise or unreviewed security regressions. Even for configuration-related libraries, unpinned updates can alter startup behavior or secrets handling unexpectedly.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"@supabase/supabase-js": "^2.39.0",
    "csv-parser": "^3.0.0",
    "dotenv": "^16.3.1",
    "xlsx": "^0.18.5",
    "zod": "^3.22.4"
  },
  "devDependencies": {
Confidence
95% confidence
Finding
Using a caret version range for the xlsx runtime dependency introduces supply-chain risk and is somewhat more sensitive here because spreadsheet parsers are historically exposed to malformed-file handling issues. An unreviewed update could introduce a vulnerable parser version or unexpected behavior when processing attacker-controlled files.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"csv-parser": "^3.0.0",
    "dotenv": "^16.3.1",
    "xlsx": "^0.18.5",
    "zod": "^3.22.4"
  },
  "devDependencies": {
    "@types/jest": "^30.0.0",
Confidence
92% confidence
Finding
Using a caret version range for a runtime dependency allows dependency drift and increases supply-chain exposure if a future release is compromised or introduces insecure behavior. In a data-import utility, schema validation behavior changing unexpectedly can weaken assumptions about accepted input.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"zod": "^3.22.4"
  },
  "devDependencies": {
    "@types/jest": "^30.0.0",
    "@types/node": "^20.19.31",
    "jest": "^30.2.0",
    "ts-jest": "^29.4.6",
Confidence
82% confidence
Finding
Using a caret range for a development dependency still creates supply-chain risk during local development and CI, where malicious or compromised packages could execute in the build or test environment. The risk is lower than for runtime dependencies but not negligible, especially if CI has access to repository secrets or publish credentials.

Unpinned Dependencies

Low
Category
Supply Chain
Content
},
  "devDependencies": {
    "@types/jest": "^30.0.0",
    "@types/node": "^20.19.31",
    "jest": "^30.2.0",
    "ts-jest": "^29.4.6",
    "typescript": "^5.3.0"
Confidence
82% confidence
Finding
An unpinned development dependency can change across installs, creating non-reproducible builds and opening a path for supply-chain attacks in developer or CI environments. While type definitions are less directly dangerous at runtime, they still arrive from the package registry and can affect build pipelines.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"devDependencies": {
    "@types/jest": "^30.0.0",
    "@types/node": "^20.19.31",
    "jest": "^30.2.0",
    "ts-jest": "^29.4.6",
    "typescript": "^5.3.0"
  }
Confidence
85% confidence
Finding
Using a caret range for a test framework can expose CI and developer machines to supply-chain compromise or unexpected install-time behavior if a malicious or vulnerable release is pulled in automatically. The primary risk is to the build and test environment rather than the distributed runtime artifact.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"@types/jest": "^30.0.0",
    "@types/node": "^20.19.31",
    "jest": "^30.2.0",
    "ts-jest": "^29.4.6",
    "typescript": "^5.3.0"
  }
}
Confidence
84% confidence
Finding
A caret version for a build/test tool allows unreviewed updates into developer and CI workflows, increasing supply-chain and reproducibility risk. Compromise of tooling dependencies can affect transpilation, tests, or published artifacts even if the package is not used at runtime.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"@types/node": "^20.19.31",
    "jest": "^30.2.0",
    "ts-jest": "^29.4.6",
    "typescript": "^5.3.0"
  }
}
Confidence
84% confidence
Finding
An unpinned compiler dependency can introduce supply-chain risk and non-reproducible builds, including the possibility of a malicious or flawed compiler release affecting generated artifacts. Although this is a dev dependency, it can still materially impact what code is built and shipped.

Static analysis

No suspicious patterns detected.