Back to skill

Security audit

deepresearchpro

Security checks for vulnerabilities and agentic risk

Overview

This skill is a broad web research helper with some report-quality risks, but its behavior is disclosed and aligned with its research purpose.

Installers should expect a Chinese-oriented deep research workflow that performs broad web browsing and source collection. Users should manually verify important citations, dates, and source domains, especially for current events or high-stakes research.

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/research_tools.py:149
Finding

Unsafe URL Substring Matching Allows Untrusted Sources to Be Classified as Authoritative

Content
View full analysis
Tuple[bool, str]: """ 评估来源质量 Args: url: URL title: 标题 Returns: (是否高质量,质量等级) """ quality_indicators = { 'academic': ['.edu', '.ac.uk', 'nature.com', 'science.org', 'scholar.google.com'], 'authoritative': ['.gov', 'reuters.com', 'bbc.com', 'xinhuanet.com', 'people.com.cn'], 'media': ['caixin.com', 'thepaper.cn', '36kr.com', 'techcrunch.com'], 'social': ['bilibili.com', 'xiaohongshu.com', 'douyin.com'], } url_lower = url.lower() title_lower = title.lower() for quality, indicators in quality_indicators.items(): if any(indicator in url_lower for indicator in indicators): return True, quality # 检查标题质量 spam_keywords = ['广告', '点击这里', '免费领取', '震惊', '必看'] if any(keyword in title_lower for keyword in spam_keywords): return False, 'spam' return True, 'general' ``` ### Technical Analysis The source-quality check searches for trusted-domain indicators as substrings anywhere in the complete URL. It does not parse the URL, isolate and normalize the hostname, validate the scheme, or ensure that the hostname is the trusted domain or one of its legitimate subdomains. An attacker-controlled URL such as the following can therefore receive an authoritative classification: ```text https://reuters.com.attacker.example/fabricated-report https://fake-reuters.com/article https://attacker.example/news?source=reuters.com ``` The final `return True, 'general'` also accepts every source whose title does not contain one of five listed spam phrases. This is a permissive default and does not establish that an unknown source is trustworthy. ### Attack Path 1. An attacker publishes fabricate ...[truncated 1078 chars]
Remediation
View remediation
bool: host = host.lower().rstrip(".") trusted = trusted.lower().rstrip(".") return host == trusted or host.endswith("." + trusted) def classify_source(url: str): try: parsed = urlsplit(url) except ValueError: return False, "invalid" if parsed.scheme != "https" or not parsed.hostname: return False, "invalid" host = parsed.hostname.lower().rstrip(".") trusted_domains = { "academic": ["nature.com", "science.org", "scholar.google.com"], "authoritative": [ "reuters.com", "bbc.com", "xinhuanet.com", "people.com.cn", ], "media": ["caixin.com", "thepaper.cn", "36kr.com", "techcrunch.com"], "social": ["bilibili.com", "xiaohongshu.com", "douyin.com"], } for quality, domains in trusted_domains.items(): if any(is_domain_or_subdomain(host, domain) for domain in domains): return True, quality return False, "requires_manual_verification" ``` 5. Do not classify unknown sources as trusted by default. Return an explicit manual-verification state. 6. Validate redirect destinations before assigning a trust classification. 7. Add tests for deceptive hostnames, trusted names in paths or query strings, embedded credentials, malformed URLs, IP literals, mixed-case hosts, and trailing-dot hostnames. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/research_tools.py:132
Finding

Missing Publication Dates Are Replaced with the Current Date

Content
View full analysis
str: """从 HTML 中提取发布日期""" # 尝试多种日期格式 patterns = [ r'', r'', r'(\d{4}[-/]\d{1,2}[-/]\d{1,2})', ] for pattern in patterns: match = re.search(pattern, html_content) if match: return match.group(1) return datetime.now().strftime("%Y-%m-%d") ``` ### Technical Analysis When no recognized publication date is found, the parser returns the current date. This converts missing or unverifiable metadata into an affirmative claim that the source was published today. The behavior is fail-open: the inability to establish freshness produces the freshest possible result instead of an unknown state. It can cause old, undated, or intentionally manipulated content to be treated as current. The broad fallback regular expression can also select an unrelated date from arbitrary page content rather than a verified publication date. ### Attack Path 1. An attacker publishes or republishes stale content without the recognized publication-date metadata. 2. The page is selected as a research source. 3. `extract_date()` fails to match a recognized date. 4. The function assigns the current date to the page. 5. Any workflow or report relying on this value may present the content as current or prioritize it over accurately dated sources. 6. Stale or misleading claims can consequently influence a time-sensitive research report. ### Impact Assessment This issue provides no system privileges, code execution, or access to protected resources. Its impact is limited to report integrity and the reliability of freshness assessments. Affected ...[truncated 253 chars]
Remediation
View remediation
Optional[str]: patterns = [ r'', r'', ] for pattern in patterns: match = re.search(pattern, html_content, re.IGNORECASE) if match: return match.group(1) return None ``` 2. Keep the retrieval date separate from the publication date. If needed, store it under a distinct field such as `retrieved_at`. 3. Prefer structured metadata such as JSON-LD `datePublished`, Open Graph publication metadata, and standardized HTML time elements. 4. Validate and normalize extracted dates with a strict date parser. 5. Avoid treating arbitrary dates found in page text as publication dates unless corroborated by metadata or page structure. 6. Require manual or independent verification before making freshness claims about sources with missing or ambiguous publication dates. 7. Add tests covering undated pages, stale pages, unrelated dates in article content, malformed metadata, and future-dated content. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (6)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill profile is written to operate in Chinese and does not clearly preserve user language preference or require opt-in before switching output language. This can override user expectations, reduce usability and reviewability for non-Chinese-speaking users, and make downstream verification of cited sources or tool actions harder in a security-sensitive research workflow.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The package description is entirely written as a Chinese-only skill description, indicating the skill is intended to operate in Chinese without any stated user choice of language or locale. Under the policy rule, forcing a specific language without opt-in is a natural-language policy violation unless the locale restriction is clearly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This markdown template mandates a single language/locale for report generation through its headings, instructions, and examples, but does not mention that Chinese is optional or limited to a China-specific workflow. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The entire skill guidance is written in Chinese and includes imperative instructions such as requiring specific tools and search practices, but it does not indicate that Chinese is optional or that the skill is intended only for a Chinese-language or region-specific workflow. Under the policy, forcing a specific language or locale without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The module docstring and all embedded user-facing instructions are written only in Chinese, establishing a single-language interaction pattern without offering any user choice or documenting a justified region-specific scope. This matches the language/locale policy concern for natural-language content in code files.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The top-level documentation explicitly limits the script to query generation and output formatting. However, later code implements SearchResultParser.extract_title, extract_date, and is_quality_source, which perform content parsing and source-quality assessment beyond that stated scope.

Content

No source excerpt is available for this finding.