Back to skill

Security audit

Sticker Manager

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches sticker management, but it has review-worthy flaws that can let supplied names or URLs reach outside the intended sticker library.

Review before installing. Fix or accept the risks around path containment for rename/delete, restrict remote URL fetching to safe public destinations, enforce download and image-validation limits, and avoid using context recommendation on sensitive chat histories. Pin dependencies for reproducible installs.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (5)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/manage_sticker.py:12
Finding

Path Traversal Permits Arbitrary File Deletion and Movement

Content
View full analysis
str: ext = os.path.splitext(name)[1].lower() if ext in SUPPORTED_EXTS: return name for candidate_ext in SUPPORTED_EXTS: candidate = name + candidate_ext if os.path.exists(os.path.join(TARGET_DIR, candidate)): return candidate return name + '.jpg' def delete_sticker(name, lang=None): name = resolve_name(name) filepath = os.path.join(TARGET_DIR, name) if not os.path.exists(filepath): return False, t('delete_missing', lang, name=name) os.remove(filepath) return True, t('delete_success', lang, name=name) def rename_sticker(old_name, new_name, lang=None): old_name = resolve_name(old_name) old_ext = os.path.splitext(old_name)[1].lower() or '.jpg' if os.path.splitext(new_name)[1].lower() not in SUPPORTED_EXTS: new_name += old_ext old_path = os.path.join(TARGET_DIR, old_name) new_path = os.path.join(TARGET_DIR, new_name) if not os.path.exists(old_path): return False, t('rename_missing', lang, name=old_name) if os.path.exists(new_path): return False, t('rename_exists', lang, name=new_name) shutil.move(old_path, new_path) return True, t('rename_success', lang, old=old_name, new=new_name) ``` ### Technical Analysis `resolve_name()` returns a supplied name unchanged whenever its extension is one of the supported media extensions. It does not reject absolute paths, path separators, or `..` components. The resulting value is joined to `TARGET_DIR` and passed directly to `os.remove()` or `shutil.move()`. Joining a base directory with traversal components does not guarantee containment. An absolute second argument can also cause `os.path.join()` to discard the base directory entirely. Both sou ...[truncated 1257 chars]
Remediation
View remediation
str: if not name or name != os.path.basename(name): raise ValueError("Sticker names must not contain path components") if os.path.isabs(name): raise ValueError("Absolute paths are not allowed") return name ``` 2. Resolve and validate every path before accessing it: ```python root = Path(TARGET_DIR).resolve() candidate = (root / validated_name).resolve() if not candidate.is_relative_to(root): raise ValueError("Path escapes the sticker library") ``` 3. Apply containment validation independently to rename source and destination paths. 4. Reject `/`, `\`, null bytes, `.` and `..` path components. 5. Consider rejecting symlinks or ensuring the final resolved target remains within the library. 6. Add tests covering relative traversal, absolute paths, nested separators, symlink escapes, and valid library operations. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/discover_sources.py:54
Finding

Server-Side Request Forgery Through Unrestricted URL Fetching

Content
View full analysis
Optional[Dict]: """Fetch URL and return info dict if it's a valid image.""" try: head = requests.head(url, headers={'User-Agent': DEFAULT_USER_AGENT}, timeout=timeout, allow_redirects=True) content_type = head.headers.get('Content-Type', '') if not any(ct in content_type for ct in ['image/', 'application/octet-stream']): # Try GET if HEAD doesn't give content type pass if head.status_code == 200: size = int(head.headers.get('Content-Length', 0)) return {'url': url, 'size': size, 'status': 'ok'} except Exception: pass try: r = requests.get(url, headers={'User-Agent': DEFAULT_USER_AGENT}, timeout=timeout, stream=True) if r.status_code == 200: size = int(r.headers.get('Content-Length', 0)) return {'url': url, 'size': size, 'status': 'ok'} except Exception as e: return {'url': url, 'size': 0, 'status': 'error', 'error': str(e)} return None ``` ```python def scrape_page_images(url: str, timeout: int = DEFAULT_TIMEOUT) -> List[Dict]: """Scrape static page for image URLs.""" results = [] try: r = requests.get(url, headers={'User-Agent': DEFAULT_USER_AGENT}, timeout=timeout) r.raise_for_status() img_pattern = r']+src=["\']([^"\']+)["\']' matches = re.findall(img_pattern, r.text) for match in matches: img_url = urljoin(url, match) if is_image_url(img_url): results.append({'url': img_url, 'status': 'pending'}) ``` From `scripts/collect_stickers.py`: ```python def ...[truncated 3435 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/collect_stickers.py:160
Finding

Unbounded Remote Response Buffering Enables Resource Exhaustion

Content
View full analysis
tuple[bytes, str | None, str, dict]: if source.startswith('http://') or source.startswith('https://'): resolved_source, forced_ext, meta = resolve_remote_source(source) r = requests.get(resolved_source, headers=DEFAULT_HEADERS, timeout=30) r.raise_for_status() content_type = r.headers.get('Content-Type') meta['animated_detected'] = is_animated_bytes(r.content, content_type) meta['animation_reference'] = is_probably_animated_reference(resolved_source, content_type) return r.content, content_type, forced_ext or resolved_source, meta data = Path(source).read_bytes() meta = { 'resolved_from': source, 'animated_preferred': False, 'resolver': 'local', 'animated_detected': is_animated_bytes(data, None), 'animation_reference': is_probably_animated_reference(source, None), } return data, None, source, meta ``` The caller only evaluates size after the full response has been read: ```python def collect_one(item: tuple[int, str], prefix: str, out_dir: Path, min_bytes: int) -> dict: idx, source = item data, content_type, resolved_hint, meta = read_bytes(source) size = len(data) if size < min_bytes: return {'source': source, 'status': 'low_quality', 'size': size, 'content_type': content_type, **meta} ``` ### Technical Analysis Accessing `r.content` causes Requests to buffer the entire response in memory. The configured timeout does not impose a maximum response size and does not necessarily provide a strict total-operation deadline. No maximum download size is enforced before or during response consumption. Size is measured only after all bytes have already been allocated. A malicious or compromis ...[truncated 1234 chars]
Remediation
View remediation
MAX_DOWNLOAD_BYTES: raise ValueError("Remote media exceeds the size limit") ``` 2. Reject a declared `Content-Length` above the configured maximum before reading. 3. Enforce the limit independently while streaming because `Content-Length` can be absent or false. 4. Use separate connection and read timeouts and, where supported, a total operation deadline. 5. Limit decompressed image dimensions and frame counts in addition to compressed byte size. 6. Close responses through context managers. 7. Apply request-count, bandwidth, and concurrent-download limits. 8. Add tests with oversized, chunked, compressed, and slow responses. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/batch_import.py:47
Finding

Extension-Only Media Validation Allows Disguised or Malformed Files

Content
View full analysis
bool: """Check if file has a supported image extension.""" return path.suffix.lower() in SUPPORTED_EXTS ``` ```python def scan_source_directory(directory: str, recursive: bool = True) -> List[Path]: """Scan a directory for image files.""" results = [] base = Path(directory).expanduser() if not base.exists() or not base.is_dir(): return results if recursive: pattern = '**/*' else: pattern = '*' for f in base.glob(pattern): if f.is_file() and is_image_file(f): results.append(f) return results ``` ```python if copy: shutil.copy2(src_file, target_file) else: target_file.symlink_to(src_file) ``` From `scripts/save_sticker_auto.py`: ```python def check_quality(filepath, lang=None): size = os.path.getsize(filepath) if size < 2048: return False, t('quality_reason_too_small', lang, size=size), 20 if size < 5120: return False, t('quality_reason_small', lang, size_kb=size // 1024), 40 ext = os.path.splitext(filepath)[1].lower() if ext not in SUPPORTED_EXTS: return False, t('unsupported_format', lang, ext=ext), 0 if size >= 51200: return True, f'high ({size // 1024}KB)', 90 if size >= 20480: return True, f'good ({size // 1024}KB)', 75 if size >= 10240: return True, f'medium ({size // 1024}KB)', 60 return True, f'usable ({size // 1024}KB)', 50 ``` From `scripts/collect_stickers.py`: ```python ext = infer_extension(resolved_hint, '.gif', content_type) digest = hashlib.md5(data).hexdigest() name = f'{prefix}_{idx:02d}{ext}' path = o ...[truncated 1865 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unbounded Dependency Versions Produce Non-Reproducible Installations

Content
View full analysis
=9.0 requests>=2.31 Pillow>=10.0 ``` The documented installation command in `README.md` is: ```bash python3 -m pip install -r requirements.txt ``` ### Technical Analysis All dependencies use open-ended minimum-version constraints. There is no lockfile, exact version pinning, package hash verification, or upper compatibility boundary. A future installation can therefore select dependency versions that did not exist when the Skill was audited. This makes builds non-reproducible and allows newly introduced malicious, compromised, or incompatible upstream releases to enter the environment without a corresponding change to this repository. `pytest` is also included in the runtime requirements even though it is a development and testing dependency, unnecessarily increasing the production dependency surface. ### Attack Path 1. A dependency account or release process is compromised, or a future release introduces dangerous behavior. 2. The unbounded constraint continues to accept that new release. 3. A user runs the documented installation command. 4. Pip resolves and installs the new accepted version. 5. Package installation or later import executes behavior that was not part of the audited dependency set. No evidence was found that the currently named packages are typosquatted or intentionally malicious; this finding concerns the unsafe resolution policy. ### Impact Assessment Impact depends on the behavior of the subsequently selected dependency release. A compromised package can potentially execute with the privileges of the user running pip and access that user’s files, credentials, and network environment. Under ordinary circumstances, the more likely impact is inconsistent behavior or compatibility failure rather than exploitation. ]]>
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (107)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The inclusion of a sensitive-content or secret-scanning component in a sticker-management skill is a meaningful scope mismatch because it introduces repository/content inspection behavior unrelated to the stated media-management task. Even if intended as a safety feature, unrelated scanning logic can expand access to non-image files and surprise users by analyzing data outside the expected sticker library context.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The inclusion of a sensitive-content or secret-scanning component in a sticker-management skill is a meaningful scope mismatch because it introduces repository/content inspection behavior unrelated to the stated media-management task. Even if intended as a safety feature, unrelated scanning logic can expand access to non-image files and surprise users by analyzing data outside the expected sticker library context.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The inclusion of a sensitive-content or secret-scanning component in a sticker-management skill is a meaningful scope mismatch because it introduces repository/content inspection behavior unrelated to the stated media-management task. Even if intended as a safety feature, unrelated scanning logic can expand access to non-image files and surprise users by analyzing data outside the expected sticker library context.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

The inclusion of a sensitive-content or secret-scanning component in a sticker-management skill is a meaningful scope mismatch because it introduces repository/content inspection behavior unrelated to the stated media-management task. Even if intended as a safety feature, unrelated scanning logic can expand access to non-image files and surprise users by analyzing data outside the expected sticker library context.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The inclusion of a sensitive-content or secret-scanning component in a sticker-management skill is a meaningful scope mismatch because it introduces repository/content inspection behavior unrelated to the stated media-management task. Even if intended as a safety feature, unrelated scanning logic can expand access to non-image files and surprise users by analyzing data outside the expected sticker library context.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The inclusion of a sensitive-content or secret-scanning component in a sticker-management skill is a meaningful scope mismatch because it introduces repository/content inspection behavior unrelated to the stated media-management task. Even if intended as a safety feature, unrelated scanning logic can expand access to non-image files and surprise users by analyzing data outside the expected sticker library context.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The inclusion of a sensitive-content or secret-scanning component in a sticker-management skill is a meaningful scope mismatch because it introduces repository/content inspection behavior unrelated to the stated media-management task. Even if intended as a safety feature, unrelated scanning logic can expand access to non-image files and surprise users by analyzing data outside the expected sticker library context.

Content

No source excerpt is available for this finding.

Context Leakage

High
Category
Data Exfiltration
Confidence
98% confidence
Finding

The code explicitly constructs a task to 'Analyze the chat history and extract context' and includes the recent message contents in the payload. In the context of a sticker manager, this is an unjustified context-leakage capability that can expose sensitive conversation data to external/model systems, making the issue more serious than generic telemetry because it processes semantically rich private text.

Content

Scanner excerpt · scripts/sticker_semantic.py (reported line 247)May include surrounding context.

python
# Build analysis plan for model
    analysis_plan = {
        'task': 'Analyze the chat history and extract context for sticker recommendation.',
        'language': lang,
        'history': texts[-10:],
        'extract': [

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_auto_tag.py (reported line 25)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_auto_tag.py (reported line 52)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_auto_tag.py (reported line 70)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_auto_tag.py (reported line 95)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_auto_tag.py (reported line 108)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_auto_tag.py (reported line 124)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_auto_tag.py (reported line 156)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 31)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 55)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 84)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 106)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 126)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 151)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 179)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 193)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 219)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · tests/test_batch_import.py (reported line 238)May include surrounding context.

python
def test_get_sticker_outputs_zh_for_missing_library(tmp_path):
    env = os.environ.copy()
    env['STICKER_MANAGER_DIR'] = str(tmp_path / 'missing-lib')
    result = run_script('get_sticker.py', '--lang=zh', 'keyword', env=env)
    assert result.returncode == 1

Static analysis

Detected: suspicious.obfuscated_code

Potential obfuscated payload detected.

Warn
Code
suspicious.obfuscated_code
Location
tests/test_collect.py:82