Back to skill

Security audit

figshare-skill

Security checks for vulnerabilities and agentic risk

Overview

This Figshare skill appears legitimate, but its helper scripts have security issues that could expose a Figshare token or overwrite local files.

Install only if you are comfortable reviewing and constraining the helper scripts first. Use the least-privileged Figshare token possible, confirm every create/update/upload/publish action, avoid the new-version helper unless you explicitly intend to publish, and fix upload URL validation and download filename sanitization before using this on valuable accounts or workspaces.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/upload.sh:29
Finding

Figshare token transmitted to an unvalidated response-controlled upload URL

Content
View full analysis
> file_id=$FILE_ID upload_url=$UPLOAD_URL" PARTS=$(curl -sS "${AUTH[@]}" "$UPLOAD_URL") NPARTS=$(echo "$PARTS" | jq '.parts | length') echo ">> uploading $NPARTS part(s)" echo "$PARTS" | jq -c '.parts[]' | while read -r part; do NO=$(echo "$part" | jq -r '.partNo') START=$(echo "$part" | jq -r '.startOffset') END=$(echo "$part" | jq -r '.endOffset') LEN=$((END - START + 1)) echo " part $NO: bytes $START-$END ($LEN)" dd if="$FILE" bs=1 skip="$START" count="$LEN" status=none \ | curl -sS -X PUT --data-binary @- "${AUTH[@]}" "$UPLOAD_URL/$NO" >/dev/null done ``` The corresponding raw-flow instructions also recommend forwarding the token to the returned upload URL: ```bash dd if="$FILE" bs=1 skip=$START count=$((END-START+1)) 2>/dev/null \ | curl -s -X PUT --data-binary @- "${upload_url}/${partNo}" \ -H "Authorization: token $FIGSHARE_TOKEN" ``` ### Technical Analysis The script obtains `upload_url` from a JSON API response and uses it directly as a destination for subsequent authenticated requests. It does not validate: - The URL scheme. - The destination hostname. - Whether the destination belongs to an approved Figshare upload service. - Whether the authorization header is required by that service. - Whether the derived part URL remains within the expected origin. The `AUTH` array contains the user's personal Figshare token: ```bash AUTH=(-H "Authorization: token $FIGSHARE_TOKEN") ``` It is supplied to both the request for the part layout and every part-upload request. Consequently, the bearer credential is disclosed t ...[truncated 1876 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/download.sh:14
Finding

Remote Figshare filenames can escape the selected download directory

Content
View full analysis
Remediation
View remediation
&2 exit 1 fi ``` 3. Canonicalize the output directory and verify that every final destination remains beneath it before writing. 4. Avoid overwriting existing files by default. Fail if the destination exists, or require an explicit overwrite option. 5. Replace the tab-delimited serialization with a format that safely preserves arbitrary strings, such as NUL-delimited records or base64-encoded JSON fields. 6. Consider assigning locally generated filenames and maintaining a separate mapping to the original Figshare names. 7. Validate download URL schemes and expected hosts before using `curl -L`. If redirects are required, restrict them to HTTPS and an approved host set. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (29)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README states the skill triggers automatically on any Figshare mention, URL, or DOI, which is a broad activation condition that can cause the skill to run in contexts where the user did not intend API actions. In a skill that supports authenticated listing, updating, publishing, and uploading, unintended invocation increases the chance of accidental data access or destructive/account-affecting operations if the agent proceeds too eagerly.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The documentation highlights capabilities to create, update, and publish Figshare content but does not clearly warn that these operations modify remote account data and may be irreversible or publicly visible once published. In an agent setting, missing risk disclosure and confirmation guidance can lead users to authorize destructive or privacy-impacting actions without understanding the consequences.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README states the skill will auto-trigger whenever the user mentions Figshare, a figshare.com link, or a Figshare DOI. Because this skill supports state-changing actions like upload, create, update, and publish, broad trigger conditions increase the chance the assistant activates the skill in contexts that are only informational, causing unintended tool selection and potentially risky follow-on actions.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill exposes shell-based operational capability but does not declare an explicit tool scope such as allowed-tools or permissions. That omission weakens policy enforcement and reviewability, making it easier for an agent to invoke shell/network actions without a clearly bounded authorization model.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 38)May include surrounding context.

Search public articles

bash
curl -s -X POST https://api.figshare.com/v2/articles/search \
  -H "Content-Type: application/json" \
  -d '{"search_for": ":title: single cell", "page_size": 20}' | jq

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 71)May include surrounding context.

Create an article (draft)

bash
curl -s -X POST https://api.figshare.com/v2/account/articles \
  -H "Authorization: token $FIGSHARE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 89)May include surrounding context.

bash
# update metadata
curl -s -X PUT https://api.figshare.com/v2/account/articles/$ART \
  -H "Authorization: token $FIGSHARE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "New title"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 139)May include surrounding context.

bash
   SIZE=$(stat -f%z "$FILE" 2>/dev/null || stat -c%s "$FILE")
   MD5=$(md5sum "$FILE" | awk '{print $1}')   # or: md5 -q on macOS
   curl -s -X POST https://api.figshare.com/v2/account/articles/$ART/files \
     -H "Authorization: token $FIGSHARE_TOKEN" \
     -H "Content-Type: application/json" \
     -d "{\"md5\":\"$MD5\",\"name\":\"$(basename $FILE)\",\"size\":$SIZE}"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 153)May include surrounding context.

bash
   dd if="$FILE" bs=1 skip=$START count=$((END-START+1)) 2>/dev/null \
     | curl -s -X PUT --data-binary @- "${upload_url}/${partNo}" \
       -H "Authorization: token $FIGSHARE_TOKEN"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 27)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 38)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 48)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 56)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 65)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 71)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 89)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 95)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 105)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 111)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 139)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 160)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 173)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 193)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 194)May include surrounding context.

md
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/download.sh (reported line 15)May include surrounding context.

sh
FILE="${2:?file path required}"
: "${FIGSHARE_TOKEN:?FIGSHARE_TOKEN not set}"

API="https://api.figshare.com/v2"
AUTH=(-H "Authorization: token $FIGSHARE_TOKEN")

[ -f "$FILE" ] || { echo "file not found: $FILE" >&2; exit 1; }