Back to skill

Security audit

Zeelin Social Watch

Security checks for vulnerabilities and agentic risk

Overview

The skill is not clearly malicious, but it can use GSData credentials to make broad API calls, including remote state-changing actions, with weak scoping and a plaintext default endpoint.

Review this skill before installing. Use it only with a GSData account you intend to expose to the skill, prefer an HTTPS GSDATA_BASE_URL if GSData supports it, avoid the raw command unless you fully understand the endpoint, and require explicit user confirmation for any warning-rule, recipient-email, group, or account-management action.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
gsdata_adapter.py:24
Finding

GSData Authentication and API Data Transmitted Over Plaintext HTTP

Content
View full analysis
requests.Response: # GSData gateway commonly accepts params in query/body against one base URL. if method == "POST": return requests.post( self.base_url, data=params, headers=headers, timeout=30 ) return requests.get(self.base_url, params=params, headers=headers, timeout=30) ``` ### Technical Analysis The default API endpoint uses HTTP rather than HTTPS. Every real invocation derives an access token from the application key, request signature, and route, then places that token in the `access-token` request header. The token is Base64-encoded elsewhere in the file, but Base64 provides no confidentiality. Under the default configuration, the authentication token, request parameters, and returned GSData content cross the network without transport encryption or server authentication. For GET requests, user-provided parameters are also placed in the URL query string. These parameters may consequently be exposed not only to network observers but also to intermediary access logs and monitoring systems. This network access is necessary for the Skill's declared GSData functionality. Transmitting its credentials and data over plaintext HTTP is not necessary and violates least-exposure principles. ### Attack Path 1. A user or Agent invokes a GSData action without overriding `GSDATA_BASE_URL`. 2. The adapter generates a request signa ...[truncated 958 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
gsdata_adapter.py:265
Finding

Arbitrary Raw API Calls Can Bypass the Write-Action Confirmation Boundary

Content
View full analysis
bool: if "/warning/" in route: # warning module has both read and write; keep reads open if route.endswith(("/index", "/news", "/stats")): return False return True return any(s in route for s in WRITE_SUFFIX_HINTS) ``` The CLI exposes arbitrary paths and methods: ```python p_raw = sub.add_parser("raw", help="Invoke arbitrary route via gsdata_raw") p_raw.add_argument("--path", required=True) p_raw.add_argument("--method", default="GET") p_raw.add_argument("--params", help='JSON object, e.g. \'{"id":"123"}\'') p_raw.add_argument("--params-file", help="Path to JSON object file") p_raw.add_argument( "--param", action="append", default=[], help="Repeatable key=value param. Example: --param id=123", ) p_raw.add_argument("--dry-run", action="store_true") p_raw.add_argument("--allow-write", action="store_true") ``` ```python if args.cmd == "raw": result = adapter.invoke( tool="gsdata_raw", action="call_any_endpoint", params=_merge_params(args.params, args.params_file, args.param), dr ...[truncated 2373 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:18
Finding

Unpinned Runtime Installation of the Requests Dependency

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (16)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared purpose frames the skill as a read-oriented social monitoring tool, but the documentation admits broader capabilities including raw endpoint invocation and state-changing operations like rule/group/account management. This mismatch is dangerous because users or orchestration systems may trust and auto-select the skill for passive data retrieval while it can perform higher-risk actions outside the expected scope.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · gsdata_adapter.py (reported line 26)May include surrounding context.

python
DEFAULT_BASE_URL = "http://databus.gsdata.cn:8888/api/service"
DEFAULT_MAPPING_PATH = Path(__file__).with_name("gsdata_tool_mapping_v1.json")
DEFAULT_CREDS_PATH = Path.home() / ".config" / "gsdata" / "credentials.json"


ACCOUNT_PLATFORMS = {

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · gsdata_adapter.py (reported line 699)May include surrounding context.

python
DEFAULT_BASE_URL = "http://databus.gsdata.cn:8888/api/service"
DEFAULT_MAPPING_PATH = Path(__file__).with_name("gsdata_tool_mapping_v1.json")
DEFAULT_CREDS_PATH = Path.home() / ".config" / "gsdata" / "credentials.json"


ACCOUNT_PLATFORMS = {

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code includes warning-rule and ranking-management operations such as create, update, open, close, add, and delete, even though the skill description presents the capability as passive monitoring and querying. This mismatch increases the risk that a user or upstream agent invokes state-changing administrative actions without understanding that the skill can modify remote resources.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The adapter intentionally exposes a raw mode that lets callers supply an arbitrary router path and HTTP method, bypassing the skill’s stated high-level social-watch abstraction. In a skill advertised as read-oriented social monitoring, this materially expands capability to undocumented endpoints and makes the weak write-route filter easy to evade, especially since explicit_method is fully caller-controlled.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest describes social watch and data query, yet the mapping also exposes alert-rule creation/update, enable/disable, and recipient-email management. These are administrative, state-changing actions that can generate persistent monitoring, notifications, or data disclosures to third-party email recipients, making the mismatch more dangerous than simple rank management.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill declares environment-variable use and instructs execution of a bundled Python adapter that can read files and make network requests, but it does not define any explicit tool scope such as permissions or allowed-tools. That increases the chance the runtime grants broader capabilities than intended, making accidental or unsafe use of secrets, local files, or network access harder to constrain and audit.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The documentation emphasizes monitoring and querying, yet also exposes state-changing operations such as creating or modifying warning rules and managing ranking groups/accounts. In this context, hidden mutating functionality is more dangerous because the skill is likely to be invoked for routine information lookup, creating opportunity for unintended configuration changes or abuse of the connected GSData account.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger list contains broad terms such as 舆情, 热点, 榜单, and social watch, which can plausibly appear in many ordinary conversations. Overbroad activation is risky here because the skill has network access, uses secrets, and includes some write-capable functionality, so accidental selection could expose data or enable unintended actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The default service endpoint uses plain HTTP, so request parameters, signatures, and access tokens are transmitted without transport encryption. In a skill that loads API credentials and sends authenticated requests, this enables interception or manipulation by any network attacker on the path.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The adapter exposes a broad gsdata_nlp tool with actions like OCR, title generation, correction, segmentation, graph queries, and entity functions. These generic NLP utilities are not justified by the manifest's stated purpose of social sentiment, trending events, rankings, and platform/account data retrieval.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill is presented as a read/query-oriented social monitoring tool, but the mapping includes state-changing custom-rank group and account management operations such as add/delete group and add/delete accounts. This expands the skill’s authority beyond user-expected read-only analysis and creates a capability-mismatch risk where an agent could mutate user data or persistent platform state under the guise of monitoring.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The mapping exposes broad NLP capabilities, including generic summarization, classification, OCR, correction, and knowledge-graph functions, which are not clearly justified by the stated social-watch purpose. Overbroad auxiliary capabilities increase attack surface and enable unintended processing of arbitrary user-supplied text or images beyond the expected monitoring workflow.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The fallback tool is defined as a raw catch-all without any endpoint constraints or activation policy. In an agent setting, an unconstrained fallback can bypass the curated mapping and permit calls to unintended endpoints, undermining least privilege and making other scope controls ineffective.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The code loads app credentials from environment variables and a default file under ~/.config/gsdata/credentials.json, which is sensitive-secret access. The CLI/help text explains how to supply credentials, but there is no warning or disclosure about reading secrets automatically from the environment or local filesystem.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The natural-language fields such as "cateName" and "desc" throughout the manifest are presented exclusively in Chinese, with no indication that users can opt into another language or that the skill is limited to a Chinese-language context. This can violate language/locale policy when a skill implicitly forces a single language without documenting user choice or justification.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.