T09 · Insecure Skill Coding Practices
- Location
liepin_mcp.py:61- Finding
Configurable MCP Endpoint Can Exfiltrate the Liepin User Token
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a real Liepin job-search helper, but it can handle account tokens, resumes, and job applications without enough enforced safeguards.
Review before installing. Use only the official Liepin endpoint, avoid the --url option unless you fully trust the destination, protect or remove the saved config file, and manually verify every resume update or job application before allowing the agent to run it. Revoke/regenerate the Liepin token if it may have been saved with weak permissions or sent to an untrusted endpoint.
liepin_mcp.py:61Configurable MCP Endpoint Can Exfiltrate the Liepin User Token
liepin_mcp.py:31Long-Lived User Token Is Stored Without Explicitly Restrictive File Permissions
liepin_mcp.py:172Irreversible Job Applications Lack Code-Level User Confirmation
The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'file_read' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'file_write' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'mcp' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The trigger list includes broad everyday terms such as 求职, 招聘, 简历, and 搜职位, which can match many ordinary conversations and cause accidental activation. Because this skill can access resumes and submit job applications, unintended invocation could expose personal data or prepare irreversible actions in the wrong context.
The skill exposes list-tools and a generic call <tool-name> interface, which expands its effective capability beyond the declared job-search and resume-management scope. This creates a scope-bypass risk: if the upstream MCP server exposes additional sensitive or state-changing tools, the agent could enumerate and invoke them without explicit user understanding or manifest-level restriction.
The workflow says to act when the user says broad phrases like '帮我找工作', which is ambiguous and may not clearly indicate consent to use this specific external service. In this skill’s context, ambiguous invocation is more dangerous because the tool can read/edit resume data and lead toward irreversible application submission.
The default prompt broadly instructs the agent to use the skill for searching roles, reviewing resumes, and preparing applications, which increases the chance of implicit or unintended invocation when a user mentions related topics. Because this skill can act on sensitive job-seeking data and potentially submit applications, over-broad activation could trigger privacy-sensitive operations without sufficiently explicit user intent.
Applying to a job is an externally visible account action that may affect the user's professional reputation and trigger notifications to employers. Performing it immediately from CLI input with no explicit confirmation increases the risk of accidental or coerced submissions, especially when used by higher-level agents.
Resume updates modify sensitive profile data on a remote service, but the command sends changes without an explicit warning, preview, or confirmation. This raises the risk of accidental corruption of the user's resume or unauthorized profile changes when invoked by automation.
The generic call subcommand allows invocation of arbitrary remote MCP tools, which exceeds the skill's declared scope of job search, applications, and resume management. If the remote server exposes additional sensitive account or data-manipulation tools, this CLI becomes a broad proxy for unintended actions under the user's token.
Enumerating all remote MCP tools broadens discovery beyond the stated purpose-specific workflow and can reveal unexpected capabilities available under the authenticated session. In combination with the generic call feature, this materially increases the chance of misuse by making hidden or administrative tools easier to find and invoke.
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
arguments = {}
for key in ("jobName", "address", "salary", "education", "experience", "companyType", "companyName"):
val = getattr(args, key, None)
if val:
arguments[key] = val