Back to skill

Security audit

aminer-data-search

Security checks for vulnerabilities and agentic risk

Overview

This AMiner skill is mostly purpose-aligned, but users should review it because it can spend paid API credits and the bundled client does not enforce the skill's promised high-cost confirmation.

Install only if you are comfortable using a paid AMiner API token and sending academic queries, scholar names, organization names, venue names, and patent searches to AMiner. Use an environment variable or secret manager for the token rather than pasting it into chat or passing it on the command line. Manually review and confirm high-cost workflows, especially scholar_profile, and prefer the free AMiner skill for simple lookups.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/aminer_client.py:904
Finding

High-Cost Scholar Profile Workflow Executes Without Mandatory Confirmation

Content
View full analysis

Vulnerability Details

File Location: scripts/aminer_client.py:904-916, 937-940
Vulnerability Type: Missing cost-authorization enforcement
Risk Level: Medium

Vulnerable Code

python
if args.dry_run:
    info = WORKFLOW_DRY_RUN_INFO.get(args.action, [])
    if not info:
        print(f"[Dry Run] No preview available for action '{args.action}'.")
    else:
        total = sum(p for _, p in info)
        print(f"[Dry Run] Action: {args.action}")
        for i, (api, price) in enumerate(info, 1):
            label = "Free" if price == 0 else f"¥{price:.2f}"
            print(f"  {i}. {api} ({label})")
        print(f"  Estimated total: ¥{total:.2f}")
    return
python
if args.action == "scholar_profile":
    if not args.name:
        parser.error("--action scholar_profile requires --name")
    result = workflow_scholar_profile(token, args.name)

The required policy is documented in SKILL.md:37-38:

text
High-Cost Confirmation (≥ ¥5): Before executing a workflow or call chain
whose estimated total cost is ¥5.00 or more, stop and ask the user for
confirmation first.

Technical Analysis

The scholar_profile workflow has an estimated cost of approximately ¥6.00. Although the client supports an optional --dry-run mode that displays this estimate, it does not enforce confirmation before executing the workflow.

When --dry-run is omitted, control proceeds directly to workflow_scholar_profile(). That workflow performs a free scholar search and then launches five paid APIs in parallel:

  • person_detail: ¥1.00
  • person_figure: ¥0.50
  • person_paper_relation: ¥1.50
  • person_patent_relation: ¥1.50
  • person_project: ¥1.50

The executable behavior therefore contradicts the Skill's mandatory high-cost confirmation rule. Documentation and agent instructions are not sufficient security controls because the command-line client can be invoked directly or by automation.

Attack Path

  1. An attacker, automation pro ...[truncated 1048 chars]
Remediation
View remediation

Remediation Suggestions

Enforce cost confirmation in executable code rather than relying on documentation or optional dry-run behavior.

  1. Calculate the maximum expected cost before dispatching any workflow.
  2. If the estimate is at least ¥5.00, reject execution unless the caller supplies an explicit confirmation flag such as --confirm-cost.
  3. Display the complete API chain and cost breakdown before exiting or requesting confirmation.
  4. Require the confirmation flag to be supplied separately from the action, making accidental invocation less likely.
  5. Apply the same centralized check to raw API calls and future workflows whose aggregate estimated cost reaches the threshold.
  6. Consider allowing users to select only required profile modules rather than always retrieving details, portrait, papers, patents, and projects.
  7. Add automated tests proving that scholar_profile makes no network request without confirmation.

Example enforcement:

python
p.add_argument(
    "--confirm-cost",
    action="store_true",
    help="Explicitly authorize workflows estimated to cost ¥5.00 or more",
)

planned = WORKFLOW_DRY_RUN_INFO.get(args.action, [])
estimated_total = sum(price for _, price in planned)

if estimated_total >= 5.00 and not args.confirm_cost:
    print(f"Estimated total: ¥{estimated_total:.2f}", file=sys.stderr)
    for api, price in planned:
        print(f"  {api}: ¥{price:.2f}", file=sys.stderr)
    parser.error(
        "Explicit confirmation is required. Review the plan and rerun "
        "with --confirm-cost to authorize the charge."
    )

T09 · Insecure Skill Coding Practices

Note
Location
scripts/aminer_client.py:826
Finding

API Token Accepted Through Plaintext Chat and Command-Line Channels

Content
View full analysis

Vulnerability Details

File Location: scripts/aminer_client.py:826-830, 902; related guidance in SKILL.md:56-58
Vulnerability Type: Sensitive credential exposure through insecure input channels
Risk Level: Low

Vulnerable Code

python
p.add_argument(
    "--token",
    default=None,
    help=(
        "AMiner API Token. If not provided, reads from the environment variable AMINER_API_KEY by default; "
        "or go to https://open.aminer.cn/open/board?tab=control to generate one."
    ),
)
python
token = (args.token or os.getenv("AMINER_API_KEY") or "").strip()

The related Skill guidance explicitly permits inline token submission:

text
If the user provides AMINER_API_KEY inline (e.g. "My token is xxx"),
accept it for the current session, but recommend setting it as an
environment variable for better security.

Technical Analysis

The client does not print the token and correctly transmits it over HTTPS in the Authorization header. Sending that credential to the fixed AMiner API endpoint is necessary for authentication.

The insecure behavior concerns how the credential is acquired:

  • A token pasted into an agent conversation may be retained in conversation history, telemetry, evaluation traces, or application logs.
  • A token supplied using --token may be retained in shell history.
  • Command-line arguments may be visible to local process-inspection tools while the client is running.
  • Examples prominently using --token <TOKEN> encourage users to select the less secure input mechanism.

Environment-variable input is already supported and is safer than direct command-line input, although permission-restricted credential files or hidden interactive input can provide stronger protection in some environments.

Attack Path

  1. A user pastes a real AMiner token into an agent conversation or invokes:
    bash
    python scripts/aminer_client.py \
      --token REAL_AMINER_TOKEN \
      --action paper_de
    

...[truncated 1130 chars]

Remediation
View remediation

Remediation Suggestions

  1. Remove guidance that encourages users to paste tokens into conversations.
  2. Deprecate or remove --token so credentials are not exposed in command histories or process argument lists.
  3. Prefer AMINER_API_KEY or a permission-restricted credential file.
  4. If interactive entry is required, use hidden input through getpass.getpass().
  5. Update all examples to use environment-variable configuration:
    bash
    export AMINER_API_KEY='...'
    python scripts/aminer_client.py \
      --action paper_deep_dive \
      --title "BERT"
    
  6. Warn users that any token previously pasted into chat or passed on a command line should be rotated.
  7. Ensure errors, debug output, telemetry, and HTTP exception handling never include request headers.
  8. Where supported, use short-lived, scoped tokens with spending or quota limits.
  9. Add secret-redaction controls to surrounding agent and evaluation infrastructure.

A safer interactive fallback could be implemented as follows:

python
import getpass

token = (os.getenv("AMINER_API_KEY") or "").strip()
if not token:
    token = getpass.getpass("AMiner API token: ").strip()

if not token:
    parser.error("An AMiner API token is required.")
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (17)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares access to sensitive capabilities in practice (environment variable checks, shell snippet, and outbound network/API usage) but does not explicitly constrain them with a tool/permission scope. That creates an authorization gap where an agent runtime may grant broader access than necessary, increasing the blast radius if the skill is misrouted, prompt-injected, or later modified.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The activation criteria are extremely broad and claim priority for essentially any academic or research-related query. In context, this is risky because the skill can trigger unnecessarily on common informational requests and then steer the agent into networked, token-using, potentially paid workflows, expanding data exposure and cost impact beyond user expectations.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly tells the agent to accept an API key provided inline by the user for the current session. This normalizes handling secrets in conversation text, which risks accidental logging, model retention, transcript exposure, downstream prompt leakage, or reuse outside the user's intent.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · evals/evals.json (reported line 156)May include surrounding context.

json
{
      "id": 13,
      "prompt": "Help me deep-dive into the paper 'BERT: Pre-training of Deep Bidirectional Transformers' — get the full details and citation chain. My token is <YOUR_TOKEN>",
      "expected_output": "Run the paper_deep_dive workflow (estimated ~¥0.12, below the ¥5 threshold, so no confirmation needed). After completion, output a cost summary showing each API called and total cost.",
      "files": [],
      "expectations": [
        "Did NOT ask for cost confirmation (estimated cost is well below ¥5)",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The document instructs users to send authenticated requests containing user-supplied academic queries to a third-party service, but it provides no warning about protecting the API key, minimizing sensitive data, or obtaining consent before transmitting prompts and identifiers externally. In an agent skill context, this can cause unreviewed disclosure of user data and unsafe handling of bearer tokens, especially if downstream tooling logs headers or request payloads.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

This example shows natural-language user queries being POSTed to an external API with an Authorization token. In a skill that may be automatically routed for academic questions, such free-form queries can contain sensitive research topics, personal data, or proprietary information, and the documentation does not instruct the agent to screen, redact, or obtain consent before sending them off-platform.

Content

Scanner excerpt · references/api-catalog.md (reported line 140)May include surrounding context.

| doi | DOI | | Total / total | Total count |

curl Example (natural language Q&A):

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/paper/qa/search' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 202)May include surrounding context.

| venue_id | Venue ID | | year | Publication year |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/paper/info' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
82% confidence
Finding

This example sends a person's name to an external service under an authenticated request, which can expose personal lookup activity and user-supplied identifiers to a third party. In an agent environment, scholar/person searches may include real individuals, and the document lacks guidance on consent, logging controls, and restrictions on sending personal data externally.

Content

Scanner excerpt · references/api-catalog.md (reported line 402)May include surrounding context.

| n_citation | Citation count | | total | Total count |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/person/search' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 604)May include surrounding context.

| org_name | Institution name | | total | Total count |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/organization/search' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 642)May include surrounding context.

| language | Language | | total | Total count |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/organization/detail' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 768)May include surrounding context.

|--------|------| | org_name | Normalized institution name |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/organization/na' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 802)May include surrounding context.

| 二级ID | Secondary institution ID | | Total / total | Total count |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/organization/na/pro' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 839)May include surrounding context.

| venue_type | Venue type: journal or conference | | total | Total count |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/venue/search' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 874)May include surrounding context.

| alias | Alias | | type | Journal type |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/venue/detail' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 911)May include surrounding context.

| offset | Current offset | | total | Total count |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/venue/paper/relation' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api-catalog.md (reported line 950)May include surrounding context.

| app_year | Application year | | pub_year | Publication year |

curl Example:

bash
curl -X POST \
  'https://datacenter.aminer.cn/gateway/open_platform/api/patent/search' \

Scope Creep

Low
Category
Excessive Agency
Confidence
70% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · SKILL.md (reported line 7)May include surrounding context.

md
author: AMiner
contact: report@aminer.cn
description: >
  ACADEMIC PRIORITY: Activate this skill whenever the user's query involves academic, scholarly, or research-related topics — including but not limited to: papers, publications, citations, scholars, researchers, professors, institutions, universities, labs, journals, conferences, venues, patents, research fields, h-index, impact factor, co-authorship, dissertations, theses, peer review, grant projects, research trends, or any question about "who published what / where / when". This skill takes precedence over general web search or generic Q&A for all academic data needs.
  Full-featured AMiner skill with 27 APIs and 5 workflows. Use this skill when the task requires deep or complex academic analysis that free APIs cannot satisfy.
  Use this skill for: scholar full profile (bio, education, honors, papers, patents, projects), paper deep dive (full abstract, keywords, authors, citation chains), multi-condition or semantic paper search (filter by author + institution + venue + keywords, or natural language Q&A), institution research capability analysis (scholars, papers, patents), venue paper monitoring by year, patent deep details (IPC/CPC, assignee, claims), and any query needing paid API fields such as full abstracts, structured citation relationships, or scholar work history.
  Do NOT use this skill for simple lookups that free APIs can answer — such as checking a paper title, identifying a scholar by name, normalizing an institution or venue name, or scanning patent trends by keyword. For those, use aminer-free-search instead.

Static analysis

No suspicious patterns detected.