Back to skill

Security audit

Living-Alone Sleep Rhythm Anomaly Analysis | 独居者作息规律异常分析

Security checks for vulnerabilities and agentic risk

Overview

The skill is rated suspicious because scanners report sensitive video handling, account and credential activity beyond its stated monitoring purpose, and behavior that may run despite export-only options.

Consider the verdict suspicious and review the reported upload, HTTP configuration, account registration, and export-only behavior before installing. The scan was partial because a referenced local path was missing, so it does not establish the complete behavior or prove that the skill is safe.

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
skills/smyx_common/scripts/config-dev.yaml
Finding

Development configuration sends credentials and private analysis data over HTTP

Content
View full analysis

Impact

A network observer can obtain transmitted authentication tokens and private video content or source URLs. An active intermediary can alter requests and responses. Token reuse depends on the remote service's token validity and enforcement, which were not tested.

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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (23)

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Database persistence could be a legitimate supporting detail, but this chunk specifically implements account-management functionality, including username/real-name lookup, default-user selection, and storage of email, demographic details, and token fields. It contains no camera processing, nighttime event detection, baseline computation, or anomaly-alert logic. The mismatch is based on the concrete account-management purpose, not merely on using SQLite. This assessment is limited to the supplied chunk; it does not establish what other skill components do or indicate that stored data is transmitted externally.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Ordinary formatting, polling, and filesystem helpers could support the declared monitoring skill and are not themselves mismatches. However, this chunk also implements account provisioning, credential handling, and authenticated external-service access that the description does not disclose. Its request wrapper accepts absolute URLs and attaches configured credentials without a visible destination restriction. These capabilities are available when the functions are called; the chunk does not establish that they run automatically on import or that malicious exfiltration occurs. Because only a shared utility module is supplied, the missing video-analysis logic does not prove the complete skill lacks it, but the observed account and network behavior materially exceeds the declared purpose.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The visible implementation is generic scaffolding with a nonfunctional chat helper, materially different from the described sleep-routine monitoring system. No subprocess is actually executed, and no camera access or external transmission is demonstrated. Imported base classes and services are not supplied, so their behavior cannot be assessed; this finding is limited to the provided chunk.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The supplied code implements a generic analysis-service client and report interface rather than the specialized monitoring and anomaly-detection behavior described. File validation, service submission, polling, and report formatting could support the declared system, but do not establish its defining capabilities. Imported service implementations are not provided, so the backend might perform some specialized analysis; nevertheless, the supplied chunk contains no evidence of the continuous monitoring, historical baseline management, or threshold-based alerting promised by the description.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
MCP Tool Poisoning
Confidence
82% confidence
Finding

The supplied chunk implements a generic video-analysis wrapper, not the specialized monitoring and anomaly-detection workflow described. It contains no camera ingestion loop, nighttime scheduling, baseline calculations, or sleep-routine alert logic. The delegated skill implementation is not supplied, so some specialized analysis could exist there; however, this chunk alone does not substantiate the declared primary behavior. Identity resolution, history retrieval, and optional file output are supporting operations and are not independently treated as suspicious capabilities.

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 documented export-only mode still executes video analysis.

Medium
Category
Excessive Agency
Confidence
100% confidence
Finding

The export-only flag is parsed but never checked, so supplying it with an input still invokes the normal analysis path despite explicitly promising not to analyze. In a bedroom-camera skill, this can cause unintended processing and potential remote disclosure of highly sensitive footage.

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

Local video contents are passed to the analysis API without disclosure that the file will be uploaded.

Medium
Category
Output Handling
Confidence
93% confidence
Finding

The implementation reads the entire local video and passes its contents to the analysis API without an upload-specific notice or consent check. General references to cloud APIs and monitoring consent do not clearly establish authorization to transmit intimate bedroom footage to an external processor.

Content

No source excerpt is available for this finding.

The --export-env-only option promises not to analyze video, but analysis still executes.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The --export-env-only argument is never consulted after parsing, so an invocation containing a video input still calls the analysis service. Users relying on the explicit no-analysis promise can unintentionally submit sensitive home-camera footage for processing.

Content

No source excerpt is available for this finding.

The documented create-only save operation can overwrite existing records.

Medium
Category
Excessive Agency
Confidence
94% confidence
Finding

A method documented as creating a record catches every insertion exception and instead attempts to overwrite an existing record by ID, then by username or realname. This can turn a rejected insert into unintended modification of identity and token fields, undermining data integrity in a privacy-sensitive monitoring system; exploitability depends on who controls the supplied model.

Content

No source excerpt is available for this finding.

The ai_chat docstring claims to invoke an OpenClaw agent, but the implementation never executes it.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The docstring at L26 explicitly promises invocation of openclaw agent through subprocess, but both command construction and subprocess execution are commented out. Instead, L68 creates an empty dictionary, and accessing result.stderr raises an exception that is caught, causing the method to return None without performing the documented 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
96% confidence
Finding

The generic open helper always opens the supplied path in 'w' mode, immediately erasing existing contents. There is no docstring, comment, confirmation, or operation-specific log explaining this destructive behavior; exception tracing does not disclose successful truncation.

Content

No source excerpt is available for this finding.

The HTTP helper silently provisions remote user accounts, a capability outside the stated rhythm-analysis purpose.

Medium
Category
Excessive Agency
Confidence
94% confidence
Finding

When credentials are missing, a generic HTTP request can automatically call a remote login endpoint with register=1 and silent=1, then persist returned credentials. No explicit enrollment approval is visible, making account creation and identity disclosure hidden side effects rather than a necessary consequence of local rhythm analysis.

Content

No source excerpt is available for this finding.

HTTP requests can silently transmit the current identity and register a remote account.

Medium
Category
Output Handling
Confidence
94% confidence
Finding

The helper sends the current identifier as both openId and mobile while requesting silent account registration, without a visible consent check. In a home-monitoring skill, this can unexpectedly link a user's identity to an external service, although this particular request does not show video transmission.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

The POST transmits the current identity and source metadata to a configured remote service as part of automatic registration. External networking alone is not a vulnerability, but this call has an undisclosed enrollment side effect with no visible approval gate; the destination's trustworthiness and transport configuration are not established here.

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"):

Loading configuration silently creates directories and configuration files, including during module import.

Low
Category
Output Handling
Confidence
96% confidence
Finding

YamlUtil.load creates parent directories and writes a YAML file when the requested path is missing, without a warning, log, comment, or docstring disclosing this side effect. BaseEnum.init_subclass invokes this loader at L053 and L058, so defining configuration classes during import can modify the filesystem without an explicit save operation.

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