Back to skill

Security audit

亚马逊-店铺定价

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly performs Amazon pricing lookups, but it also handles account login, API-key creation, billing orders, and persistent sensitive output in ways that need review before installation.

Install only if you are comfortable giving this skill access to LinkFox/Amazon seller pricing data and using LinkFox account, API-key, and billing workflows from the agent. Avoid endpoint override environment variables unless you fully trust them, do not pass SMS codes or API keys in logged command lines, review where response files are written, and treat generated pricing output and payment QR files as sensitive business data.

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/_spapi_pricing_common.py:18
Finding

Credential-Bearing Network Destinations Can Be Overridden Without Validation

Content
View full analysis
dict: api_key = get_api_key() data = json.dumps(params).encode("utf-8") req = Request( endpoint, data=data, headers={ "Authorization": api_key, "Content-Type": "application/json", "User-Agent": "LinkFox-Skill/1.0", "SESSION_ID": os.environ.get("SESSION_ID", ""), "MESSAGE_ID": os.environ.get("MESSAGE_ID", ""), "MODE_ID": os.environ.get("MODE_ID", ""), "APP_NAME": os.environ.get("APP_NAME", ""), }, method="POST", ) try: with urlopen(req, timeout=timeout) as response: return json.loads(response.read().decode("utf-8")) except HTTPError as e: body = e.read().decode("utf-8") if e.fp else "" return {"error": f"HTTP {e.code}: {e.reason}", "details": body} except URLError as e: return {"error": f"Connection failed: {e.reason}"} ``` The onboarding workflow similarly accepts complete URL overrides: ```python def _agent_base() -> str: return _env_base("LINKFOX_AGENT_API_URL", "https://tool-gateway.linkfox.com", "L ...[truncated 2186 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/_spapi_pricing_common.py:203
Finding

Unsanitized SESSION_ID Allows Output Path Traversal and Arbitrary File Placement

Content
View full analysis
str: env = os.environ.get("SESSION_ID") if env: return env.strip() if "_auto" not in _LF_SESSION_CACHE: _LF_SESSION_CACHE["_auto"] = ( _lf_time.strftime("%H%M%S", _lf_time.localtime(ts)) + "-" + _lf_secrets.token_hex(3) ) return _LF_SESSION_CACHE["_auto"] ``` ```python def emit_result(result, slug=SLUG, inline=False): """落盘完整响应到 linkfox///data/-.json;大响应只打印摘要。无缓存。""" serialized = json.dumps(result, ensure_ascii=False, indent=2) ts = _lf_time.time() date_str = _lf_time.strftime("%Y-%m-%d", _lf_time.localtime(ts)) sid = _lf_session_id(ts) root = _lf_root() session_dir = os.path.join(root, date_str, sid) os.makedirs(session_dir, exist_ok=True) _lf_ensure_meta(root, session_dir, date_str, sid, ts) data_dir = os.path.join(session_dir, "data") os.makedirs(data_dir, exist_ok=True) out = os.path.join(data_dir, f"{slug}-{int(ts * 1_000_000)}.json") try: with open(out, "w", encoding="utf-8") as f: f.write(serialized) print(f"Saved full response: {out} ({len(serialized)} bytes)") except OSError as e: print(f"Failed to save to {out}: {e}", file=sys.stderr) ``` The onboarding path has the same trust issue: ```python def session_dir() -> str: ts = time.time() sid = (os.environ.get("SESSION_ID") or "").strip() or ( time.strftime("%H%M%S", time.localtime(ts)) + "-" + secrets.token_hex(3)) path = os.path.join(_linkfox_root(), time.strftime("%Y-%m-%d", time.localtime(ts)), sid) os.makedirs(path, exist_ok=True) return path ``` ### Technical Analysis ...[truncated 2035 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/_spapi_pricing_common.py:169
Finding

Sensitive Results Can Fall Back to Shared Temporary Storage with Unenforced Permissions

Content
View full analysis
str: cached = _LF_SESSION_CACHE.get("_root") if cached: return cached candidates = [] acpx = (os.environ.get("ACPX_WORKSPACES") or "").strip() if acpx: acpx = acpx.split(os.pathsep)[0].strip() if acpx: candidates.append(os.path.join(acpx, "linkfox")) candidates.append(os.path.join(os.getcwd(), "linkfox")) candidates.append(os.path.join(os.path.expanduser("~"), "linkfox")) candidates.append(os.path.join(_lf_tempfile.gettempdir(), "linkfox")) for root in candidates: try: os.makedirs(root, exist_ok=True) probe = os.path.join(root, ".write_probe") with open(probe, "w", encoding="utf-8") as f: f.write("") os.remove(probe) except OSError: continue root = os.path.abspath(root) _LF_SESSION_CACHE["_root"] = root return root fallback = os.path.abspath(candidates[-1]) _LF_SESSION_CACHE["_root"] = fallback return fallback ``` ```python with open(out, "w", encoding="utf-8") as f: f.write(serialized) ``` The onboarding workflow implements a comparable fallback: ```python candidates += [ os.path.join(os.getcwd(), "linkfox"), os.path.join(os.path.expanduser("~"), "linkfox"), os.path.join(tempfile.gettempdir(), "linkfox"), ] ``` ### Technical Analysis The documented behavior says responses must not be written to `/tmp` and that an unwritable current directory should cause an error. The implementation instead tries the home directory and then the operating system's shared temporary directory. Directories are created with the process's default umask, and re ...[truncated 1214 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/onboarding.py:471
Finding

SMS Codes and Long-Lived API Keys Are Exposed Through Process Arguments and Standard Output

Content
View full analysis
dict: masked = _mask_phone(phone) if not re.fullmatch(r"\d{11}", phone): return {"error": f"login: 手机号格式不正确: {phone}", "phone": masked} if not re.fullmatch(r"\d{4,8}", code): return {"error": f"login: 验证码格式不正确: {code}", "phone": masked} lg = _login_v3(phone, code, channel) if "error" in lg: return {"error": lg["error"], "phone": masked} if lg.get("is_new_user"): lbt = _login_by_token(lg["access_token"], lg["refresh_token"]) if "error" in lbt: print(f"{TAG} {lbt['error']}(不影响拿 key)", file=sys.stderr) info = _fetch_user_info_v3(lg["access_token"], lg["user_id"]) if "error" in info: return {"error": info["error"], "phone": masked} tok = _get_or_generate_api_token(lg["access_token"], lg["user_id"], info["group_id"]) if "error" in tok: return {"error": tok["error"], "phone": masked} return { "api_key": tok["api_key"], "phone": masked, "group_id": info["group_id"], "member_id": info["member_id"], "source": tok["source"], "nick_name": lg.get("nick_name", ""), "team_name": info.get("team_name", ""), "is_new_user": lg.get("is_new_user", False), } ``` ```python def _emit(obj: dict) -> None: print(json.dumps(obj, ensure_ascii=False, indent=2)) def _cmd_login(args) -> int: r = login_and_get_key(args.phone.strip(), args.code.strip(), args.channel) _emit(r) if "api_key" in r: print(f"{TAG} 成功获取 API key(来源: {r['source']})", file=sys.stderr) return 0 return 1 ``` ```python p = sub.add_parser("login", help="验证码登录并获取 A ...[truncated 1757 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/onboarding.py:165
Finding

Onboarding Recommends Installing Unpinned Runtime Dependencies

Content
View full analysis
dict: try: import qrcode except ImportError: err = "缺少 qrcode 依赖,请运行: pip install qrcode pillow" print(f"{TAG} render_qr: {err}", file=sys.stderr) return {"png_path": None, "ascii_qr": None, "error": err} ``` ```python def _require_requests() -> None: if requests is None: raise RuntimeError("缺少 requests 依赖,请运行: pip install requests") ``` ### Technical Analysis The onboarding script instructs users to install `qrcode`, `pillow`, and `requests` without version constraints, hashes, a lockfile, an isolated environment, or a specified trusted package index. Package installation may execute build or installation code with the invoking user's privileges. The named packages are legitimate common packages; the finding is not evidence that these packages are malicious. The risk arises from mutable, unpinned resolution and reliance on the user's configured package index. A compromised release, compromised index, dependency-confusion condition, or incompatible future version can alter the effective code after the Skill itself has been reviewed. ### Attack Path 1. A user invokes onboarding in an environment where one of the optional packages is absent. 2. The script displays an unpinned `pip install` command. 3. The user or Agent runs the command against the currently configured package index. 4. Pip resolves whichever versions and transitive dependencies are current at that time. 5. A compromised or malicious resolved package executes during installation or later import. 6. The package gains the privileges of the user running the onboarding workflow and can access environment-held API keys and other local data. ### Impact Assessment A malicious dependency ...[truncated 276 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (50)

Tainted flow: 'req' from os.environ.get (line 74, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
95% confidence
Finding

The request destination is derived from environment-controlled base URL variables, and the helper sends the API key plus session-related headers to that endpoint. If an attacker can influence environment variables or runtime configuration, credentials and session metadata can be exfiltrated to an attacker-controlled server, especially if a non-HTTPS URL is supplied.

Content

Scanner excerpt · scripts/_spapi_pricing_common.py (reported line 89)May include surrounding context.

python
method="POST",
    )
    try:
        with urlopen(req, timeout=timeout) as response:
            return json.loads(response.read().decode("utf-8"))
    except HTTPError as e:
        body = e.read().decode("utf-8") if e.fp else ""

Tainted flow: 'req' from os.environ.get (line 103, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
91% confidence
Finding

The request destination and multiple outbound headers are populated from environment variables, including the base URL and identifiers, and then sent via urlopen. In an agent/runtime context where environment can be influenced by deployment config or a compromised wrapper, this creates an SSRF/exfiltration primitive that can redirect authenticated requests and metadata to an attacker-controlled endpoint, exposing the API key and session-related values.

Content

Scanner excerpt · scripts/get_competitive_pricing.py (reported line 118)May include surrounding context.

python
method="POST",
    )
    try:
        with urlopen(req, timeout=150) as response:
            return json.loads(response.read().decode("utf-8"))
    except HTTPError as e:
        body = e.read().decode("utf-8") if e.fp else ""

Tainted flow: 'req' from os.environ.get (line 102, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

The request destination is derived from environment variables (LINKFOX_TOOL_GATEWAY / STORE_API_BASE_URL / SPAPI_BASE_URL) and then used directly in urlopen while attaching sensitive headers including the API key and session metadata. If an attacker can influence the environment, they can redirect requests to an arbitrary host and exfiltrate credentials and contextual identifiers, which is especially sensitive in a pricing/auth gateway skill that routinely handles seller access.

Content

Scanner excerpt · scripts/get_listing_offers.py (reported line 117)May include surrounding context.

python
method="POST",
    )
    try:
        with urlopen(req, timeout=150) as response:
            return json.loads(response.read().decode("utf-8"))
    except HTTPError as e:
        body = e.read().decode("utf-8") if e.fp else ""

Tainted flow: 'req' from os.environ.get (line 107, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
92% confidence
Finding

The script constructs outbound authenticated requests using a base URL taken from environment variables (LINKFOX_TOOL_GATEWAY, STORE_API_BASE_URL, or SPAPI_BASE_URL) and includes the API key plus session metadata in headers. If an attacker can influence the runtime environment, they can redirect requests to an arbitrary endpoint and exfiltrate credentials or sensitive identifiers via urlopen.

Content

Scanner excerpt · scripts/get_pricing.py (reported line 122)May include surrounding context.

python
method="POST",
    )
    try:
        with urlopen(req, timeout=150) as response:
            return json.loads(response.read().decode("utf-8"))
    except HTTPError as e:
        body = e.read().decode("utf-8") if e.fp else ""

Tainted flow: 'url' from os.environ.get (line 235, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
95% confidence
Finding

The POST target is derived from environment-controlled base URLs, and this request carries sensitive authentication material such as access tokens, uid headers, and login data. If an attacker can influence environment variables, they can redirect these requests to an attacker-controlled host and exfiltrate SMS codes, bearer tokens, or generated API keys. In the context of an Amazon pricing skill, this is more dangerous because the file already performs unrelated onboarding and credential flows, expanding the blast radius beyond the advertised read-only pricing behavior.

Content

Scanner excerpt · scripts/onboarding.py (reported line 196)May include surrounding context.

python
except RuntimeError as e:
        return {"_error": str(e)}
    try:
        r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)
        return r.json()
    except Exception as e:
        body_text = ""

Tainted flow: 'req' from os.environ.get (line 244, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
95% confidence
Finding

The gateway request URL is also built from environment-controlled base URLs and then used in urlopen with the agent API key in the Authorization header. An attacker who can set the environment can redirect billing, account, and order requests to a malicious server and capture the API key or manipulate responses. This is especially risky here because the skill claims Amazon pricing functionality but includes unrelated account and purchase operations, so a user may not expect high-value secrets to be transmitted at all.

Content

Scanner excerpt · scripts/onboarding.py (reported line 246)May include surrounding context.

python
headers["Content-Type"] = "application/json"
        req = Request(url, method=method, data=body_bytes, headers=headers)
        try:
            with urlopen(req, timeout=30) as resp:
                return json.loads(resp.read().decode())
        except urllib.error.HTTPError as e:
            status = e.code

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the skill actually performs account, API-key, plan, and payment-related operations while presenting itself as a pricing lookup skill, that is security-relevant deceptive behavior. Users or agents may authorize or invoke it under false assumptions, exposing account, billing, or authentication workflows that are far more sensitive than the declared purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

If the skill actually performs account, API-key, plan, and payment-related operations while presenting itself as a pricing lookup skill, that is security-relevant deceptive behavior. Users or agents may authorize or invoke it under false assumptions, exposing account, billing, or authentication workflows that are far more sensitive than the declared purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the skill actually performs account, API-key, plan, and payment-related operations while presenting itself as a pricing lookup skill, that is security-relevant deceptive behavior. Users or agents may authorize or invoke it under false assumptions, exposing account, billing, or authentication workflows that are far more sensitive than the declared purpose.

Content

No source excerpt is available for this finding.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

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

md
---

## Display Rules

1. **`MarketplaceId`**(单数)与 Listings 的 `marketplaceIds` 勿混用。
2. 先看网关 **`errcode` / `httpStatus`**,再解析各脚本对应的解析字段(如 **`itemOffers`**、**`itemOffersBatch`**、**`competitiveSummary`** 等)。

YARA rule 'backdoor_persistence': Backdoor persistence with malicious payloads (shell commands, SSH key injection, hidden root users) [malware]

High
Category
YARA Match
Confidence
75% confidence
Finding

YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Content

Scanner excerpt · references/onboarding.md (reported line 14)May include surrounding context.

md
示 JSON 里的 phone/agreements
   - 收到验证码后:`python scripts/onboarding.py login <phone> <code>`
   - 拿到 `api_key` 后把下面三平台配置转发给用户,提示重启会话生效:
     - Windows PowerShell(永久):`setx LINKFOX_AGENT_API_KEY "<key>"`
     - macOS zsh:`echo 'export LINKFOX_AGENT_API_KEY="<key>"' >> ~/.zshrc && source ~/.zshrc`
     - Linux bash:`echo 'export LINKFOX_AGENT_API_KEY="<key>"' >> ~/.bashrc && source ~/.bashrc`
     - 变量名 `LINKFOX_AGENT_API_KEY`(主推)或 `LINKFOXAGENT_API_KEY`(老规范)任一即可

**billing 场景**:`errcode=402` 或消息含 `算力/余额/quota/insufficient/充值/套餐到期`。
- `python scripts/onboarding.py list-plans` → 有 AskUserQuestion 就弹菜单,否则输出编号清单让用户选
- 校验 `plan_id` ∈ 清单、支付方式 ∈ 该套餐 `available_methods`(通常 `wechat/alipay`)
- `python scripts/onboarding.py order <plan_id> <method>` → 展示优先级 PNG

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The file implements LinkFox account onboarding, SMS login, API-key issuance, package listing, ordering, and payment QR generation rather than Amazon product pricing lookup. This is a significant capability mismatch that can trick users or host systems into invoking credential collection and billing workflows under the guise of a read-oriented Amazon pricing skill. The misleading context makes the behavior more dangerous because users would reasonably not expect account provisioning and payment operations from this skill.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The order-creation and payment QR code logic introduces billing and purchase capabilities that are unjustified for an Amazon pricing query skill. This expands the skill from passive data retrieval into active financial operations, enabling unauthorized or deceptive purchase flows if triggered by an unsuspecting user or agent. Because the advertised skill purpose is pricing lookup, this hidden financial capability substantially increases risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The code performs SMS-based account login, token exchange, user/team discovery, and API-token retrieval/generation, none of which are necessary for Amazon pricing lookups. This creates a covert credential acquisition and secret materialization path inside a mismatched skill, potentially harvesting phone numbers, SMS codes, access tokens, and reusable API keys. The mismatch between declared purpose and implemented behavior strongly increases the likelihood of deceptive abuse.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill documentation describes capabilities that require shell, network, environment-variable access, and file writes, but it does not declare an explicit tool scope such as allowed-tools or permissions. This creates an overbroad execution surface where an agent may invoke powerful capabilities without transparent restriction, increasing the chance of unintended filesystem, network, or secret-access behavior.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger conditions are written broadly enough that the skill may activate for generic Amazon pricing or comparison requests, even when the user did not intend to use this specific capability. Over-triggering can cause unnecessary API calls, data exposure, or file writes in contexts where a simpler, safer response would have sufficed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill instructs that full API responses are always written to the current project directory, but it does not require a user-facing warning or consent despite the possibility of sensitive seller, offer, pricing, or account-linked business data being stored locally. Persistent storage in the working directory increases the risk of accidental disclosure, repository inclusion, or later reuse outside the original task context.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

Default persistence of complete API responses to the local project directory can expose commercially sensitive pricing, offer, and seller data to other tools, collaborators, or accidental commits. Because the behavior is automatic and framed as standard operating procedure, it normalizes unsafe handling of potentially sensitive business data.

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 · references/api.md (reported line 226)May include surrounding context.

md
---

## curl 示例

**1)取 `accessToken`**

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 · references/api.md (reported line 257)May include surrounding context.

3)getCompetitivePricing(按 ASIN + 企业买家视角)

bash
curl -sS -X POST "https://tool-gateway.linkfox.com/spApi/developerProxy" \
  -H "Authorization: $LINKFOXAGENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{

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 · references/api.md (reported line 272)May include surrounding context.

3)getCompetitivePricing(按 ASIN + 企业买家视角)

bash
curl -sS -X POST "https://tool-gateway.linkfox.com/spApi/developerProxy" \
  -H "Authorization: $LINKFOXAGENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{

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 · references/api.md (reported line 287)May include surrounding context.

3)getCompetitivePricing(按 ASIN + 企业买家视角)

bash
curl -sS -X POST "https://tool-gateway.linkfox.com/spApi/developerProxy" \
  -H "Authorization: $LINKFOXAGENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The onboarding instructions explicitly tell the agent to ask for a user's phone number and use it in a registration/login flow, but they provide no privacy notice, consent guidance, minimization requirements, or handling restrictions for this personal data and SMS verification codes. In an agent setting, this creates a real risk of collecting and transmitting sensitive user data through the skill workflow without adequate safeguards or clear user awareness.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

A pricing lookup skill would be expected to make API calls to Amazon-related services, but spawning a separate Python process to check another skill dependency is not inherent to pricing retrieval itself. This introduces execution capability beyond the skill's stated business purpose.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/_spapi_pricing_common.py (reported line 38)May include surrounding context.

python
print(f"DEPENDENCY_MISSING: {json.dumps(payload, ensure_ascii=False)}", file=sys.stderr)
        sys.exit(DEPENDENCY_EXIT_CODE)
    try:
        result = subprocess.run(
            [sys.executable, str(checker)],
            capture_output=True,
            text=True,

Static analysis

No suspicious patterns detected.