Back to skill

Security audit

Arkcloud Ipfs

Security checks for vulnerabilities and agentic risk

Overview

The skill appears purpose-built for ARKCloud/IPFS uploads, but it handles credentials and deletions with under-scoped endpoint and folder-upload safeguards that users should review before installing.

Install only if you trust the publisher and will keep ARKCLOUD_BASE_URL/--base-url fixed to the real ARKCloud HTTPS service. Avoid uploading untrusted folders, check for symlinks before folder uploads, and require an explicit upload listing plus exact ID confirmation before any delete/unpublish action.

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/arkcloud_common.py:22
Finding

Credentials and Uploaded Data Can Be Sent to an Arbitrary or Insecure Endpoint

Content
View full analysis
str: return (value or os.environ.get("ARKCLOUD_BASE_URL") or DEFAULT_BASE_URL).rstrip("/") ``` ```python # scripts/arkcloud_upload.py:69-76 def main() -> None: parser = argparse.ArgumentParser(description="Upload a file or folder to ARKCloud IPFS.") parser.add_argument("path", help="File or folder path to upload") parser.add_argument("--folder", action="store_true", help="Upload a folder through the client API") parser.add_argument("--base-url", default=None, help="ARKCloud base URL") args = parser.parse_args() root = base_url(args.base_url) ``` ```python # scripts/arkcloud_upload.py:95-117 payload = request_json( "POST", endpoint(root, "/api/client/upload/folder"), headers={ "Cookie": cookie, "X-CSRF-Token": csrf, "Content-Type": content_type, }, body=body, ) print_json(normalize_result(payload, root)) return token = require_env("ARKCLOUD_UPLOAD_TOKEN") body, content_type = multipart_file("file", target) payload = request_json( "POST", endpoint(root, "/api/upload"), headers={ "Authorization": f"Bearer {token}", "Content-Type": content_type, }, body=body, ) ``` ```python # scripts/arkcloud_list.py:21-24 payload = request_json( "GET", endpoint(base_url(args.base_url), "/api/client/uploads"), headers={"Cookie": cookie}, ) ``` ```pyt ...[truncated 2857 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/arkcloud_upload.py:31
Finding

Folder Upload Follows Symbolic Links Outside the Selected Directory

Content
View full analysis
tuple[bytes, str]: boundary = f"----arkcloud-{uuid.uuid4().hex}" chunks: list[bytes] = [] chunks.append( ( f"--{boundary}\r\n" 'Content-Disposition: form-data; name="display_name"\r\n\r\n' f"{root.name}\r\n" ).encode("utf-8") ) files = sorted(p for p in root.rglob("*") if p.is_file()) if not files: fail(f"Folder has no files to upload: {root}") for path in files: rel = path.relative_to(root).as_posix() content_type = mimetypes.guess_type(path.name)[0] or "application/octet-stream" chunks.append( ( f"--{boundary}\r\n" f'Content-Disposition: form-data; name="files"; filename="{form_filename(rel)}"\r\n' f"Content-Type: {content_type}\r\n\r\n" ).encode("utf-8") ) chunks.append(path.read_bytes()) chunks.append(b"\r\n") chunks.append(f"--{boundary}--\r\n".encode("utf-8")) return b"".join(chunks), f"multipart/form-data; boundary={boundary}" ``` ### Technical Analysis The folder collector recursively enumerates entries and retains any path for which `Path.is_file()` returns true. For a symbolic link whose target is a regular file, `is_file()` follows the link and returns true. Later, `path.read_bytes()` also follows the symbolic link. The call to `path.relative_to(root)` only verifies that the symbolic-link directory entry is lexically below the selected root. It does not verify that the resolved link target remains inside that root. Therefore, a directory selected for upload can contain a path that appears internal while reading data from anywhere accessible to the current operating-system user. ...[truncated 1760 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code is narrowly focused on upload behavior. It constructs multipart requests for either a file or folder and submits them to ARKCloud endpoints. That aligns with part of the description about uploading to IPFS and returning an access link if present. However, the declared purpose materially overstates the implemented capabilities by claiming support for publish, list, delete, unpublish, resource querying, and API health checks, none of which appear in this code chunk. Because the description presents a broader file management skill while the actual code only implements upload functionality, this is a description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
91% confidence
Finding

The skill supports a destructive delete operation parameterized by an upload ID, and the metadata does not show strong guardrails on how that parameter is sourced or validated. In an agent context, this creates risk of unintended deletion if the model infers, fabricates, or misbinds an identifier, especially when authenticated client session cookies and CSRF tokens are available.

Content

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

python <base_dir>/scripts/arkcloud_delete.py <upload_id>

text

It calls `DELETE /api/client/uploads/{upload_id}`. Treat this as destructive: confirm with the user before deleting unless they explicitly asked for deletion.

## Error Handling

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill declares network, environment-variable, and file access behavior but does not define any explicit tool scope or permission boundaries. In agent environments, this can lead to overbroad execution privileges, making it easier for the skill to read sensitive local files or use secrets in ways the user did not clearly authorize.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The activation triggers are broad enough to match generic requests about IPFS, uploads, links, or related terms, which can cause the skill to activate outside the user's intended context. Because the skill uses tokens, file paths, and networked upload actions, over-triggering increases the chance of unintended data transfer or secret-adjacent workflows.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
80% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

This skill is installable from GitHub when the repo keeps this path:

text
skills/arkcloud-ipfs/SKILL.md

Install examples:

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This script performs an irreversible delete/unpublish request immediately after parsing arguments, with no confirmation prompt, dry-run mode, or explicit runtime warning. In the context of an authenticated ARKCloud client session, a mistaken upload ID, automation error, or unsafe invocation path could cause unintended deletion of user data or published resources.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instructions require presenting several output fields using Chinese labels such as '文件名', '大小', '链接', '消耗积分', and '剩余积分'. This imposes a specific language on user-facing responses without user opt-in or a documented locale-specific justification.

Content

No source excerpt is available for this finding.