Back to skill

Security audit

ceac-visa-status-checker

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it says: it checks CEAC visa status and uses Zhipu to solve the CAPTCHA, but users should understand the sensitive-data and third-party service exposure before running it.

Install and run this only if you are comfortable entering passport and visa case details locally, submitting them to CEAC, and sending the CEAC CAPTCHA image to Zhipu for OCR. Use a dedicated virtual environment, avoid elevated privileges, keep the Zhipu API key scoped and private, and prefer pinned dependencies or a lockfile before routine use.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unpinned Third-Party Dependencies Permit Unreviewed Package Updates

Content
View full analysis

Vulnerability Details

File Location: requirements.txt:1-4
Vulnerability Type: Supply-chain exposure through non-deterministic dependency resolution
Risk Level: Medium

Vulnerable Code

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=5.0.0
python-dotenv>=1.0.0

Technical Analysis

Every dependency is constrained only by a minimum version. Consequently, the installation command documented in SKILL.md can resolve to any future release satisfying these constraints. The project also provides no integrity hashes to verify downloaded distributions.

This makes dependency installation non-reproducible and allows the effective third-party code executed by the Skill to change without any modification to the audited repository. Although no malicious package is currently identified in the supplied files, compromise of a permitted future release or its distribution channel could introduce malicious installation-time or runtime behavior.

Attack Path

  1. An attacker compromises the publisher account, build pipeline, or distribution artifact of one of the listed packages.
  2. The attacker publishes a malicious version whose version number satisfies the applicable >= constraint.
  3. A user follows the documented command python -m pip install -r requirements.txt.
  4. Pip resolves and installs the malicious or compromised release because no exact version or artifact hash is enforced.
  5. Malicious package code can execute during installation or when the script imports the dependency.
  6. That code runs with the privileges of the user performing installation or invoking the Skill.

Impact Assessment

A compromised dependency could access data and resources available to the invoking user. In this Skill, that scope may include the Zhipu API key, CEAC case number, passport number, surname, environment variables, local files accessible to the process, and outbound network connectivity.

If installation is performed from an e ...[truncated 284 chars]

Remediation
View remediation

Remediation Suggestions

  1. Replace minimum-version constraints with exact, reviewed versions, for example:
text
requests==2.32.5
beautifulsoup4==4.13.5
lxml==6.0.1
python-dotenv==1.1.1
  1. Generate a lock file containing hashes for every direct and transitive dependency, and install with hash enforcement:
bash
python -m pip install --require-hashes -r requirements.lock
  1. Produce the lock file through a controlled dependency-management process such as pip-compile --generate-hashes.
  2. Review release notes and security advisories before updating pinned versions.
  3. Run dependency vulnerability scanning in CI and reject unexpected dependency-tree changes.
  4. Install and execute the Skill in an isolated, non-privileged virtual environment with access only to the files and secrets required for the CEAC query.
Vulnerability Patterns
  • 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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (13)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
## Workflow

1. Ensure dependencies are installed from requirements.txt.
2. Create .env based on .env.example.txt.
3. Run scripts/check_ceac_status.py.
4. Return JSON output to user.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares capabilities that require environment-variable access and outbound network access, but it does not explicitly scope or disclose those permissions in the skill manifest. This weakens reviewability and increases the chance that operators or users invoke a skill that transmits sensitive visa-related data or reads secrets without clear authorization boundaries.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The description says the skill uses a Zhipu vision model to solve CAPTCHA, but it does not clearly warn users that visa case data and CAPTCHA images may be sent to third-party services. Because visa status checks involve sensitive personal and application information, lack of disclosure can lead to unintentional external data exposure and consent/privacy issues.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
96% confidence
Finding

This outbound request transmits captcha content to an external domain, which is a real data egress event and not merely an implementation detail. Given the skill’s purpose—checking U.S. visa application status using passport number, surname, and case details—any third-party transmission in the request path is more dangerous because it can expose sensitive user-associated data and create jurisdictional, privacy, and vendor-trust concerns.

Content

Scanner excerpt · scripts/check_ceac_status.py (reported line 83)May include surrounding context.

python
"Content-Type": "application/json",
    }

    resp = requests.post(
        "https://open.bigmodel.cn/api/paas/v4/chat/completions",
        headers=headers,
        data=json.dumps(payload),

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script sends a CEAC captcha image to a third-party AI service for solving, which transfers visa-related workflow data and potentially linked personal information outside the primary government service boundary without any explicit consent, minimization, or warning. In this context, the skill processes passport number, surname, case number, and a session-bound captcha for a U.S. visa case check, so outsourcing part of that transaction to an external model provider creates meaningful privacy, compliance, and data-handling risk.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The dependency is specified with a lower-bound range (requests>=2.31.0) rather than an exact version, so builds are not reproducible and may resolve to different releases over time. In a security-sensitive automation skill that handles visa status checks and likely processes passport/case data, this increases supply-chain risk and makes it harder to ensure vulnerable or behavior-changing versions are not introduced.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=5.0.0
python-dotenv>=1.0.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
91% confidence
Finding

The manifest does not pin requests, and the package has multiple published advisories, so the deployed version cannot be verified as safe. In a skill that makes outbound HTTP requests and may handle sensitive case/passport information, unknowingly installing an affected release could expose credentials, request integrity, or user data.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

beautifulsoup4>=4.12.0 is unpinned, which allows environment-dependent resolution to newer releases without review. While not an immediate exploit by itself, this weakens build integrity and can introduce unexpected vulnerable or incompatible versions into the skill.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=5.0.0
python-dotenv>=1.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

lxml>=5.0.0 is not pinned to a specific release, which is risky because lxml has a history of security advisories and native-parser attack surface. In a web-scraping skill that parses remote HTML from CEAC, uncontrolled upgrades or downgraded resolutions can materially affect security posture.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=5.0.0
python-dotenv>=1.0.0

Unverifiable Dependency: lxml has 14 known advisory(ies) (CVE-2021-43818 (lxml's HTML Cleaner allows crafted and SVG embedded scripts to pass through); CVE-2014-3146 (lxml Cross-site Scripting Via Control Characters); CVE-2021-28957 (lxml vulnerable to Cross-Site Scripting ) +11 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
93% confidence
Finding

lxml has known advisories, but because the requirement is not pinned, there is no assurance the installed version includes relevant fixes. This is more concerning in this skill because it parses remote HTML/XML-like content, and parser/library flaws can increase exposure to malicious content handling issues.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

python-dotenv>=1.0.0 is unpinned, creating non-deterministic installations and potential exposure to future or transitive issues. Because this skill likely loads API keys and personal identifiers from environment files, dependency drift in configuration-handling code adds avoidable operational and security risk.

Content

Scanner excerpt · requirements.txt (reported line 4)May include surrounding context.

text
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=5.0.0
python-dotenv>=1.0.0

Unverifiable Dependency: python-dotenv has 2 known advisory(ies) (CVE-2026-28684 (python-dotenv: Symlink following in set_key allows arbitrary file overwrite via ); CVE-2026-28684 (python-dotenv reads key-value pairs from a .env file and can set them as environ)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
88% confidence
Finding

The unpinned python-dotenv dependency means the environment may install a release affected by known advisories without visibility. Since this package may interact with local .env files containing API keys and credentials, using an unverified version can increase the chance of file-handling or secret-management weaknesses.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The request headers hard-code Accept-Language: en-US,en;q=0.9, which imposes a specific language/locale preference. There is no user opt-in, configurability, or explanation that this locale is required for compatibility with the target site.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.