Back to skill

Security audit

Pet Vomiting / Regurgitation Detection | 宠物呕吐/反流行为识别

Security checks for vulnerabilities and agentic risk

Overview

This pet-video analysis skill needs review because account sharing, credential storage, and ignored execution controls could expose private footage or reports.

Before using private footage or a shared agent, require fixes for caller isolation and the ignored export-only flag. Confirm where videos are stored, how to delete them, how login tokens are protected, and whether service charges apply. The evidence supports review rather than a malicious verdict.

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/smyx_vomiting_regurgitation_detection_analysis.py
Finding

Default CLI workflow ignores the upstream sender identity and reuses a shared account

Content
View full analysis

Impact

In the described shared-Agent deployment, one caller can receive another caller's analysis records and report links. Analysis submissions are also associated with the shared fallback account.

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
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (25)

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The supplied chunk is primarily user-account database infrastructure, not video analysis or pet-health event recording. Database storage could support the declared purpose, but the concrete model and specialized operations concern user identities and tokens rather than pets, vomiting events, or vomitus characteristics. No video ingestion, action recognition, vomitus detection, or event-frequency tracking appears in this chunk. The code shows local storage capabilities, not token harvesting or network exfiltration. This assessment is limited to the supplied chunk; other skill components may implement the advertised detection.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The supplied chunk does not implement the declared pet-health detection purpose. Its only substantive method is an incomplete chat helper; it does not actually invoke an agent or analyze video. This is a functional mismatch, not evidence of malicious behavior or undeclared command execution. Imported base classes and services are not supplied, so their behavior cannot be assessed.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

General formatting, polling, and filesystem helpers could reasonably support the declared skill. However, this chunk also implements an undeclared account-registration, credential-management, and billing integration involving local identity resources and remote services. These are substantive behaviors not represented by the pet-monitoring description. The supplied chunk contains no video processing, vomiting detection, vomitus classification, or event recording; those features may exist elsewhere, but they are not demonstrated here. The payment instructions are returned text, not evidence that this code installs another skill.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

The supplied chunk implements a generic API client rather than the described video-analysis capability. It contains no camera processing, action recognition, vomitus detection, or event-analysis logic. HTTP helpers could support a larger monitoring system, but this chunk does not establish that connection, particularly for user lookup. This assessment is limited to the supplied code; it does not establish malicious activity or rule out relevant functionality elsewhere.

Content

No source excerpt is available for this finding.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

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

md
---
name: "smyx-vomiting-regurgitation-detection-analysis"
description: "AI-powered pet vomiting and regurgitation detection from indoor fixed-camera video. Identifies rhythmic abdominal contractions, head-forward extension, and mouth opening actions, plus detects vomitus on the floor (food, hairball, bile). Records event time, frequency, and vomitus characteristics for early digestive issue discovery. Scenarios: daily home health monitoring, multi-pet households, senior pet care, animal hospital inpatient observation. | 通过室内固定摄像头分析宠物活动区域的连续视频,利用动作识别技术检测宠物的呕吐或反流行为(

The HTTP helper can send service credentials and the current user identity to arbitrary caller-supplied destinations.

High
Category
Excessive Agency
Confidence
99% confidence
Finding

The helper accepts arbitrary absolute HTTP or HTTPS URLs and automatically adds service tokens, the API key, and the current user identity. A caller able to influence the destination can therefore send credentials to an attacker-controlled host, while HTTP also permits unencrypted transmission.

Content

No source excerpt is available for this finding.

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: env, file_read, file_write, network, shell.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

The default trigger selects vomiting analysis for any pet-area video submitted for analysis.

Medium
Category
Trigger Abuse
Confidence
98% confidence
Finding

The default trigger treats any pet-area video submitted for analysis as authorization for this particular workflow, even when the user intended a different analysis. Because the workflow uses remote processing, this overbroad trigger can cause unintended processing and disclosure of private indoor footage.

Content

No source excerpt is available for this finding.

The local-video analysis workflow lacks a clear privacy warning about remote media processing.

Medium
Category
Output Handling
Confidence
94% confidence
Finding

Although the document mentions APIs and cloud history, the local-file workflow does not clearly state that the actual video contents leave the device or require informed authorization for that transfer. Indoor camera footage can expose household members, interiors, and routines, making this omission materially more sensitive than ordinary remote text processing.

Content

No source excerpt is available for this finding.

The --export-env-only option promises not to execute analysis, but does not prevent analysis from running.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The parser accepts --export-env-only and promises not to analyze, but the parsed flag is never checked. When input or --list is supplied, identity initialization and the normal remote workflow still run, potentially transmitting private footage or accessing account data despite the user's explicit non-execution selection.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · skills/smyx_analysis/scripts/skill.py (reported line 28)May include surrounding context.

python
result_json = JsonUtil.parse(result_json_pure_text, result_json_pure_text)

        result_json_common_ai_response = result_json.get("commonAiResponse") if isinstance(result_json,
                                                                                           dict) else result_json
        if result_json_common_ai_response:
            result_json = result_json_common_ai_response

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · skills/smyx_analysis/scripts/skill.py (reported line 33)May include surrounding context.

python
result_json = result_json_common_ai_response

        result_json_health_ai_response = result_json.get("healthAiResponse") if isinstance(result_json,
                                                                                           dict) else result_json
        if result_json_health_ai_response:
            result_json = result_json_health_ai_response

The --export-env-only option promises not to execute analysis, but the code runs analysis anyway.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The export-only flag is declared but never consulted, so providing it with a valid input still reaches the normal analysis call. This violates an explicit no-analysis expectation and can trigger unintended remote processing of sensitive indoor video; identity resolution also runs before any such guard.

Content

No source excerpt is available for this finding.

The skill includes user-profile and credential persistence unrelated to the declared pet-event analysis.

Medium
Category
Excessive Agency
Confidence
90% confidence
Finding

The user model supports storing authentication tokens alongside personal data in an ordinary SQLite database, without visible encryption or restrictive file-permission handling. If populated, these credentials can be exposed through workspace access or backups; this source alone does not prove that credentials are actually collected.

Content

No source excerpt is available for this finding.

ai_chat documents agent execution and analysis output, but never invokes the agent and always returns None.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The docstring at L26 and L33–L34 promises subprocess-based agent execution and an analysis result or session ID, but command execution is commented out. Instead, L68 creates an empty dictionary and L70 accesses its nonexistent stderr attribute; the exception is caught at L81–L82, causing every call to return None without performing analysis.

Content

No source excerpt is available for this finding.

FileUtil.open silently truncates existing files without disclosing its write-only behavior.

Medium
Category
Output Handling
Confidence
97% confidence
Finding

The generically named open helper always uses mode 'w', which immediately erases an existing file's contents. There is no docstring, explanatory comment, confirmation, or operation-specific log disclosing this destructive behavior; exception tracing does not disclose successful truncation.

Content

No source excerpt is available for this finding.

The request helper silently registers remote accounts and persists identity credentials, beyond the manifest's video-analysis and event-recording scope.

Medium
Category
Excessive Agency
Confidence
96% confidence
Finding

An ordinary request can trigger remote registration using silent=1 and register=1, then persist returned authentication tokens without a separate consent step. This introduces undisclosed identity transmission and credential retention beyond the declared pet-video monitoring functionality.

Content

No source excerpt is available for this finding.

Ordinary HTTP requests can silently register a remote account and persist authentication tokens.

Medium
Category
Output Handling
Confidence
96% confidence
Finding

The generic HTTP operation has hidden account-creation and credential-persistence side effects when authentication is missing. This duplicates the SDI-1 issue and can create remote identity records and retain reusable tokens without an explicit user decision.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This POST silently transmits the selected identity as both openId and mobile to the configured registration service. The identity-selection logic prioritizes API_SECRET_KEY, so a configured API secret can also be copied into account-profile fields, increasing exposure through service-side records and logs.

Content

Scanner excerpt · skills/smyx_common/scripts/util.py (reported line 561)May include surrounding context.

python
"source": ConstantEnum.DEFAULT__SKILL_HUB_NAME
            }
            try:
                _response = requests.post(_url, json=_data)
                if _response.status_code == 200:
                    _response_json = _response.json()
                    if _response_json and _response_json.get("success"):

Configuration loading silently creates directories and files, including during module import.

Low
Category
Output Handling
Confidence
91% confidence
Finding

YamlUtil.load creates parent directories and writes a YAML file when the requested configuration is absent, without a log, confirmation, docstring, or explanatory comment disclosing this side effect. BaseEnum.init_subclass invokes this loader during class definition (L053 and L058), so importing the module can modify the filesystem without an explicit save request.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · skills/smyx_common/scripts/dao.py (reported line 243)May include surrounding context.

python
username = getattr(model, "username", None)
            if username:
                column_names = self.__model__.__table__.columns.keys()
                update_data = {key: getattr(model, key) for key in column_names if key != "username"}
                return self.update_by_username(username, **update_data)

            return None

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · skills/smyx_common/scripts/dao.py (reported line 353)May include surrounding context.

python
column_names = self.__model__.__table__.columns.keys()

            for key in column_names:
                value = getattr(model, key)
                setattr(instance, key, value)

            session.commit()

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · skills/smyx_common/scripts/dao.py (reported line 326)May include surrounding context.

python
if filters:
                for key, value in filters.items():
                    query = query.filter(getattr(self.__model__, key) == value)

            if offset:
                query = query.offset(offset)

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · skills/smyx_common/scripts/dao.py (reported line 441)May include surrounding context.

python
if filters:
                for key, value in filters.items():
                    query = query.filter(getattr(self.__model__, key) == value)

            return query.scalar()
        finally:

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · skills/smyx_common/scripts/util.py (reported line 30)May include surrounding context.

python
elif isinstance(cur, dict):
                        cur = cur.get(part, default)
                    else:
                        cur = getattr(cur, part)
                return cur
            except Exception:
                return default