Back to skill

Security audit

Flyclaw Bak

Security checks for vulnerabilities and agentic risk

Overview

This flight-search skill is mostly purpose-aligned, but it needs Review because it under-discloses credentialed/networked behavior and includes an unrestricted remote airport-cache update path.

Review before installing if you are sensitive about travel-query privacy or run agents on internal networks. Normal searches contact external flight providers, and the airport update feature should only be used with trusted HTTPS URLs. Treat the embedded Fliggy key as a shared public client credential, not a private secret, and avoid enabling optional SerpAPI, MCP, or browser modes unless you understand those extra network and dependency paths.

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
airport_manager.py:229
Finding

Arbitrary Airport Update URL Enables Server-Side Request Forgery

Content
View full analysis
bool: """Download airport data from *url* and merge into existing data. - Empty URL → return False - Validates downloaded data structure - Merges: keeps existing entries, adds new entries, fills missing fields - Writes via atomic replace - Rebuilds indices on success - Any failure → logs warning, returns False, existing data untouched """ if not url: return False try: resp = requests.get(url, timeout=30) resp.raise_for_status() new_data = resp.json() except Exception as e: logger.warning("Failed to download airport data from %s: %s", url, e) return False ``` The URL is sourced directly from a command-line argument or configuration: ```python def cmd_update_airports(args): """Handle 'update-airports' subcommand: manually update airport data.""" conf = cfg.get_config() cache_cfg = conf["cache"] # URL priority: CLI --url > config.yaml > AIRPORT_UPDATE_URL constant url = getattr(args, "url", None) or cache_cfg.get("airport_update_url", "") or cfg.AIRPORT_UPDATE_URL if not url: print("Error: no update URL provided. Use --url or set airport_update_url in config.yaml", file=sys.stderr) sys.exit(1) print(f"Updating airport data from: {url}") ok = airport_manager.update_from_url(url) ``` Configured URLs may also be requested automatically: ```python def _auto_update_airports(): """Check and auto-update airport data at startup (silent on failure).""" try: conf = cfg.get_config() cache_cfg = conf["cache"] update_days = cache_cfg.get("airport_update_days", 30) ...[truncated 2876 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
sources/fliggy_mcp.py:37
Finding

Reusable Fliggy API Key and HMAC Signing Secret Embedded in Source Code

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (40)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Using SerpAPI and an API key while prominently claiming 'zero API key' and 'zero API' is a concrete misrepresentation of external dependencies and secret usage. This is dangerous because users may unknowingly provide or expose credentials, and administrators may allow networked third-party data transfer they believed was absent.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Using SerpAPI and an API key while prominently claiming 'zero API key' and 'zero API' is a concrete misrepresentation of external dependencies and secret usage. This is dangerous because users may unknowingly provide or expose credentials, and administrators may allow networked third-party data transfer they believed was absent.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Using SerpAPI and an API key while prominently claiming 'zero API key' and 'zero API' is a concrete misrepresentation of external dependencies and secret usage. This is dangerous because users may unknowingly provide or expose credentials, and administrators may allow networked third-party data transfer they believed was absent.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Using SerpAPI and an API key while prominently claiming 'zero API key' and 'zero API' is a concrete misrepresentation of external dependencies and secret usage. This is dangerous because users may unknowingly provide or expose credentials, and administrators may allow networked third-party data transfer they believed was absent.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

Using SerpAPI and an API key while prominently claiming 'zero API key' and 'zero API' is a concrete misrepresentation of external dependencies and secret usage. This is dangerous because users may unknowingly provide or expose credentials, and administrators may allow networked third-party data transfer they believed was absent.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Using SerpAPI and an API key while prominently claiming 'zero API key' and 'zero API' is a concrete misrepresentation of external dependencies and secret usage. This is dangerous because users may unknowingly provide or expose credentials, and administrators may allow networked third-party data transfer they believed was absent.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
**文件位置**:主程序 `flyclaw.py`,配置 `config.yaml`,机场缓存 `cache/airports.json`。

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The README repeatedly emphasizes 'zero login/zero API key' and use of public APIs, but it does not clearly warn users that their flight queries and related metadata will still be transmitted to multiple third-party services during normal operation. In a privacy-sensitive travel context, users may incorrectly infer that 'no account' means 'no external data sharing,' which can expose itinerary, location, and timing information to several providers without informed consent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
85% confidence
Finding

The skill advertises capabilities that imply network, file, and possibly MCP interactions, but the manifest does not declare any explicit tool scope or permissions boundaries. This creates an authorization and review gap: a host may grant broader access than intended, and users cannot easily assess what the skill is allowed to do before execution.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger phrases are very broad and include common travel-related language, which increases the chance of unintended activation. In a network-enabled skill, accidental invocation can cause unrequested external requests, data disclosure about user travel intent, or confusion about which skill is acting.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The trigger section uses very broad natural-language phrases such as 'flights from Shanghai to New York', 'nonstop flights', and 'all flights including connecting', which are common user requests that could cause the skill to activate unintentionally in many ordinary travel-related conversations. In an agent environment, overbroad activation can lead to unnecessary external network requests, incorrect tool selection, and reduced user control over when the skill is invoked.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The module can fetch airport data from an arbitrary caller-supplied URL and then persist it locally. While the code validates basic JSON structure, it does not restrict the source, scheme, host, size, or content trust, so a malicious or compromised URL could be used to inject poisoned data or trigger unintended outbound requests (including SSRF if the URL is influenced by untrusted input).

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · config.py (reported line 28)May include surrounding context.

python
"AppleWebKit/537.36 (KHTML, like Gecko) "
    "Chrome/131.0.0.0 Safari/537.36"
)
FR24_API_BASE = "https://api.flightradar24.com/common/v1"
AIRPLANESLIVE_API_BASE = "https://api.airplanes.live/v2"
ADSB_LOL_API_BASE = "https://api.adsb.lol/v2"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · config.py (reported line 29)May include surrounding context.

python
"Chrome/131.0.0.0 Safari/537.36"
)
FR24_API_BASE = "https://api.flightradar24.com/common/v1"
AIRPLANESLIVE_API_BASE = "https://api.airplanes.live/v2"
ADSB_LOL_API_BASE = "https://api.adsb.lol/v2"

# Default airport data update URL (set to GitHub raw URL after project is published)

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · config.py (reported line 30)May include surrounding context.

python
)
FR24_API_BASE = "https://api.flightradar24.com/common/v1"
AIRPLANESLIVE_API_BASE = "https://api.airplanes.live/v2"
ADSB_LOL_API_BASE = "https://api.adsb.lol/v2"

# Default airport data update URL (set to GitHub raw URL after project is published)
AIRPORT_UPDATE_URL = ""

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest emphasizes zero-login/zero-account/zero-API-key operation, but this file wires in external providers that accept credentials such as SerpAPI and Fliggy API keys, and optional Playwright browser verification. Those capabilities go beyond the stated 'pure Python, no browser, zero API key' positioning and materially change how the skill can operate.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code emits mixed Chinese/English stderr messages such as '请检查网络连接' and 'Google 相关服务在您所在地区可能不可用' directly to all users. That enforces a specific language choice in user-facing output without opt-in, which matches the locale policy violation criteria.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The help text says '--no-relay' disables 'Phase 2 Google Flights price lookup', but cmd_query's relay phase can launch both GoogleFlights-Relay and Skiplagged-Relay depending on configuration. This is an active contradiction between user-facing documentation and actual behavior, not merely an omitted detail.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest describes a multi-source flight search skill centered on tickets, nonstop, round-trip, cabin, prices, and flight status, but this module is explicitly for ADS-B aircraft position tracking and states it does not provide schedules, prices, or departure/arrival times. That is a meaningful behavior mismatch at the skill-description level because the code implements real-time aircraft surveillance rather than the advertised search/aggregation capability.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The README describes FlyClaw as a lightweight Python implementation with 'no browser automation,' which suggests browser use is outside the tool's behavior. Later, the same document advertises a --browser mode using Playwright for browser-based verification, so the documented behavior is broader than the headline description implies.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The description states the tool has 'native Chinese/English query support,' which presents a built-in locale limitation in natural-language terms. Because the README does not frame this as an explicit user choice or justified region-specific constraint, it can be read as a language/locale policy restriction.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The documentation prominently says no API key is required, but the configuration section later includes serpapi_key and says filling it will auto-enable that path. Although core use may work without keys, the blanket statement contradicts the existence of a documented API-key-backed capability.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The top-level docstring explicitly frames the skill around Chinese/English/IATA input support, but does not indicate whether other languages are optional, unsupported, or user-selectable. Under the policy, language constraints should be clearly offered as a choice or justified; this wording can be read as a built-in locale limitation without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

This JSON file contains natural-language values for city names, and entries for Ukrainian airports use 'Kiev' while the airport names themselves use 'Kyiv'. That imposes a specific locale/transliteration choice in a way that is inconsistent within the file and does not indicate user opt-in or a justified regional policy.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The default output settings hard-code the currency to "cny", which imposes a locale-specific default in natural-language/config behavior without any visible user choice in this file. The policy allows locale constraints when they are clearly documented and justified, but this file does not provide such justification or opt-in.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.