Back to skill

Security audit

Marketing Asset Generator

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated marketing workflow, but its upload methods can send arbitrary readable local files to Feishu or Slack if misused.

Review before installing. Use it only in a workspace where generated marketing assets are safe to share with the configured Feishu folder and Slack channel, avoid passing arbitrary file paths to the upload methods, and prefer pinned dependencies plus explicit upload confirmation or path restrictions.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
marketing_asset_workflow.py:114
Finding

Unrestricted Local File Upload to Feishu and Slack

Content
View full analysis
Remediation
View remediation
MAX_UPLOAD_SIZE: raise ValueError("Asset exceeds the upload size limit") return candidate ``` ]]>

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unpinned and Unverified Third-Party Dependencies

Content
View full analysis
=1.0.0 duckduckgo-search>=6.1.0 google-genai>=0.3.0 requests>=2.31.0 requests-toolbelt>=1.0.0 slack-sdk>=3.27.0 ``` ### Technical Analysis All dependencies use open-ended `>=` constraints. Consequently, an installation performed after this audit can resolve to future package versions that were not represented by the reviewed source tree. The project also has no reviewed lockfile or package hashes. Package names are obtained from the default package index selected by the installation environment, and downloaded artifacts are not authenticated against project-maintained hashes. No dependency in the audited files was proven malicious, and no typosquatted package was identified. The risk is that a compromised upstream release, compromised package-distribution account, unsafe future update, or manipulated package source could satisfy the broad constraints and execute with the Skill's privileges during installation or import. ### Attack Path 1. An upstream package account or distribution channel is compromised, or a future package release introduces malicious behavior. 2. The malicious version remains numerically compatible with the applicable `>=` constraint. 3. A user installs or reinstalls the Skill without a lockfile and hash verification. 4. The package resolver downloads the unreviewed version. 5. Malicious installation hooks or imported package code execute in the Python environment. 6. That code may read the Skill's environment variables, local files, and network-accessible credentials. This attack path is contingent on dependency or package-source compromise; the repository itself does not contain a remote payload loader. ### Impact Assessment Dependency code executes with the same operating-system permissions ...[truncated 508 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The documented purpose omits behaviors detected by analysis: saving generated files locally and uploading them directly to Slack as attachments. Undisclosed file persistence and secondary data sharing are dangerous because users may assume assets exist only in memory or only in Feishu, while sensitive prompts, generated content, or embedded metadata may be retained locally or propagated more widely than expected.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · marketing_asset_workflow.py (reported line 96)May include surrounding context.

python
return []

    def _get_feishu_token(self):
        """Get Feishu tenant access token"""
        url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
        payload = {
            "app_id": self.feishu_app_id,

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The workflow automatically uploads generated assets to Feishu Drive and sends details to Slack without explicit user confirmation at the time of transmission. If prompts or generated assets contain confidential marketing plans, embargoed content, or regulated data, this causes unintended disclosure to third-party services and broader audiences.

Content

No source excerpt is available for this finding.

Tainted flow: 'headers' from open (line 124, file read) → requests.post (network output)

High
Category
Data Flow
Confidence
80% confidence
Finding

File contents flow to a network sink. This may indicate data exfiltration of sensitive files.

Content

Scanner excerpt · marketing_asset_workflow.py (reported line 129)May include surrounding context.

python
"Content-Type": multi_form.content_type
            }
            
            response = requests.post(upload_url, headers=headers, data=multi_form)
            response.raise_for_status()
            result = response.json()["data"]

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README explicitly advertises automatic upload to Feishu Drive and Slack notifications, but it does not warn users that prompts, generated assets, filenames, links, or related metadata may be transmitted to third-party services. In an AI workflow handling potentially sensitive marketing materials, this omission can cause users to unintentionally exfiltrate confidential campaign content outside their local environment or approved boundary.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill advertises network access and use of multiple secrets via environment variables, but it does not declare an explicit tool scope such as permissions or allowed-tools. That makes the effective trust boundary unclear and can lead to overbroad execution in agent environments, especially because the workflow can exfiltrate generated content and related context to external services.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description does not clearly warn that generated assets and related context are automatically uploaded to Feishu Drive and shared via Slack. In a marketing workflow this may be expected at a high level, but the lack of an explicit disclosure increases the risk that users include confidential prompts, unreleased campaign material, or internal references that are then automatically transmitted to third-party systems.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

Generated images are silently written to local disk without notice, which can leave sensitive or unexpected artifacts on the host. In an agent/workflow context, users may assume outputs are ephemeral; persistent file creation can expose data to other local users, backup systems, or later automation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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 · marketing_asset_workflow.py (reported line 102)May include surrounding context.

python
"app_id": self.feishu_app_id,
            "app_secret": self.feishu_app_secret
        }
        response = requests.post(url, json=payload)
        response.raise_for_status()
        return response.json()["tenant_access_token"]

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The dependency is specified with a minimum version only, which allows future installs to resolve to different versions over time. This weakens reproducibility and can silently introduce vulnerable or breaking releases through the supply chain.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
python-dotenv>=1.0.0
duckduckgo-search>=6.1.0
google-genai>=0.3.0
requests>=2.31.0

Unverifiable Dependency: python-dotenv has 2 known advisory(ies) (CVE-2026-28684 (python-dotenv: Symlink following in set_key allows arbitrary file overwrite via ); CVE-2026-28684 (python-dotenv reads key-value pairs from a .env file and can set them as environ)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
89% confidence
Finding

The manifest does not pin python-dotenv, so it is impossible to verify whether the installed version includes known vulnerable releases. While this file alone does not prove exploitation, the combination of an advisory-bearing package and non-deterministic version selection creates avoidable supply-chain risk.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

Using an unpinned version for duckduckgo-search means builds are not reproducible and later installations may pull in unexpected code changes. This increases supply-chain risk, even if no specific exploit is evident from this file alone.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
python-dotenv>=1.0.0
duckduckgo-search>=6.1.0
google-genai>=0.3.0
requests>=2.31.0
requests-toolbelt>=1.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The google-genai package is not pinned to a specific release, so the deployed dependency can vary between installations. In a workflow that interfaces with external AI services, this can introduce unreviewed behavior changes or newly introduced vulnerable code.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
python-dotenv>=1.0.0
duckduckgo-search>=6.1.0
google-genai>=0.3.0
requests>=2.31.0
requests-toolbelt>=1.0.0
slack-sdk>=3.27.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

Requests is unpinned despite being a security-sensitive HTTP client library with a history of advisories. In this skill, it likely handles external network communication to cloud and messaging services, so resolving to an affected version could expose credential leakage, TLS, or request-handling issues.

Content

Scanner excerpt · requirements.txt (reported line 4)May include surrounding context.

text
python-dotenv>=1.0.0
duckduckgo-search>=6.1.0
google-genai>=0.3.0
requests>=2.31.0
requests-toolbelt>=1.0.0
slack-sdk>=3.27.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
96% confidence
Finding

Requests has multiple historical advisories, and because the version is not pinned, the actual installed release cannot be verified as safe. Given this skill's likely reliance on outbound HTTP for cloud storage, search, image generation, and notifications, an affected requests version could have meaningful security impact.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

Requests-toolbelt is unpinned, allowing dependency drift and reducing build determinism. Because it extends HTTP request handling, unexpected upstream changes can affect how data is uploaded or transmitted to third-party services.

Content

Scanner excerpt · requirements.txt (reported line 5)May include surrounding context.

text
duckduckgo-search>=6.1.0
google-genai>=0.3.0
requests>=2.31.0
requests-toolbelt>=1.0.0
slack-sdk>=3.27.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

Slack SDK is unpinned, so future installs may pull in unreviewed releases that interact with Slack APIs and tokens differently. In a notification workflow, dependency drift in a privileged API client increases the risk of token misuse, data exposure, or operational breakage.

Content

Scanner excerpt · requirements.txt (reported line 6)May include surrounding context.

text
google-genai>=0.3.0
requests>=2.31.0
requests-toolbelt>=1.0.0
slack-sdk>=3.27.0

Static analysis

No suspicious patterns detected.