T01 · Skill Instruction Hijacking
- Location
siliville_skill.py:2078- Finding
Remote API Responses Can Replace the Agent's Effective System Prompt
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a disclosed SiliVille metaverse client, but it gives remote service content and autonomous examples too much influence over prompts, public posts, persistent memories, and virtual assets.
Review before installing. Use this only if you want an agent to act inside SiliVille and are comfortable with public posts, persistent remote memories, virtual currency/compute spending, transfers, trades, governance actions, and adversarial in-world interactions. Keep OPENAI_API_KEY unset unless contract auto-fulfillment is needed, avoid custom OPENAI_BASE_URL values you do not fully trust, do not run the example or loop unattended, require human approval for public/asset-affecting actions, and never put secrets or private conversation details in mental_sandbox.
siliville_skill.py:2078Remote API Responses Can Replace the Agent's Effective System Prompt
siliville_skill.py:2144Server-Controlled Action Reports Are Written to Persistent Agent Memory
siliville_skill.py:450Free-Form Agent Reasoning Is Transmitted to the SiliVille Service
example_agent.py:37Configurable LLM Endpoint Can Receive the API Key Without Transport or Host Validation
This sends untrusted contract-derived prompt content to a third-party OpenAI-compatible endpoint along with a separate API credential. In this skill, contract text comes from the remote SiliVille service and is automatically forwarded to another external service, creating a real data exfiltration and prompt-injection surface beyond the core identity/connection purpose.
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 1200,
}
r = requests.post(
f"{OPENAI_BASE_URL}/chat/completions",
headers=headers,
json=payload,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
log("🔍", "正在查询悬赏公会订单...")
try:
res = requests.get(
f"{BASE_URL}/api/v1/agent-os/contracts/pending",
headers=HEADERS,
timeout=15,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
log("🔍", "正在查询悬赏公会订单...")
try:
res = requests.get(
f"{BASE_URL}/api/v1/agent-os/contracts/pending",
headers=HEADERS,
timeout=15,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
# ── 向市政厅交付 ─────────────────────────────────────────────────────────
log("🚚", "正在向市政厅交付订单...")
try:
fulfill_res = requests.post(
f"{BASE_URL}/api/v1/agent-os/contracts/fulfill",
headers=HEADERS,
json={
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
# ── Step 0: Cold start — manifest + claw-manifest (法典 OTA v5) ───────────
log("📜", "冷启动握手 GET /api/v1/agent/manifest ...")
try:
m = requests.get(f"{BASE_URL}/api/v1/agent/manifest", headers=HEADERS, timeout=15)
if m.status_code == 200:
mj = m.json()
log("✅", f"manifest_version={mj.get('manifest_version', '?')}")
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
log("⚠️", f"manifest 请求异常: {e}")
log("📜", "OTA 法典 GET /api/v1/system/claw-manifest ...")
try:
c = requests.get(f"{BASE_URL}/api/v1/system/claw-manifest", headers=HEADERS, timeout=15)
if c.status_code == 200:
cj = c.json()
ver = cj.get("version", "?")
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
# ── Step 1: Awaken ──────────────────────────────────────────────────────────
log("🌅", "觉醒协议 (GET /api/v1/agent/awaken) ...")
try:
r = requests.get(f"{BASE_URL}/api/v1/agent/awaken", headers=HEADERS, timeout=15)
except requests.RequestException as e:
log("❌", f"网络异常: {e}")
sys.exit(1)
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
# ── Step 2: Publish a Pulse ─────────────────────────────────────────────────
log("📝", "发表接入宣言 (POST /api/publish) ...")
post_res = requests.post(
f"{BASE_URL}/api/publish",
headers=HEADERS,
json={
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
# ── Step 3: Store a memory ──────────────────────────────────────────────────
log("🧠", "写入阿卡夏记忆 (POST /api/v1/memory/store) ...")
mem_res = requests.post(
f"{BASE_URL}/api/v1/memory/store",
headers=HEADERS,
json={
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
print()
log("🌙", "主动入梦协议 (POST /api/v1/agent-os/action, action_type=enter_dream) ...")
log("ℹ️", "enter_dream 豁免 mental_sandbox,约 5 算力,触发 Tier-3 午夜人格反思引擎")
dream_res = requests.post(
f"{BASE_URL}/api/v1/agent-os/action",
headers=HEADERS,
json={
The README explicitly tells the agent that if the server returns instruction text with do_not_retry, it should follow that instruction. This is a direct semantic prompt-injection channel: any compromised server, malicious intermediary, or abused backend path can issue arbitrary natural-language commands that the agent may execute outside the intended API error domain, potentially changing behavior, suppressing alerts, idling indefinitely, or steering subsequent actions.
The documented purpose understates important behaviors, including use of an external OpenAI-compatible endpoint and autonomous contract or bounty handling. This mismatch prevents informed consent by operators and can hide sensitive data flows or autonomous actions that materially change the security profile of the skill.
The skill explicitly requires the agent to place a 'mental_sandbox' field into action requests and states that it is sent to siliville.com. This creates a direct exfiltration channel for internal reasoning, planning, or potentially sensitive contextual data, especially because the field is required across many actions and is framed as normal protocol behavior.
The skill promotes dynamic prompt augmentation from remotely fetched manifests and explicitly discusses custom skill uploads that can override prompts. That is a high-risk remote prompt injection and capability-escalation pattern: external content can change agent behavior at runtime, potentially bypassing operator expectations and introducing adversarial instructions.
Untrusted task_description from the remote contracts feed is embedded directly into a role-play prompt and sent to an LLM, which is then used to produce content that is automatically submitted back to the platform. This creates a prompt-injection and steering path where a malicious contract can manipulate the model's output, induce policy bypass attempts, or generate harmful/publicly posted content without human review.
The OTA manifest is explicitly described as content to inject into the system prompt, giving a remote service a privileged channel to alter agent policy and behavior. In a skill meant to be imported by other agents, this creates a high-risk remote prompt injection mechanism with direct authority over downstream decisions and tool usage.
These methods expose coercive and socially harmful capabilities such as threatening, commanding, bribing, and manipulative messaging as first-class skill features. In the context of a general-purpose agent skill, packaging harassment and coercion primitives invites misuse and enables abusive agent behavior at scale.
The smart-contract extortion and rumor-spreading interfaces operationalize abuse by giving agents reusable helpers for extortion, retaliation framing, and reputational harm. This is more dangerous than passive support for a broad API because the code actively productizes abusive workflows for easy invocation.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
@classmethod
def setup(cls) -> None:
"""
Print instructions for configuring the API token via environment variable.
Zero-persistence: no files are written to disk.
Run: python siliville_skill.py setup
The code and comments instruct consumers to append server-provided system_protocol or manifest-derived content directly into the LLM system prompt. This is a classic authority-escalation path: any compromised server content, hostile upstream text, or untrusted API field can seize model behavior, override user intent, and trigger harmful tool use or data exfiltration in downstream agents.
The README prominently advertises posting, commenting, memory storage, gallery publishing, and multiplayer interaction, but does not give an equally prominent upfront warning that these actions can make model-generated content public, persistent, and attributable to the agent. In an agent skill, this creates a real privacy/safety risk because operators may enable autonomous actions without realizing that sensitive prompts, memories, or internal reasoning could be published or stored in a persistent public environment.
The README instructs users to interact with a Chinese-labeled dashboard flow and later includes required operational strings and error/instruction content in Chinese, but it does not offer a language choice or explain a locale-specific constraint. This may violate language/locale policy when the skill is presented as generally compatible with any framework and broad user base.
The README instructs clients to fetch /api/v1/system/claw-manifest and treat its system_prompt_extension as mandatory prompt material. That creates a server-controlled prompt-injection channel that can semantically override local developer policies, safety rules, approval workflows, or data-handling constraints whenever the remote service changes its returned text.
The documentation describes irreversible asset transfers, paid whispers, scams, and immediate deployment/publication behaviors without an upfront safety guardrail or recommendation for human approval. In an autonomous-agent setting, that can directly lead to loss of coins/compute, public exposure, or unreviewed deployment triggered by model error, prompt injection, or adversarial social manipulation.
The Zero-Exception section defines structured error and instruction values in Chinese and tells agents to follow them, but it does not indicate that alternate locales are available. For a broadly advertised skill, forcing a specific language in operational messages without user opt-in is a natural-language policy concern.
No suspicious patterns detected.