Back to skill

Security audit

多元星途 · PathwayAtlas

Security checks across malware telemetry and agentic risk

Overview

This skill is an evidence-based college-planning assistant that uses disclosed local Python workflow files and public web sources, with some developer release tooling included but not shown as part of the user-facing runtime.

Install only from the intended repository source and expect the skill to run local Python, create a private anonymous planning workspace, and retrieve public admissions materials. Do not provide student names, phone numbers, IDs, credentials, cookies, or local file paths. Treat generated advice as planning support, not an admission guarantee, and be cautious with PDF/QR or HTTP-only public sources because evidence integrity depends on authenticated, corroborated sources.

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/downloader.py:430
Finding
Plaintext HTTP and HTTPS-to-HTTP Redirect Downgrades Permit Evidence Tampering<![CDATA[ ## Vulnerability Details **File Location**: `scripts/downloader.py:430-434`, `scripts/downloader.py:574-594`; reachable through `scripts/adapters/qr.py:204-219` **Vulnerability Type**: Insecure transport and redirect downgrade **Risk Level**: Medium ### Vulnerable Code The downloader explicitly accepts both encrypted HTTPS and plaintext HTTP: ```python if parsed.scheme.lower() not in {"http", "https"}: raise DownloadSecurityError("Only HTTP and HTTPS URLs are allowed") if not parsed.netloc or hostname is None: raise DownloadSecurityError("URL must include a host") if parsed.username is not None or parsed.password is not None: raise DownloadSecurityError("URL userinfo is not allowed") ``` Redirect destinations are joined and revalidated for public addressing, but the code does not preserve the original transport security level or reject an HTTPS-to-HTTP downgrade: ```python if response.status in {301, 302, 303, 307, 308}: if redirects_followed >= 5: raise DownloadRedirectError("Redirect limit exceeded") location = response.getheader("Location") if not location: raise DownloadRedirectError("Redirect response has no Location") current_url = urljoin(current_url, location) redirect_chain.append(current_url) redirects_followed += 1 continue ``` Host-decoded QR URLs flow directly into this downloader: ```python def resolve_qr_payload( payload: object, workspace: str | Path, *, qr_image_source_id: str, max_bytes: int, timeout: float, ) -> QrResolution: original_url, source_id = _decoded_url(payload, qr_image_source_id) validate_public_url(original_url) result = download_public_file( original_url, workspace, max_bytes=max_bytes, timeout=timeout, ) destination = _validate_result(result, workspace) return QrResolution._from_download(source_id, original_url, result, destination.name) ``` ### Technical Analysis The downlo ...[truncated 2423 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require HTTPS by default in `_validated_target()`: ```python if parsed.scheme.lower() != "https": raise DownloadSecurityError("Only HTTPS URLs are allowed") ``` 2. Enforce redirect transport continuity before following each redirect: ```python next_url = urljoin(current_url, location) current_scheme = urlsplit(current_url).scheme.lower() next_scheme = urlsplit(next_url).scheme.lower() if current_scheme == "https" and next_scheme != "https": raise DownloadRedirectError("HTTPS-to-HTTP redirect is not allowed") ``` 3. Apply the same HTTPS requirement in `scripts/adapters/qr.py` so unsafe QR payloads fail before network access. 4. If a legacy authority is available only through HTTP, use a narrowly scoped, explicit source-policy exception rather than globally permitting HTTP. Such an exception should require: - A preconfigured hostname allowlist. - An expected cryptographic digest or authenticated detached signature. - Independent corroboration from an HTTPS source. - Clear provenance indicating that transport authentication was unavailable. - No transmission of tokens, personal information, or sensitive query parameters. 5. Add regression tests covering: - Direct HTTP rejection. - HTTPS-to-HTTP redirect rejection. - HTTP redirect to private, loopback, or metadata addresses. - HTTPS-to-HTTPS redirects remaining functional. - QR payloads containing HTTP URLs being rejected. - Legacy exceptions failing closed when a digest or corroborating source is absent. 6. Preserve the existing DNS pinning, connected-peer verification, response-size limits, media-type restrictions, and atomic workspace storage; these are useful controls but should complement, not replace, authenticated transport. ]]>
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (23)

subprocess module call

Medium
Category
Dangerous Code Execution
Content
if not checker.is_file():
        raise BuildReleaseError("release check failed")
    try:
        completed = subprocess.run(
            [sys.executable, str(checker), "--root", str(root), "--expected-version", version, "--ci"],
            cwd=root, check=False, capture_output=True, env=_release_environment(), timeout=4800,
        )
Confidence
72% confidence
Finding
The script executes another repository-local Python script (`scripts/release_check.py`) from the same tree being processed. If an attacker can modify repository contents or trick an operator into building an untrusted tree, this becomes arbitrary code execution in the build environment, which is especially risky because the skill's declared admissions-planning purpose does not justify software-build execution capabilities.

Lp3

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding
The skill instructions explicitly direct the host to run Python modules, read and write workspace state, and perform web retrieval, yet the skill declares no permissions. That mismatch is dangerous because it can cause the host or reviewer to treat the skill as low-privilege while it actually depends on shell, filesystem, environment, and network-capable behavior, increasing the chance of unintended code execution or data access without explicit user understanding or policy gating.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
This plan explicitly instructs moving files on the host filesystem using PowerShell after only path-prefix checks. That grants a content-focused admissions skill a destructive file-management capability unrelated to its user-facing purpose, creating risk of unintended or abused file relocation, data loss, or removal of local artifacts if an agent were to follow the plan automatically.

Context-Inappropriate Capability

Low
Confidence
82% confidence
Finding
The plan discusses legacy fetcher/downloader components and preserving a 'safe downloader' path, which expands the operational scope beyond deterministic admissions analysis into data acquisition tooling. Even though the stated goal is cleanup and boundary hardening, referencing downloader/fetcher capabilities in a skill whose purpose is admissions guidance increases attack surface and could normalize retaining unnecessary code paths with network or external-input risk.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
This plan directs the agent to perform software release engineering and GitHub publication tasks that are materially unrelated to the declared admissions-planning skill purpose. In an agent setting, such scope drift is dangerous because it can cause the agent to access local repositories, manipulate git history/remotes, and publish content externally under the guise of a benign education skill.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The final tasks explicitly instruct creation of a GitHub repository, pushing branches, changing repository visibility, creating release tags, and administering branch protection. Those are privileged external actions not justified by the educational-planning scope, and if followed by an agent they could leak private code, expose sensitive data, or perform unauthorized account/repository operations.

Context-Inappropriate Capability

Medium
Confidence
94% confidence
Finding
The plan instructs the agent to fetch repository remotes, inspect remote branches, and merge or cherry-pick changes. For a counseling skill, these repository mutation and synchronization actions are outside the stated user-facing purpose and expand the agent's authority into software supply-chain operations, which could alter local code or import unreviewed remote content. Because the content is an implementation plan for the skill itself, this creates a genuine capability overreach rather than a harmless documentation detail.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The plan repeatedly directs the agent to stage and commit code changes. Allowing a counseling-oriented skill to create commits gives it persistent write capability to the repository, which can conceal unauthorized modifications, enable tampering, or be chained with other instructions to alter behavior beyond the educational advising scope. The risk is amplified because commits create durable state changes that may later be trusted or published.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This file implements release verification, packaging, changelog extraction, Git tag validation, artifact publication, and CI metadata writing—capabilities unrelated to a college-planning assistant. In a skill ecosystem, materially over-scoped capabilities increase the attack surface and indicate the skill may be carrying hidden operational functionality that could be abused if invoked or repurposed.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The skill contains subprocess-based Git execution and later release-check execution that are not needed for its stated educational counseling function. Even though some calls are defensive, embedding command-execution capability in an unrelated skill creates an unnecessary execution surface that could enable misuse, especially if other components expose these routines indirectly.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
The script creates archives, computes checksums, writes files, and prepares release artifacts for publication—capabilities unrelated to an admissions-planning assistant. In this context, disk-writing and packaging behavior broadens the impact of compromise and provides primitives that can be abused for unauthorized artifact generation or persistence.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
Using `ctypes` to call low-level OS rename APIs for atomic publication is sophisticated system-level behavior that has no clear relationship to the declared counseling use case. In a mismatched skill context, such functionality is suspicious because it enables robust filesystem mutation and publication semantics beyond what users would expect from an educational advisor.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The file implements a repository compliance and secret/PII scanner, not a gaokao admissions-planning capability. In an agent skill, this mismatch is dangerous because it gives the skill access patterns and behavior unrelated to user-facing purpose, increasing the chance of covert data inspection, privilege overreach, and misuse of repository contents under an innocuous skill label.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The rule set is explicitly designed to detect secrets, student PII, phone numbers, identity numbers, local paths, and private system references. For a college-admissions counseling skill, this capability is unjustified and materially increases the risk of sensitive-data discovery and exfiltration from unrelated files or repositories.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
This code enumerates Git refs, trees, tracked files, blobs, and working-tree paths, enabling broad source-repository inspection. In the context of an admissions-planning skill, that behavior is unrelated to the stated function and creates a high-risk avenue for unauthorized discovery of secrets, internal files, and private data stored in the repository.

Description-Behavior Mismatch

Medium
Confidence
80% confidence
Finding
The script performs outbound network retrieval to official-root URLs, which is outside the stated student-counseling purpose of the skill and expands the skill's operational capabilities. Even though the downloader is bounded and includes several safeguards, this still creates an external connectivity primitive that can be abused for unintended reconnaissance or policy bypass if exposed through the agent.

Context-Inappropriate Capability

Medium
Confidence
86% confidence
Finding
This entrypoint lets callers probe configured official-root URLs and classify them as healthy, redirect_review, or unavailable, effectively turning the skill into a network status oracle. In the context of a student counseling skill, that capability is not justified by user need and could support external service enumeration, monitoring, or indirect reconnaissance despite the built-in domain validation and timeout limits.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The file implements a repository-wide release/compliance gate, not an admissions-counseling skill. In this skill context, hidden repository inspection and execution logic is dangerous because it expands capability far beyond declared purpose, increasing the chance of unexpected code execution, data exposure, and operator mis-trust about what the skill actually does.

Context-Inappropriate Capability

High
Confidence
95% confidence
Finding
The skill includes subprocess-based execution of test modules and unittest discovery that is unrelated to the stated counseling purpose. In a user-facing educational skill, embedding code-execution pathways is risky because it can run arbitrary repository test code if triggered in automation, creating a strong mismatch between declared behavior and actual privileges.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
The script performs broad Git inventory, tree inspection, untracked-file scanning, markdown traversal, policy parsing, and release validation unrelated to college-admissions counseling. In this context that hidden breadth is security-relevant because it grants filesystem and repository-inspection behaviors users would not expect from a counseling skill, potentially exposing sensitive local project content or enabling unsafe automation assumptions.

Intent-Code Divergence

Medium
Confidence
84% confidence
Finding
The module docstring advertises a 'privacy-safe, deterministic release gate for the public repository,' which directly conflicts with the skill's declared admissions-counseling purpose. While a docstring alone is not exploitable, this kind of intent mismatch is a strong warning sign for deceptive packaging or accidental inclusion of privileged tooling in the wrong trust boundary.

Known Vulnerable Dependency: pypdf — 10 advisory(ies): CVE-2026-84310 (pypdf: Possible long runtimes/large memory usage when retrieving outlines); CVE-2026-48156 (pypdf: Possible long runtimes for zero-only width values in cross-reference stre); CVE-2026-24688 (pypdf has possible Infinite Loop when processing outlines/bookmarks) +7 more

Low
Category
Supply Chain
Confidence
65% confidence
Finding
This duplicates the pypdf finding on line 17. Because the allowed range spans multiple major/minor releases and the scanner cites several low-severity parser DoS issues, there is a plausible risk if the skill processes attacker-controlled PDFs through the optional PDF feature.

Known Vulnerable Dependency: pypdf — 10 advisory(ies): CVE-2026-84310 (pypdf: Possible long runtimes/large memory usage when retrieving outlines); CVE-2026-48156 (pypdf: Possible long runtimes for zero-only width values in cross-reference stre); CVE-2026-24688 (pypdf has possible Infinite Loop when processing outlines/bookmarks) +7 more

Low
Category
Supply Chain
Confidence
65% confidence
Finding
This duplicates the pypdf finding on line 17. Because the allowed range spans multiple major/minor releases and the scanner cites several low-severity parser DoS issues, there is a plausible risk if the skill processes attacker-controlled PDFs through the optional PDF feature.

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

Detected: suspicious.obfuscated_code

Potential obfuscated payload detected.

Warn
Code
suspicious.obfuscated_code
Location
scripts/adapters/xls.py:74

Potential obfuscated payload detected.

Warn
Code
suspicious.obfuscated_code
Location
scripts/downloader.py:666

Potential obfuscated payload detected.

Warn
Code
suspicious.obfuscated_code
Location
tests/test_downloader.py:755