Back to skill

Security audit

fulcra-ingest

Security checks for vulnerabilities and agentic risk

Overview

The skill’s ingestion purpose is coherent, but it gives an agent recurring automation, account-data mutation, deletion, and unpinned runtime tool execution authority that users should review carefully.

Install only if you are comfortable letting the agent operate on Fulcra File Store data and annotations. Before use, pin and review the `fulcra-api` CLI version, avoid always-on automation unless you explicitly need it, require confirmations for deletions and re-ingestion, and understand what external sources may be fetched or enriched.

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)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:43
Finding

Unpinned Runtime Dependency Execution

Content
View full analysis
ingest/`. ``` ```markdown - Use `uvx fulcra-api file list` to check the `ingest/` directory. Explicitly ignore the `_meta/` folder and any `.md` files. ``` ```markdown - **Retrieval:** Execute `uvx fulcra-api file download ./`. ``` ```markdown - Example commands: - `uvx fulcra-api file download ingest/NetflixViewingHistory.csv ./NetflixViewingHistory.csv` (if not already downloaded) - `uvx fulcra-api file upload ./NetflixViewingHistory.csv ingest/_meta/archive/artifact/20260625-143000_NetflixViewingHistory.csv` - **Safety Check:** Before deleting the original file, you MUST verify that the file was successfully uploaded to the archive path (e.g., `uvx fulcra-api file list ingest/_meta/archive/artifact/` or `uvx fulcra-api file stat ingest/_meta/archive/artifact/20260625-143000_NetflixViewingHistory.csv`). ``` From `references/fulcra-ingest-source-mapping.md`: ```markdown Use `uvx fulcra-api file download` to attempt to pull `ingest/_meta/source_map.md`. ``` ```markdown - Fall back to the standard Idempotency Check (run `uvx fulcra-api catalog` to see if a schema was created manually by the user). - If still not found, create the new schema via `uvx fulcra-api data-type create` (always use `--add-to-timeline`). ``` ```markdown - Save the Markdown file locally and upload it back to Fulcra using `uvx fulcra-api file upload ./source_map.md ingest/_meta/source_map.md`, overwriting the previous version. ``` ### Technical Analysis The Skill repeatedly invokes `fulcra-api` through `uvx` without specifying an exact package version, lockfile, package hash, or veri ...[truncated 1930 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/generate_deterministic_id.py:13
Finding

Collision-Prone Deterministic Record Identifier Construction

Content
View full analysis
"a||b||c" ["a", "b||c"] -> "a||b||c" ``` They therefore produce the same UUID without requiring a cryptographic hash collision. Converting arbitrary values with `str()` also removes type information, so values with different original types may become indistinguishable. In addition, the implementation uses MD5, which is not collision-resistant against deliberate attacks. Although MD5 is being used for deterministic naming rather than password storage, collision resistance is relevant because the resulting UUID is treated as the unique identity of a record. The surrounding ingestion design states that the backend safely ignores duplicate record IDs. Consequently, a collision can cause one distinct record to be treated as an already-ingested duplicate. ### Attack Path 1. An attacker or malformed third-party export supplies deterministic-ID fields containing the `||` delimiter, or otherwise supplies fields that serialize identically after `str()` conversion. 2. The ingestion process passes those fields to `generate_deterministic_uuid`. 3. Two logically distinct records produce the same concatenated byte sequen ...[truncated 1220 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (43)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description describes a skill that ingests third-party export data from Fulcra File Store and maps it into Fulcra Annotations. The supplied code does none of that. It is a standalone helper script for generating deterministic IDs from input strings using an MD5 hash and UUID formatting. It does not access files, external services, Fulcra resources, annotations, or ingestion pipelines, and its primary purpose is materially different from the declared purpose.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill is user-invocable and described in broad, highly autonomous terms without tight invocation boundaries. That increases the chance an agent will activate the skill in situations where user intent is ambiguous, causing unnecessary access to uploaded files, external fetching, or ingestion actions that the user did not clearly request.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The guidance explicitly permits setting up a cron job, continuous loop, or heartbeat reminder to keep checking for new files or fetch data from other sources. Even with some consent language, this creates an ambiguous path to persistent autonomous behavior that can repeatedly access data stores and external sources, increasing privacy, cost, and misuse risk if triggered too broadly or configured incorrectly.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

The skill instructs the agent to invoke uvx fulcra-api without pinning an exact package/tool version. Because uvx resolves and runs the latest available package by default, a compromised upstream release or breaking change could alter ingestion, deletion, or upload behavior and lead to supply-chain execution risk against user data and credentials.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

This command again relies on an unpinned uvx fulcra-api execution path. In this skill, the tool is used to list and process remote files, so an unexpected upstream version or malicious package update could change file-handling semantics or execute attacker-controlled code during ingestion.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

The upload step uses uvx fulcra-api without version pinning, creating a repeated supply-chain trust gap. Since this operation moves externally sourced data into the Fulcra File Store, a malicious or changed CLI release could exfiltrate data, alter destinations, or mishandle credentials.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

Downloading files with an unpinned uvx fulcra-api package exposes the agent to the same upstream package substitution and unexpected behavior risk. In an ingestion pipeline that processes untrusted third-party exports, this expands the blast radius because the CLI sits on the trust boundary for file retrieval and subsequent parsing.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

The archive upload example invokes uvx fulcra-api without pinning, allowing dynamic retrieval of code that can affect archival integrity. Because the skill later deletes originals after archive verification, any altered CLI behavior could result in silent corruption, failed backups, or data loss combined with unauthorized deletion.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

This duplicate invocation on the same line still represents a separate unpinned runtime dependency path. Given the skill's autonomous cleanup workflow, any supply-chain compromise in the CLI can directly influence whether remote files are preserved or removed.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The skill repeatedly instructs the agent to execute uv tool run fulcra-api without pinning an exact package/version or other immutable artifact. That allows a future or substituted package release to change behavior or deliver malicious code at execution time, which is especially dangerous here because the CLI is used for authentication, file download/upload/delete, schema creation, and bulk record ingestion against user data.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

This login flow calls an unpinned CLI package during authentication, so the agent may execute attacker-controlled or unexpected code when handling credentials or device-code login. Because authentication establishes access to the Fulcra account and file store, supply-chain substitution at this step could compromise tokens, data, or follow-on operations.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The polling completion step also executes an unpinned CLI, creating the same supply-chain risk during a sensitive auth operation. An altered package could exfiltrate device codes, tokens, or silently perform unauthorized API/file actions after login succeeds.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

Using --help on an unpinned remotely resolved CLI still requires fetching/executing whatever package version is current at runtime. Even though the immediate intent is documentation, the mechanism can execute arbitrary code from an untrusted or changed package.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Schema creation is performed through an unpinned CLI, so package drift or malicious replacement could create incorrect schemas, tamper with metadata, or run arbitrary code on the agent host. In this skill, that risk is amplified because the command is part of an autonomous ingestion workflow that may run with broad API permissions.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Querying base types via an unpinned CLI exposes the same package substitution risk even though the operation appears read-only. A malicious or changed package can still execute arbitrary code locally or return manipulated results that influence downstream ingestion decisions.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Listing user schemas with a floating CLI reference is vulnerable to supply-chain compromise and can also mislead the agent through falsified output. Because the skill uses these discovery steps to decide whether to create or reuse schemas, tampered output may lead to destructive or incorrect follow-up actions.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Fetching a schema with an unpinned CLI lets an unexpected package influence the generated record format or execute arbitrary code. In this skill, schema inspection directly informs JSONL generation, so manipulated results can corrupt ingested data or trigger later correction/deletion workflows.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The file-management section begins with unpinned CLI usage, which is more dangerous because these commands touch user-controlled remote files and local disk. A malicious package could read, alter, exfiltrate, or destroy staged exports under the guise of file operations.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

file stat on an unpinned CLI still executes untrusted package code in a context that reveals file paths and metadata. In an ingestion skill centered on third-party exports, compromised tooling could use this access to enumerate sensitive datasets and stage later exfiltration or deletion.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

Downloading files through an unpinned CLI is a strong supply-chain risk because the package has direct access to remote exports and the local filesystem. A malicious version could tamper with downloaded content, write outside expected paths, or leak the retrieved data.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

Uploading local files with an unpinned CLI allows arbitrary changed code to access local data and send it to the remote service or elsewhere. Because this skill handles archived exports and transformed records, compromised tooling could silently exfiltrate unrelated local files in addition to the intended upload.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
98% confidence
Finding

Deletion commands executed via an unpinned CLI are especially risky because a substituted package could destroy remote files or perform broader unauthorized destructive actions. The surrounding note about destructive behavior shows the command already has high-impact semantics, making supply-chain uncertainty more dangerous in this context.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The note that no move/copy exists implies multi-step download/upload/delete flows, all relying on the same unpinned CLI. That compounds risk because a malicious package can interfere at multiple stages, increasing opportunities for data loss, duplication, or covert exfiltration.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Using unpinned tag create can lead to arbitrary code execution and metadata tampering. While tags may seem low risk, this skill uses them to structure future ingestions, so manipulated outputs can create lasting data consistency problems across datasets.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Listing tags through an unpinned CLI carries supply-chain risk and can feed false identifiers into subsequent record ingestion. Because the skill requires UUID-based tags, forged output from a compromised package can corrupt many records at scale.

Content

No source excerpt is available for this finding.