Back to skill

Security audit

Kol Creator Discovery

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it claims: it uses AIsa APIs to find similar creators and creator contact emails, with privacy-sensitive output that users should handle carefully.

Install only if you are comfortable sending creator profile URLs to AIsa and receiving/storing creator email data locally. Use it for authorized influencer research, avoid bulk harvesting or spam, keep generated reports access-controlled, and verify profile URLs before enrichment until hostname validation is hardened.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/kol_creator_discovery.py:86
Finding

Lookalike Domains Accepted by Weak Social Platform Hostname Validation

Content
View full analysis
str | None: host = urllib.parse.urlsplit(url).netloc.lower() if "youtube.com" in host or "youtu.be" in host: return "youtube" if "tiktok.com" in host: return "tiktok" if "instagram.com" in host: return "instagram" return None ``` ### Technical Analysis The function identifies supported platforms through substring comparisons against the URL authority. This does not establish that the URL belongs to the expected domain. Attacker-controlled domains such as the following pass validation: - `https://youtube.com.attacker.example/@creator` - `https://fakeinstagram.com/profile` - `https://tiktok.com.evil.example/@creator` The use of `netloc` also includes user-information and port components. For example, a URL with `youtube.com` in its user-information section could be misclassified even when its actual hostname is unrelated. After classification, `validate_profile_url()` considers the URL a supported creator profile. The URL can subsequently be transmitted to the AIsa email-lookup API: ```python def lookup_email(url: str) -> dict[str, Any]: return response_data(post_json(EMAIL_LOOKUP_PATH, {"url": url})) ``` The local script does not directly fetch the submitted profile URL, so this is not a confirmed local SSRF vulnerability. However, it permits unintended URLs to cross the documented trust boundary and be processed by the external API. ### Attack Path 1. An attacker supplies a URL containing a trusted platform name as a substring of an attacker-controlled hostname. 2. `profile_platform()` incorrectly classifies it as YouTube, TikTok, or Instagram. 3. `validate_profile_url()` accepts it as a creator profile URL. 4. `lookup_email()` places the attacker-controlled URL in ...[truncated 830 chars]
Remediation
View remediation
bool: return host == domain or host.endswith("." + domain) def profile_platform(url: str) -> str | None: parsed = urllib.parse.urlsplit(url) host = (parsed.hostname or "").lower().rstrip(".") if parsed.username is not None or parsed.password is not None: return None if parsed.port not in (None, 80, 443): return None if is_domain_or_subdomain(host, "youtube.com") or host == "youtu.be": return "youtube" if is_domain_or_subdomain(host, "tiktok.com"): return "tiktok" if is_domain_or_subdomain(host, "instagram.com"): return "instagram" return None ``` Where practical, narrow the allowlist further to known profile-serving hosts such as `www.youtube.com`, `www.tiktok.com`, and `www.instagram.com`. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/kol_creator_discovery.py:210
Finding

API-Controlled Values Can Inject Markdown and Raw HTML into Generated Reports

Content
View full analysis
str: return str(value if value not in (None, "") else "—").replace("|", "\\|") ``` The resulting values are inserted directly into Markdown table rows: ```python lines.append( "| " + " | ".join( [ md_escape(row.get("role")), md_escape(row.get("rank")), md_escape(row.get("creator")), md_escape(row.get("platform")), md_escape(row.get("profileUrl")), percentage(row.get("similarityScore")), compact_number(row.get("followerCount")), compact_number(row.get("averagePlayCount")), md_escape(region_language), md_escape(row.get("email") or "Not found"), md_escape(row.get("lookupStatus")), ] ) + " |" ) ``` ### Technical Analysis `md_escape()` escapes only the table-column separator (`|`). It does not neutralize: - Carriage returns or line feeds. - Markdown links and images. - Raw HTML. - Backticks or other Markdown formatting characters. - Control characters. - Unsafe URL schemes presented as links. Several report fields originate from API responses, including creator names, profile URLs, regions, languages, and email values. If malicious or compromised upstream profile metadata includes newline characters or Markdown/HTML syntax, it can escape the intended table cell and alter the rendered report. This is a content-injection issue rather than direct code execution. The effect depends on the Markdown renderer and downstream consumer. Renderers that permit raw HTML or remote images can i ...[truncated 1445 chars]
Remediation
View remediation
`, and `&` if reports may be rendered by engines that support raw HTML. 4. Validate profile URLs separately and allow only `https` URLs on approved social-platform hostnames. 5. Avoid turning untrusted text into clickable links unless the URL has passed strict scheme and hostname validation. 6. Consider producing plain-text table cells or using a Markdown library with safe serialization. 7. Test payloads containing newlines, raw HTML, images, links, and nested Markdown formatting. A minimal cell-sanitization layer could begin as follows: ```python import html import re _CONTROL_CHARS = re.compile(r"[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]") _MARKDOWN_CHARS = re.compile(r"([\\`*_[\]{}()#+.!|>-])") def md_escape(value: Any) -> str: text = str(value if value not in (None, "") else "—") text = text.replace("\r", " ").replace("\n", " ") text = _CONTROL_CHARS.sub("", text) text = html.escape(text, quote=True) return _MARKDOWN_CHARS.sub(r"\\\1", text) ``` The final escaping rules should be verified against the specific Markdown renderers used by consumers of the generated report. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README advertises several overlapping triggers—KOL research, creator email lookup, similar-creator discovery, outreach-list building, YouTube search, trend discovery, channel research, and SERP analysis—without clear activation boundaries. In an agent environment, this ambiguity can cause the skill to be invoked for broader research tasks than intended, increasing the chance of unnecessary contact-data collection or use of external enrichment APIs when a narrower, less sensitive tool would suffice.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README explicitly states that the skill can find verified creator emails and return an outreach-ready contact table, but it does not warn users or operators that it collects and surfaces personal/business contact data. In context, this makes misuse more likely because agents may treat contact enrichment as routine research output instead of a sensitive action requiring notice, minimization, and policy checks.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill requires environment access, network access, and file output but does not declare an explicit tool/permission scope. In a permissive harness, this can cause the agent to run with broader capabilities than the user expects, increasing the chance of unintended API use, contact-data retrieval, or local file writes without clear consent boundaries.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The document explicitly describes retrieval and return of primary emails, all unique emails, and external contact links, but provides no privacy, consent, or acceptable-use guidance. In a skill designed for influencer prospecting and outreach-list building, this increases the likelihood of bulk collection or misuse of personal contact data in ways that may violate privacy expectations, platform terms, or internal data-handling policies.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 179)May include surrounding context.

md
from typing import Any


API_BASE = "https://api.aisa.one/apis/v1"
EMAIL_LOOKUP_PATH = "/waveinflu/email-lookup"
SIMILAR_PATH = "/waveinflu/similar"
USER_AGENT = "AIsa KOL Creator Discovery Skill/1.0"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · references/api-reference.md (reported line 8)May include surrounding context.

md
from typing import Any


API_BASE = "https://api.aisa.one/apis/v1"
EMAIL_LOOKUP_PATH = "/waveinflu/email-lookup"
SIMILAR_PATH = "/waveinflu/similar"
USER_AGENT = "AIsa KOL Creator Discovery Skill/1.0"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · scripts/kol_creator_discovery.py (reported line 19)May include surrounding context.

python
from typing import Any


API_BASE = "https://api.aisa.one/apis/v1"
EMAIL_LOOKUP_PATH = "/waveinflu/email-lookup"
SIMILAR_PATH = "/waveinflu/similar"
USER_AGENT = "AIsa KOL Creator Discovery Skill/1.0"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill sends creator profile URLs to a third-party API to perform email lookup and enrichment, which is privacy-sensitive processing of contact and profile data. In this skill context that behavior is expected business logic, but the absence of explicit user-facing notice/consent and data-handling disclosure increases compliance and privacy risk, especially when processing third-party personal data at scale.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The generated Markdown/JSON outputs can contain discovered email addresses and are written to local disk without any warning, masking, or storage controls. In this skill's outreach-list context, local persistence of personal contact data is expected functionality, but it still creates privacy and secondary exposure risk if files are stored insecurely, shared broadly, or retained longer than necessary.

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 · scripts/kol_creator_discovery.py (reported line 167)May include surrounding context.

python
("min_average_views", "minVideosAverageViews"),
        ("max_average_views", "maxVideosAverageViews"),
    ):
        value = getattr(args, arg_name, None)
        if value is not None:
            filters[api_name] = value
    if filters:

Static analysis

No suspicious patterns detected.