Back to skill

Security audit

Elderly Gait Instability / Shuffling Step Detection | 老年人步态不稳/小碎步识别

Security checks across malware telemetry and agentic risk

Overview

The skill is a cloud gait-analysis tool for sensitive health videos, but it also silently manages user identity, remote registration, stored tokens, and history access in ways users should review before installing.

Install only if you are comfortable sending elderly-person gait videos and report history to the configured LifeEmergence/SMYX cloud service, and only after confirming which endpoint will be used, how identities are created, where tokens are stored, and how reports and local database records can be deleted.

SkillSpector

By NVIDIA
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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (27)

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
if filters:
                for key, value in filters.items():
                    query = query.filter(getattr(self.__model__, key) == value)

            if offset:
                query = query.offset(offset)
Confidence
82% confidence
Finding
Here getattr(self.__model__, key) uses keys from the caller-supplied filters dict, so untrusted input can select arbitrary model attributes and trigger unexpected query behavior or exceptions. While SQLAlchemy prevents classic SQL injection here, this still creates a denial-of-service and authorization-scope risk if higher layers pass user-controlled filter names to enumerate or probe fields not intended for exposure.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
if filters:
                for key, value in filters.items():
                    query = query.filter(getattr(self.__model__, key) == value)

            return query.scalar()
        finally:
Confidence
82% confidence
Finding
This count() method repeats the same pattern of resolving model attributes from caller-provided filter keys. An attacker able to influence filters could cause application errors, schema probing, or bypass intended query restrictions by counting on fields that should not be queryable.

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill advertises no explicit permissions, yet the documentation directs use of local file handling, shell execution, network access, and likely environment-backed identity/auth flows. That mismatch weakens user and platform understanding of what the skill can do and can hide materially sensitive operations such as local persistence and remote data access.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The documented behavior extends beyond simple gait analysis into identity bootstrap, token storage, persistent local user records, and cloud history retrieval tied to a current user. This is dangerous because a health-analysis skill handling sensitive video and report data can silently create accounts, retain identifiers, and expose or correlate historical health records without that being clearly represented in its declared purpose.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
The skill documentation adds cloud history querying, report-link retrieval, and report-management functions that are not reflected in the primary description. In a healthcare-adjacent context, undisclosed access to prior reports increases privacy risk because users may believe they are only submitting one video for analysis while the skill can also enumerate linked historical records.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The function accepts a `pet_type` parameter and mutates a global default (`ConstantEnum.DEFAULT__PET_TYPE`) in a skill that is supposed to analyze elderly gait instability. This indicates code reuse from an unrelated pet-analysis skill and creates semantic confusion and cross-request state contamination risk, which can cause incorrect analysis behavior or misrouting of data in multi-user or automated environments.

Intent-Code Divergence

Medium
Confidence
91% confidence
Finding
The CLI exposes pet-category choices (`cat`, `dog`, `other`) and help text for an elderly gait analysis tool, which is a strong sign of mismatched functionality or unsafe copy-paste reuse. In a healthcare-adjacent context, misleading interface semantics can lead operators to select invalid modes, produce unreliable fall-risk assessments, or conceal that the backend is not actually tailored to the claimed purpose.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The skill accepts arbitrary http/https URLs as video input, which expands its data access well beyond the stated fixed-camera/local-recording use case. This can enable server-side fetching of attacker-controlled resources, unexpected third-party data ingestion, and policy bypass around what sources are allowed for medical-style gait analysis.

Context-Inappropriate Capability

Medium
Confidence
83% confidence
Finding
The skill exposes report-listing functionality that is not necessary for single-video gait analysis and may reveal prior analysis records and export URLs. In a health-related context, this increases the risk of unintended access to sensitive historical reports if authorization is weak elsewhere or if the function is exposed to users who only need one-off analysis.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The script exposes a history-listing function that retrieves prior analysis results via `skill.get_output_analysis_list(open_id=open_id)`, which goes beyond the declared purpose of analyzing a single gait video. This creates a privacy and scope-expansion risk because historical health-related analysis data may be accessible through the CLI without clear user disclosure or access control visible in this file.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The code resolves a hidden `open-id` and uses `ConstantEnum.CURRENT__OPEN_ID` to fetch analysis history, despite this identity mechanism not being part of the stated gait-analysis function. In a health-related context, tying hidden identity resolution to history retrieval increases the risk of unauthorized access to sensitive prior assessments, making the issue more dangerous due to potential medical/privacy implications.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
This file exposes a broad generic API client surface including arbitrary GET/POST/PUT/DELETE and CRUD-like wrappers that are not constrained to the skill’s declared gait-analysis purpose. In an agent skill, this materially increases the capability envelope and can enable unintended data access, exfiltration, or interaction with unrelated backend services if higher-level code passes attacker-controlled URLs or payloads.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The `get_user_by_username` capability introduces user-account lookup functionality that is unrelated to analyzing gait stability from video. In a healthcare-adjacent context involving elderly subjects, this kind of identity lookup can facilitate unnecessary collection or correlation of personal data and expands the risk of privacy abuse or account enumeration.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
The configuration class reads user-identifying environment variables such as OPENCLAW_SENDER_OPEN_ID, OPENCLAW_SENDER_USERNAME, and FEISHU_OPEN_ID even though this skill is described as elderly gait-instability analysis from video. Pulling identity data unrelated to the declared function expands data collection scope and can silently bind analysis activity to user identities, increasing privacy and cross-context tracking risk.

Description-Behavior Mismatch

Medium
Confidence
89% confidence
Finding
The file defines a persistent user/account DAO and default-user lookup logic that are unrelated to the stated gait-instability video-analysis purpose. This kind of capability expansion increases privacy and abuse risk because the skill can retain identity-linked records and mutate account-like data without a clear need tied to gait assessment.

Context-Inappropriate Capability

High
Confidence
95% confidence
Finding
The User model stores personal profile data plus authentication-like fields such as token and open_token, yet the skill description is limited to gait analysis from fixed-camera video. In this context, collecting and storing tokens is especially dangerous because compromise of the local SQLite database could expose credentials or session artifacts unrelated to the medical-style analytics function.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
This utility file performs remote login/registration, token acquisition, and authenticated HTTP requests, which is unrelated to the declared purpose of local elderly gait video analysis. In this skill context, the hidden network-capable account/bootstrap behavior materially increases risk because it can transmit identity and environment-linked data off-device without a clear user need or consent path.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The code generates or reuses persistent user identities, reads an identity from a local file, and stores account-linked tokens in a local database. For a gait-instability detection skill, this identity lifecycle management is unrelated to core functionality and creates unnecessary tracking, credential persistence, and potential unauthorized account creation risks.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The code reads the entire local file and submits it for analysis without any user-facing consent, warning, or disclosure in this component. Because the input is a video of an elderly person and the outputs are health-related, silent upload of local media creates significant privacy and sensitive-data handling risk.

Missing User Warnings

Medium
Confidence
78% confidence
Finding
The script accepts a hidden `--api-key` parameter while suppressing it from help output, which obscures credential handling from users and reviewers. Hidden credential inputs increase the chance of insecure operational use, such as passing secrets on the command line where they may be exposed through shell history, process listings, or undocumented integrations.

Missing User Warnings

Low
Confidence
90% confidence
Finding
The code accesses user-related environment variables without any in-code notice, consent mechanism, or visible disclosure tied to the skill's health-oriented purpose. Even if the values are only used for routing or platform integration, undisclosed collection of identifiers is a privacy and transparency problem, especially in a skill handling sensitive elderly-health context.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The function silently reads an identity-like value from data/smyx-api-key.txt and uses it as an internal identifier without any evident user disclosure or validation. In this context, that creates covert identity reuse and increases the chance that local credential-like material is consumed unexpectedly by a skill that should primarily do local video analytics.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The HTTP request wrapper attaches pnaUserName, X-Access-Token, X-Api-Key, and Authorization headers and may send them to remote services without any clear notice in the skill description. For an elderly gait-analysis skill expected to analyze local camera footage, undisclosed transmission of identity and auth material is a meaningful privacy and security concern.

External Transmission

Medium
Category
Data Exfiltration
Content
"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"):
Confidence
97% confidence
Finding
This line sends a registration/login payload containing openId, mobile, and source to a remote endpoint. External transmission is especially concerning here because the declared skill purpose is local gait-risk assessment, so sending identity data to a backend is unexpected and expands privacy exposure beyond what users would reasonably anticipate.

Hidden Instructions

High
Category
Prompt Injection
Content
|---|---|
| 📚 文档读取 | 仅在需要时读取参考文档,保持上下文简洁 |
| 📁 格式支持 | 输入要求:支持 mp4/avi/mov 视频,最大 10MB;建议覆盖完整直线行走片段、≥ 25 FPS |
| 🧑‍⚖️ 结果性质 | 步幅 cm 估算依赖身高/标定信息,若未提供身高则采用经验比例换算,绝对值仅供参考、趋势更有意义 |
| 🧑‍⚖️ 结果性质 | 检测结果仅作为辅助筛查参考,本工具不替代专业康复/神经科评估 |
| 🔏 隐私合规 | 隐私合规:步态视频涉及个人健康信息,使用前需取得被监护人或家属知情同意,并妥善保管/加密相关录像 |
| 🚫 脚本限制 | 禁止临时生成脚本,只能用技能本身的脚本 |
Confidence
84% confidence
Finding
The hidden-instruction indicator suggests the file may contain invisible or non-obvious directive content, which is a known prompt/metadata poisoning technique. In a skill that already instructs shell execution and sensitive health-data handling, concealed instructions can mislead agents or reviewers about actual behavior and bypass normal scrutiny.

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.install_untrusted_source

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
skills/smyx_common/scripts/config-dev.yaml:2