Back to skill

Security audit

Abstract Searcher

Security checks for vulnerabilities and agentic risk

Overview

The skill performs a coherent bibliography-enrichment task, but it asks agents to use the user's real Chrome login sessions and automatically sends bibliography metadata to several external services without strong scoping or consent controls.

Install only if you are comfortable sharing bibliography-derived search terms with arXiv, OpenAlex, CrossRef, Semantic Scholar, Google Scholar, and potentially publisher sites. Avoid using it on confidential, unpublished, or enterprise bibliographies unless you can restrict network access. Do not allow the browser fallback to use your normal Chrome profile or institutional login unless you intentionally want those sessions used.

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 (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/add_abstracts.py:52
Finding
Untrusted Abstract Injection Through Plaintext arXiv Transport<![CDATA[ ## Vulnerability Details **File Location**: `scripts/add_abstracts.py:52-55`, `scripts/add_abstracts.py:253-260`; also documented in `SKILL.md:31` **Vulnerability Type**: Plaintext external API transport combined with unsafe BibTeX serialization **Risk Level**: Medium ### Vulnerable Code The arXiv API request uses unencrypted HTTP: ```python url = f'http://export.arxiv.org/api/query?search_query={urllib.parse.quote(query)}&max_results=5' req = urllib.request.Request(url, headers={'User-Agent': 'AbstractSearcher/1.0'}) with urllib.request.urlopen(req, timeout=15) as response: xml_content = response.read().decode('utf-8') ``` The remotely supplied abstract is inserted into BibTeX without escaping braces or potentially dangerous LaTeX control sequences: ```python def clean_abstract(text: str) -> str: """Clean abstract text for BibTeX""" # Remove excessive whitespace text = re.sub(r'\s+', ' ', text).strip() # Remove or escape problematic characters (minimal) text = text.replace('\n', ' ') text = text.replace('\r', ' ') # Escape curly braces that aren't already escaped # text = text.replace('{', '\\{').replace('}', '\\}') return text ``` ```python if abstract: clean_abs = clean_abstract(abstract) lines.append(f" abstract={{{clean_abs}}},") ``` ### Technical Analysis Because the arXiv request is made over plaintext HTTP, it lacks transport confidentiality and server authentication. An attacker able to intercept or modify network traffic can replace the API response with forged XML. The script performs only a lenient title check and accepts the supplied summary as the abstract. `clean_abstract()` normalizes whitespace but does not safely encode BibTeX syntax, braces, or LaTeX control sequences. Brace escaping is explicitly commented out. Consequently, a forged abstract can terminate or restructure the generated field or introduce attacker-controlled LaTeX content. The Python script itself does not ex ...[truncated 1755 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the plaintext endpoint with the authenticated HTTPS endpoint: ```python url = ( 'https://export.arxiv.org/api/query' f'?search_query={urllib.parse.quote(query)}&max_results=5' ) ``` 2. Do not disable TLS certificate verification. Use the platform trust store and reject redirects that downgrade from HTTPS to HTTP. 3. Treat all API response fields as untrusted. Serialize output through a maintained BibTeX library rather than constructing entries with string interpolation. 4. If manual serialization remains necessary, implement context-aware escaping for braces, backslashes, percent signs, and other BibTeX or LaTeX metacharacters. Prefer a conservative allowlist or encode abstract text so that it cannot terminate its field. 5. Consider rejecting unexpected control sequences, unmatched braces, NUL bytes, and other control characters in remote abstracts. 6. Strengthen record matching by comparing normalized complete titles and available identifiers such as DOI or arXiv ID instead of accepting any result with three matching words among the first five. 7. Add security tests using forged abstracts containing closing braces, additional BibTeX entries, LaTeX commands, and malformed Unicode. Verify that each payload remains inert text after serialization and downstream parsing. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The documented behavior does not fully match the declared purpose: it uses OpenAlex without clear disclosure and instructs a browser-based Google Scholar fallback using the user's real Chrome profile, while the description understates that risk. Behavior mismatches are dangerous because they impair informed consent and can conceal privacy-sensitive actions or tool usage beyond what a user expects.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill declares no explicit tool scope despite clearly requiring file access and multiple outbound network calls. This weakens user and platform oversight because consumers of the skill are not given an accurate permissions boundary, increasing the chance that the skill is run with broader capabilities than expected.

External Transmission

Medium
Category
Data Exfiltration
Content
## API Sources (No keys required)

1. **arXiv API**: `http://export.arxiv.org/api/query?search_query=...`
2. **Semantic Scholar**: `https://api.semanticscholar.org/graph/v1/paper/search?query=...`
3. **CrossRef**: `https://api.crossref.org/works?query.title=...`
4. **OpenAlex**: `https://api.openalex.org/works?search=...`
Confidence
83% confidence
Finding
This skill sends paper titles and related query data to Semantic Scholar, which is an external third party. Even if the data is not highly sensitive in most cases, bibliographic inputs can still reveal research interests, unpublished work, or user-specific document contents when transmitted externally.

External Transmission

Medium
Category
Data Exfiltration
Content
1. **arXiv API**: `http://export.arxiv.org/api/query?search_query=...`
2. **Semantic Scholar**: `https://api.semanticscholar.org/graph/v1/paper/search?query=...`
3. **CrossRef**: `https://api.crossref.org/works?query.title=...`
4. **OpenAlex**: `https://api.openalex.org/works?search=...`

## Browser Fallback (IMPORTANT!)
Confidence
83% confidence
Finding
This skill transmits bibliographic search terms to CrossRef, an external service, which creates a data exposure channel outside the local environment. In research or enterprise contexts, even paper-title queries may disclose confidential topics, draft citations, or project direction.

External Transmission

Medium
Category
Data Exfiltration
Content
1. **arXiv API**: `http://export.arxiv.org/api/query?search_query=...`
2. **Semantic Scholar**: `https://api.semanticscholar.org/graph/v1/paper/search?query=...`
3. **CrossRef**: `https://api.crossref.org/works?query.title=...`
4. **OpenAlex**: `https://api.openalex.org/works?search=...`

## Browser Fallback (IMPORTANT!)
Confidence
84% confidence
Finding
The skill sends search data to OpenAlex, another third-party endpoint not prominently disclosed in the top-level description. The context makes this more concerning because the skill is processing user-supplied bibliography content, and external transmission of that content may reveal sensitive research themes or unpublished references.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The browser fallback tells the operator to use a real Chrome profile with existing login sessions to access third-party sites, including potentially subscription-backed publishers, but does not give a clear up-front warning about the privacy and account risks. This is dangerous because the skill may cause searches and page visits to be performed under the user's identity, exposing query data, institutional access, and session context to external sites.

External Transmission

Medium
Category
Data Exfiltration
Content
search_title = re.sub(r'[^\w\s]', ' ', title).strip()
        # Use first 100 chars of title
        search_title = search_title[:100]
        url = f'https://api.semanticscholar.org/graph/v1/paper/search?query={urllib.parse.quote(search_title)}&fields=title,abstract&limit=5'
        
        req = urllib.request.Request(url, headers={
            'User-Agent': 'AbstractSearcher/1.0',
Confidence
90% confidence
Finding
This request sends user-supplied bibliography metadata to Semantic Scholar over the network. While expected for the feature, it is still an external data transmission path that can disclose sensitive research topics or author associations when run on private or prepublication bibliographies.

External Transmission

Medium
Category
Data Exfiltration
Content
first_author = author.split(' and ')[0].split(',')[0].strip()
            query_parts.append(f'query.author={urllib.parse.quote(first_author)}')
        
        url = f'https://api.crossref.org/works?{"&".join(query_parts)}&rows=5'
        
        req = urllib.request.Request(url, headers={
            'User-Agent': 'AbstractSearcher/1.0 (mailto:contact@example.com)'
Confidence
93% confidence
Finding
The CrossRef lookup sends the paper title and, when present, the first author name to an external service. Author names can increase identifiability and sensitivity of the query, making this a meaningful privacy exposure for confidential bibliographies.

External Transmission

Medium
Category
Data Exfiltration
Content
"""Search OpenAlex for abstract (open alternative to Semantic Scholar)"""
    try:
        search_title = re.sub(r'[^\w\s]', ' ', title).strip()[:150]
        url = f'https://api.openalex.org/works?search={urllib.parse.quote(search_title)}&per_page=5'
        
        req = urllib.request.Request(url, headers={
            'User-Agent': 'AbstractSearcher/1.0',
Confidence
95% confidence
Finding
The OpenAlex request transmits bibliography titles to a third-party API, and this provider is not declared in the skill metadata. The undisclosed outbound transfer increases privacy risk because users may not realize their local bibliography contents are being shared beyond the named services.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The stated skill purpose says it searches academic databases 'with browser fallback,' implying a non-API fallback path when database queries fail. The orchestrator only tries API calls to arXiv, OpenAlex, CrossRef, and Semantic Scholar, then returns None, so the advertised browser fallback behavior is absent.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The script automatically transmits BibTeX-derived metadata such as paper titles and possibly author names to multiple external APIs without explicit user warning or consent. In many research or enterprise environments, bibliographies can reveal confidential projects, reading interests, collaboration networks, or unpublished work, so silent exfiltration to third parties creates a real privacy and data-governance risk.

Description-Behavior Mismatch

Low
Confidence
94% confidence
Finding
The manifest limits the academic database sources to arXiv, Semantic Scholar, and CrossRef, with browser fallback. The implementation adds a fourth external source, OpenAlex, which is a real behavior expansion beyond the described scope rather than an obvious implementation detail of those named sources.

Static analysis

No suspicious patterns detected.