Back to skill

Security audit

Plant Nutrient Deficiency Diagnosis | 植物缺素症视觉诊断

Security checks across malware telemetry and agentic risk

Overview

The skill can perform the advertised plant analysis, but it also silently creates or reuses an identity, stores tokens locally, queries cloud history, and is configured to call private development API endpoints.

Review before installing. Use this only if you are comfortable with plant media or URLs being sent to an external service, cloud history being queried by an automatically selected identity, and access tokens/profile data being stored in a local workspace database. The packaged config should be corrected to production HTTPS endpoints and should disclose identity, retention, and token behavior clearly.

SkillSpector

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

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
83% confidence
Finding
Using getattr(self.__model__, key) on unvalidated filter keys allows callers to select arbitrary mapped attributes and can trigger exceptions or expose broader query capabilities than intended. While SQLAlchemy prevents classic SQL injection here, this still creates an unsafe mass-query surface that can be abused for unauthorized field-based querying or denial-of-service through malformed keys.

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 unvalidated dynamic attribute access pattern as list(), allowing callers to probe arbitrary model fields and cause errors with invalid attributes. In a shared DAO used across skills, this broadens the attack surface for metadata probing and service disruption even if it is not raw SQL injection.

Lp3

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding
The skill declares no permissions while its documented behavior requires shell execution, network access, local file read/write, and likely environment access. This hides the real trust boundary from users and hosts, increasing the chance that sensitive local files, uploaded media, tokens, or report data are accessed or transmitted without informed consent.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The manifest presents a narrow plant-diagnosis skill, but the documented/runtime behavior extends to generic remote analysis, history retrieval, local identity creation, remote authentication, token persistence, and handling broader media inputs. This mismatch can mislead users and platform policy engines, causing over-trust and silent collection or retention of user media and account-linked history beyond what the description suggests.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The skill exposes a diagnosis history listing function via `show_analyze_list`, which is outside the manifest's stated purpose of analyzing a single plant image or video. Extra data-access capability increases the attack surface and may reveal prior user analyses or account-scoped records without clear consent or necessity.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The code initializes and uses an internal user identity (`open_id`) even though the advertised functionality is only nutrient diagnosis from supplied media. Introducing hidden identity handling creates unnecessary collection/linkage of user data and can enable access to account-scoped information such as analysis history.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
Resolving account identity and using it for history access is not justified by the narrow task of plant nutrient diagnosis from images. This mismatch between stated purpose and implemented behavior can facilitate privacy violations or unauthorized retrieval of user-linked records if the surrounding authorization model is weak.

Description-Behavior Mismatch

High
Confidence
94% confidence
Finding
The skill metadata promises leaf-image nutrient diagnosis, but the implementation accepts generic local files and remote video URLs and forwards them to a backend analysis service. This mismatch is dangerous because it can mislead users about what data is being collected and processed, expanding data exposure and enabling unintended upload of unrelated or sensitive media.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The implementation materially diverges from the declared skill purpose: instead of diagnosing plant nutrient deficiencies from leaf images, it invokes a generic video-analysis workflow and accepts local/remote video inputs. This mismatch is dangerous because it can conceal undeclared data flows and capabilities from users, reviewers, and policy controls, enabling collection or processing of unrelated media under false pretenses.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The history-listing function exposes analysis records via an open_id-based lookup that is not justified by the stated plant-diagnosis use case. Even if intended for convenience, undeclared access to user analysis history increases privacy risk and could enable unauthorized enumeration or disclosure of prior submissions if open_id handling is weak elsewhere.

Intent-Code Divergence

High
Confidence
96% confidence
Finding
The CLI help text, parameters, and runtime messages clearly describe a video-analysis tool, directly contradicting the manifest's plant leaf image diagnosis description. This inconsistency is a strong indicator of capability misrepresentation, which undermines trust, bypasses expected review assumptions, and may cause users to provide broader or more sensitive data than they intended.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
This file implements a generic API client with broad CRUD and arbitrary HTTP capabilities that are not narrowly scoped to plant nutrient diagnosis. In a skill whose stated purpose is image-based deficiency analysis, this unnecessary network surface increases the chance of abuse for unrelated data access, command proxying, or integration with unintended backends if higher-level inputs can influence URLs or payloads.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The add, edit, and delete methods provide direct remote state-changing operations even though the skill is described as a diagnostic analyzer, not an administrative management tool. If exposed through agent workflows or user-controlled parameters, these methods could be used to modify or delete remote resources unrelated to plant analysis, causing integrity loss or service abuse.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The generic http_post/http_put/http_get/http_delete wrappers expose broad outbound network access without visible restrictions on destination, operation, or data class. In the context of a narrowly purposed vision-diagnosis skill, this creates an unjustified capability that could be repurposed for exfiltration, arbitrary API calls, or access to unintended internal or third-party services.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The presence of generic user/account persistence in a plant nutrient diagnosis skill exceeds the stated image-analysis purpose and introduces unnecessary identity-handling functionality. Extra account logic increases the chance of collecting, storing, or mutating user data without clear need, which materially expands privacy and abuse risk.

Description-Behavior Mismatch

Medium
Confidence
87% confidence
Finding
Automatic local database creation and schema migration go beyond a diagnosis-only skill and introduce persistent state and filesystem write behavior not evident from the manifest. Hidden persistence is risky because it can retain user-related data across runs and create undeclared side effects in environments that expect stateless image analysis.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
Handling usernames, real names, email, birthday, age, sex, tokens, and source identifiers is context-inappropriate for a plant nutrient deficiency tool and creates a privacy-sensitive data store unrelated to core functionality. Because these fields include personal and authentication-related information, compromise or misuse would have broader impact than ordinary plant-analysis metadata.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The utility layer performs remote account creation/login and persists returned tokens locally, which is unrelated to plant nutrient diagnosis and materially expands the skill's privileges and data handling. In this context, silent identity provisioning and token acquisition can cause unauthorized external account activity and unexpected transmission/storage of user-linked identifiers.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
The code probes agent workspace structure and creates/uses shared data and skills directories, behavior broader than needed for leaf-image nutrient analysis. In a skill ecosystem, workspace discovery and directory manipulation increase the chance of cross-skill data access, persistence, or unintended modification of the runtime environment.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The code reads identity material from a workspace API-key file and falls back to creating persistent default users without clear relation to the advertised diagnosis feature. This enables covert identity selection and durable user tracking, and may misuse local credentials or create accounts without informed consent.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The default trigger is broad enough to activate on common gardening or image-sharing requests whenever a user provides plant imagery or mentions nutrient-related symptoms. Over-broad auto-invocation can cause unintended file saving, cloud submission, or history queries without sufficiently specific user consent.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill states that attachments are automatically saved locally and that cloud APIs are used for diagnosis/history, but it does not present a prominent warning that uploaded images/videos and associated report data may be transmitted to external services and stored. Users may therefore disclose sensitive media, metadata, or account-linked diagnostic history without informed consent.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill performs hidden internal identity resolution with `OpenIdUtil.resolve_current_open_id(...)` while suppressing user-facing disclosure (`--open-id` help is hidden). Undisclosed identity handling is dangerous because users cannot meaningfully consent to data association, and it may support stealthy tracking or cross-session linkage.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The code reads local file contents into memory and uploads them, or forwards remote URLs to an analysis service, without any user-facing disclosure or confirmation in this logic. In the context of a skill advertised as simple plant diagnosis, that creates a privacy/transparency risk because users may not realize local media or third-party URLs are being transmitted off-device.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The request wrapper injects usernames/tokens into outbound requests and, in debug mode, enables verbose HTTP logging that can reveal request metadata and potentially sensitive payload contents. For an image-diagnosis skill, this creates unnecessary privacy risk because users would not reasonably expect hidden account data and request details to be transmitted or logged.

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