T05 · Unauthorized Access and Privilege Escalation
- Location
main.py:202- Finding
System Prompt Content Can Be Disclosed to an External Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This social messaging skill mostly matches its stated purpose, but it asks for and uses sensitive authority in ways users are not clearly warned about.
Review before installing. Use this only if you are comfortable sending profile details, passwords, messages, contacts, and task contents to the AIXin backend. Do not reuse an important password. Avoid leaving registration biography blank unless the system_prompt behavior is removed, and prefer a build that uses HTTPS-only endpoints, redacts tokens from output, disables background polling by default, and stores credentials in an OS keychain instead of plaintext JSON.
main.py:202System Prompt Content Can Be Disclosed to an External Service
main.py:43Account Password and JWT Are Persisted in Plaintext
main.py:18Unrestricted Server Override Permits Plaintext or Attacker-Controlled Credential Transmission
SKILL.md:12Skill Instructions Require Raw API Responses That May Contain Authentication Tokens
requirements.txt:1Dependency Uses an Unbounded Minimum Version Without Integrity Pinning
The declared description understates behaviors identified by analysis, including possible prompt-derived profile exfiltration, local plaintext password storage, and background polling for messages. This mismatch prevents informed consent and can hide risky processing of credentials, private conversation data, and persistent network activity behind a benign social-messaging description.
The skill stores both the JWT token and the plaintext password in ~/.aixin/profile.json for automatic relogin. Local plaintext credential storage greatly increases the blast radius of local compromise, malware, backups, shared accounts, or accidental file exposure.
The registration flow derives profile content from system_prompt via _extract_bio(system_prompt) and then transmits it to the remote service as bio. System prompts often contain hidden instructions, private context, owner metadata, or secrets, so this creates a direct exfiltration path to a third-party server without clear informed consent.
The README explicitly encourages sending messages, friend requests, and delegated tasks to a remote backend, which likely includes user-generated content and contact identifiers, but provides no privacy or data-transfer warning. In a social-communication skill, this omission is security-relevant because users may unknowingly transmit sensitive prompts, relationship data, or business information to an external service.
The README discloses that the skill depends on an external backend at a raw HTTP endpoint and supports cross-platform communication, but does not warn users about the trust, privacy, and integrity implications of that dependency. Because the service is remote and uses unencrypted HTTP, network attackers or the backend operator could observe or tamper with agent registration, messages, contacts, and tasks.
The skill invokes external network actions and handles potentially sensitive user data, yet it declares no tool scope or permission boundaries. Without explicit allowed-tools and restrictions, an agent runtime may grant broader capabilities than the user expects, increasing the chance of unintended file, environment, or network access during skill execution.
The trigger description is broad enough to activate on common conversational phrases, which can cause the agent to invoke this skill unexpectedly. In a skill that sends network requests and transmits user content, accidental activation raises privacy and consent risks even if the underlying functionality is intended.
The skill explicitly directs real outbound curl requests to a third-party service and mandates returning real responses, meaning user-supplied registration details, credentials, identifiers, and messages are transmitted externally as part of routine use. External transmission is expected for this skill's purpose, but it is still security-relevant because it handles sensitive communications and normalizes automatic network disclosure.
## ⚠️ 重要规则
1. **必须真实执行** curl 命令,绝对不能模拟、编造或伪造 API 响应
2. **唯一的 API 地址**是 `https://aixin.chat/api`,没有其他地址
3. **不存在** `/api/auth/register` 端点,注册端点是 `POST /api/agents`
4. 执行命令后,必须将真实返回的 JSON 展示给用户
The skill requires displaying full raw JSON responses to the user after API calls. Raw responses can contain sensitive fields such as identifiers, metadata, private message content, or server-side details that should be filtered, summarized, or redacted before presentation.
The 'when to use' section uses vague criteria like adding friends, sending messages, or delegating tasks without clarifying that these are specific to the external AIXin service. That ambiguity can cause the agent to route ordinary chat intents into an external platform, exposing identifiers, messages, or relationship data unnecessarily.
The registration and messaging flows send nickname, owner name, password, profile data, and message content to an external server without a clear privacy warning or data-use disclosure. Users may unknowingly provide credentials and personal content to a third party, which is especially risky because the skill instructs direct API usage as part of normal conversation.
The registration flow instructs the agent to derive the bio from conversation context, which creates a pathway for reusing unrelated or sensitive user-provided content in a public or remote profile. In agent environments, 'conversation context' can include hidden instructions or private details not intended for external transmission.
The unread-message flow defaults to fetching and returning complete message contents, which encourages disclosure of private communications in full rather than using least-privilege access. This is especially risky in shared interfaces or when users only asked whether new messages exist, not for the content itself.
User-facing prompts, help text, status messages, and interaction instructions are consistently hard-coded in Chinese throughout the skill. Because the skill does not offer a language selection or document that it is intentionally restricted to Chinese users, it may violate language/locale policy requiring user choice or explicit justification.
The registration flow can send system_prompt-derived content to the remote service without a clear warning that hidden host context may be included. Because users typically cannot inspect the system prompt, this undermines consent and may leak sensitive configuration or private instructions externally.
The registration UX actively encourages users to include owner details and other identifying information in a public-facing profile, while also auto-seeding bio content from system_prompt. In a social directory/market context, this materially increases the chance of unnecessary disclosure of personal or hidden contextual data.
The skill derives skillTags from the bio and publishes them to the service, expanding disclosure beyond simple messaging into profiling and discoverability metadata. While not as severe as prompt exfiltration, it can reveal inferred capabilities or sensitive topical associations the user did not explicitly approve for publication.
The manifest requests both network access and system_prompt_read, which together enable exfiltration of sensitive system or prompt data to a remote server. The skill description and commands present this as a social/chat feature but do not clearly warn users that sensitive internal agent context may be accessible or transmitted, creating a meaningful risk of unintended data disclosure.
SQP-3 适用于所有文件类型。该 README 从标题、说明到命令示例全部以中文呈现,没有提供多语言选项、英文说明或任何语言限制的明确声明,可能构成未获用户选择的语言/locale 约束。
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
headers.update(self._auth_headers())
kwargs["headers"] = headers
resp = getattr(session, method)(url, **kwargs)
data = resp.json()
# 如果返回 401(token 过期),尝试重新登录
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
headers.update(self._auth_headers())
kwargs["headers"] = headers
resp = getattr(session, method)(url, **kwargs)
data = resp.json()
# 如果返回 401(token 过期),尝试重新登录
The dependency is specified as requests>=2.28.0, which allows any future version to be installed and makes builds non-reproducible. This is risky because a vulnerable or breaking release could be pulled in later without review, and in a social/messaging skill that likely handles network traffic and possibly credentials, dependency hygiene matters more than in an offline tool.
requests>=2.28.0
Because the manifest does not pin requests to a specific version, it is impossible to verify whether the installed version includes fixes for known advisories affecting the package. In a communication skill that may make outbound HTTP requests and process remote URLs, this uncertainty increases supply-chain and runtime risk, even though the file alone does not prove a currently exploitable vulnerable version is installed.
The natural-language description and all listed commands are Chinese-only, which can impose a language constraint on users without offering an alternative or explicit opt-in. Under the stated policy, forcing a specific language without user choice is a natural-language policy concern.
No suspicious patterns detected.