T01 · Skill Instruction Hijacking
- Location
SKILL.md:244- Finding
Mandatory Display of Untrusted Server Notices Enables Response and Link Injection
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its advertised Vmake media-processing purpose, but it gives remote responses and user-supplied URLs too much unsandboxed influence over what the agent fetches, shows, and uploads.
Review before installing. Use this only in an environment where uploading media to Vmake and using MT_AK/MT_SK quota is intended, avoid accepting arbitrary URLs from untrusted users, treat Vmake notice text and links as untrusted service content, pin or preinstall dependencies from a trusted source, and clear local task history if result URLs may be sensitive.
SKILL.md:244Mandatory Display of Untrusted Server Notices Enables Response and Link Injection
sdk/core/client.py:513Remote Configuration Can Redirect Signed Requests and Media Uploads
sdk/core/client.py:653Unrestricted URL Fetching Enables SSRF and Subsequent Data Exfiltration
scripts/requirements.txt:1Runtime Installation Uses Unpinned Dependencies Without Integrity Verification
scripts/vmake_ai.py:330Persistent Task History Stores Complete Potentially Signed Media URLs
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
img_bytes = r.content
filename = image_source.split("?")[0].split("/")[-1] or "image.jpg"
files = {"photo": (filename, img_bytes, "image/jpeg")}
resp = requests.post(
f"{TELEGRAM_API_BASE}/bot{token}/sendPhoto",
data=data,
files=files,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
sys.exit(1)
with open(image_source, "rb") as f:
files = {"photo": (os.path.basename(image_source), f, "image/jpeg")}
resp = requests.post(
f"{TELEGRAM_API_BASE}/bot{token}/sendPhoto",
data=data,
files=files,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
except Exception as exc:
print(f"[telegram] Thumbnail download error: {exc}, skipping", file=sys.stderr)
resp = requests.post(
f"{TELEGRAM_API_BASE}/bot{token}/sendVideo",
data=data,
files=files,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
def send_text_message(token: str, chat_id: str, text: str) -> tuple[dict | None, str | None]:
"""Send plain text (URLs are linkified by clients)."""
print("[telegram] Sending download link text", file=sys.stderr)
resp = requests.post(
f"{TELEGRAM_API_BASE}/bot{token}/sendMessage",
json={"chat_id": chat_id, "text": text},
timeout=(CONNECT_TIMEOUT, 30),
A dangerous execution chain combines code execution (exec/eval) with a dynamic source (network, encoded data, dynamic import), creating a high-confidence attack vector.
app_config=vmake_ai.skill_config, sign=types.SimpleNamespace(Signer=Signer),
requests=types.SimpleNamespace(Session=lambda: session), json=json,
_wapi_meta_code_value=int, WapiApiError=RuntimeError)
exec(compile(ast.Module(body=[node], type_ignores=[]), "client.py", "exec"), env)
with patch.dict(os.environ, {}, clear=True):
client = env["WapiClient"]("test-ak", "test-sk", agent_name="Codex", agent_model="GPT-X")
self.assertEqual(client.request("/skill/consume.json", method="POST", body={"task": "test"}), {"context": "ok"})
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
}
)
return 1
r = requests.get(
f"https://api.telegram.org/bot{token}/getFile",
params={"file_id": args.telegram_file_id},
timeout=(CONNECT_TIMEOUT, READ_TIMEOUT),
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
)
filename = f"tg_{uuid.uuid4().hex[:8]}.{extension}"
dl_url = f"https://api.telegram.org/file/bot{token}/{file_path}"
r2 = requests.get(
dl_url,
timeout=skill_config.url_download_timeout_tuple(),
headers={
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
{"error": "FEISHU_APP_TOKEN or --feishu-app-token required"}
)
return 1
r = requests.get(
f"https://open.feishu.cn/open-apis/im/v1/messages/"
f"{args.feishu_message_id}/resources/{args.feishu_image_key}",
params={"type": "image"},
The declared purpose describes a media-processing skill that talks to a remote Vmake AI service and handles task discovery/execution for image and video restoration. The actual code chunk does none of that. Instead, it is purely an installation utility for deploying the skill files locally. This is a materially different primary purpose and introduces capabilities unrelated to the declared behavior, namely filesystem manipulation, ZIP extraction, package validation, and installer modes for different environments. These installer actions are implementation/deployment behavior, not the declared runtime functionality of the skill. Therefore this code chunk does not accurately represent the declared description.
The declared description presents a media-processing integration with specific remote-task orchestration requirements. The actual code chunk is a small utility for preparing optional X-Agent-* headers by reading explicit inputs or SKILL_AGENT_* environment variables, validating/normalizing them, and returning header mappings. This is not merely an implementation detail of the declared behavior because the chunk contains none of the core advertised functionality and instead serves a different, ancillary purpose. Therefore the supplied code does not accurately represent the declared purpose.
The description is narrow and policy-heavy: watermark removal and quality restoration only, with mandatory remote catalog discovery and specific task-selection/execution rules. The code chunk instead provides a reusable backend API wrapper for many Vmake/MT AI operations. It can invoke arbitrary configured tasks (invoke, invoke_task, run), includes explicit txt2img and img2img methods, uploads media to OSS, polls async task status, and stores GID data in a local cache. Those are materially broader capabilities than the declared purpose. Just as importantly, the required behavior in the description is not present: there is no code for remote catalog discovery, no validation that task names come from returned server metadata, no enforcement that legacy aliases are only used when explicitly returned, and no logic implementing the described distinction of video tasks using spawn-run-task plus OpenClaw sessions_spawn versus image tasks using blocking run-task. The pricing claim is not contradicted by this chunk, but the primary purpose and behavioral guarantees do not match the implementation.
This code chunk does not implement the declared Vmake AI watermark-removal or quality-restoration behavior. Instead, it provides a generic persistent cache utility for storing and retrieving gid-associated data on disk. While such a cache could be a supporting helper within a larger system, the chunk itself has a materially different primary purpose from the declared skill behavior and contains none of the described remote catalog discovery, task selection, image/video execution flow, or pricing-related handling.
The declared purpose describes a media-processing skill for Vmake AI, including catalog discovery, task selection, and image/video restoration workflows. The supplied code does none of that. Its sole purpose is Feishu image messaging: authenticate with Feishu, optionally download an image, upload it to Feishu, and send an image message. This is a materially different primary purpose and uses different external services and local resources than declared. Therefore this is a clear mismatch.
This is a clear mismatch. The declared description is about using Vmake AI for watermark removal and quality restoration with specific task-discovery and execution behavior. The supplied code does none of that: it does not contact Vmake, discover any remote catalog, select AI processing tasks, perform image/video restoration, or invoke spawn-run-task/run-task workflows. Instead, its primary and only purpose is sending video/media messages through Feishu/Lark using credentials from local config and Feishu open APIs. That is a materially different purpose and introduces undeclared capabilities and resource access unrelated to the declared skill.
The declared description is for a media-processing skill that interfaces with Vmake AI and follows specific task-discovery and execution flows. The actual code shown is only a minimal package initializer exporting names from a signing SDK. Based on this chunk alone, the code does not implement or even indicate the described behavior. This is a strong description-to-code mismatch, with the code appearing to serve a different purpose entirely.
This code chunk’s primary purpose is authentication support for HTTP API calls, not Vmake AI media restoration workflows. While such signing could be a supporting component inside a larger Vmake integration, this chunk alone does not perform or orchestrate any of the declared actions: it does not discover tasks, choose legacy aliases, distinguish image vs. video execution paths, create OpenClaw sessions, or invoke remote processing endpoints. Therefore the supplied code does not accurately represent the declared description for this skill and should be flagged as a mismatch.
This is a clear mismatch. The declared description is about invoking Vmake AI media-processing tasks for watermark removal and quality restoration, including specific task-discovery and execution requirements for image versus video workflows. The supplied code does none of that. Instead, it implements a Telegram image-sending script: it reads TELEGRAM_BOT_TOKEN, accepts a chat ID and image path/URL, optionally downloads the image, and uploads it to Telegram using the sendPhoto endpoint. This is a materially different primary purpose and introduces undeclared external service access and messaging behavior unrelated to the declared skill.
This is a clear mismatch. The declared description is about watermark removal and quality restoration using Vmake AI task-discovery and task-execution workflows. The supplied code does none of that: it does not discover any remote catalog, invoke Vmake APIs, process images or videos, remove watermarks, restore quality, or handle paid quota/task metadata. Its actual primary purpose is Telegram message delivery, specifically sending a video file and optional link/thumbnail using a bot token. That is a materially different purpose and introduces undeclared network interactions and capabilities unrelated to the declared skill.
The declared description says the skill processes image/video watermark removal and restoration through Vmake AI, including remote catalog discovery and specific task execution patterns. The provided code chunk instead contains only offline tests. It checks fixed endpoint values, normalization/validation of agent name/version/model, shell-safe command construction, preservation of profile arguments, and whether WAPI headers are included before signing. Although these tests reference Vmake AI-related functions and payload builders, they do not implement or invoke the declared end-user capability. This is a material description-versus-behavior mismatch because the actual code’s primary purpose is test/validation infrastructure rather than watermark-removal service execution.
This code chunk is a top-level init.py that re-exports SDK components. Its actual purpose is package exposure/setup for a general Vmake AI SDK, not a concrete skill implementing the described watermark-removal/restoration workflow. Because the declared description is highly specific about operational behavior—catalog discovery, legacy alias handling, spawn vs blocking execution, and paid quota semantics—but none of that behavior appears in the provided code, the description does not accurately represent this chunk. While an init.py can be supporting infrastructure, the mismatch should be flagged here because the declared primary purpose is much more specific than the actual visible behavior.
This code chunk appears to be a small authentication package initializer, not an implementation of the described Vmake AI media-processing skill. While authentication could be a supporting detail in a larger SDK, the supplied chunk by itself does not perform or demonstrate the declared primary behavior. Because the declared description is about end-user media task orchestration and the actual code only re-exports a Signer class, this is a material purpose mismatch for the supplied code chunk.
The declared description describes a media-processing integration with specific workflow requirements for discovering and invoking Vmake AI tasks. The actual code chunk is a generic authentication helper for signing HTTP requests using HMAC-SHA256 and setting authorization headers. While such signing could be a supporting utility within a larger API client, this chunk by itself does not implement the declared functionality and instead has a materially different primary purpose. Therefore, the description does not accurately represent what this code chunk actually does.
The declared description is narrowly prescriptive: the skill should process watermark removal and quality restoration with mandatory remote catalog discovery and specific execution mechanisms depending on media type. This code chunk instead exposes a generic command-line interface over SkillClient with three broad operations: run any task by name, query task status, and list tasks from a local configuration object. The list-tasks command explicitly uses INVOKE rather than a remote catalog, which conflicts with the requirement to always discover the remote catalog before naming or selecting a task. There is also no logic to identify image versus video tasks or to route video through spawn/OpenClaw sessions; all task execution goes through one generic run_task path. While use of AK/SK and quota error handling is consistent with a paid API, the implemented behavior is materially broader and different from the declared purpose.
The code chunk is a thin generic wrapper around SkillClient.run_task and poll_task_status. While this could support image tasks in a broad sense, it does not implement several core behavioral constraints stated in the description: catalog discovery, task selection based on returned metadata, special handling for video tasks via async spawn/session APIs, or any specialization to watermark removal and restoration. This is a material description-versus-behavior mismatch, not just an omitted implementation detail, because the declared purpose specifies required operational semantics that are absent from the code shown.
The declared description centers on a media-processing integration with Vmake AI, including discovery of remote task metadata, handling image versus video execution paths, and billing-related constraints. The actual code chunk does none of that. It implements a small utility for resolving agent info fields (name, version, model), sanitizing them, optionally reading them from environment variables, and turning them into X-Agent-* headers. This is an unrelated SDK support function rather than the advertised watermark-removal/restoration behavior. Therefore, the description does not accurately represent this code chunk.