Back to skill

Security audit

Social Recruit Page

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly does what it says, but local poster generation can render unescaped user content in Chromium and make undeclared network requests, so it should be reviewed before installation.

Install only if you are comfortable with a skill that runs Playwright/Chromium locally and can contact external services. Treat config content as trusted input, avoid pasting untrusted HTML, and use Feishu sending only when you intentionally want the generated image uploaded and posted with the supplied app credentials.

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/generate.py:38
Finding

Untrusted configuration values are rendered as active HTML in Chromium

Content
View full analysis
{t}' for t in f_tags) services_html = "" for i, s in enumerate(services, 1): services_html += f"""
0{i}

{s['title']}

{s.get('tag','')}

{s['desc']}

""" who_html = "" for w in for_who: who_html += f"""
{w['icon']}

{w['title']}

{w['desc']}

""" perks_html = "".join(f"
  • {p}
  • " for p in perks) ``` The generated document is subsequently opened by Chromium: ```python def screenshot(html_content: str, output_path: str) -> bool: with tempfile.NamedTemporaryFile( mode="w", suffix=".html", delete=False, encoding="utf-8" ) as f: f.write(html_content) tmp = f.name try: r = subprocess.run( ["playwright", "screenshot", "--browser", "chromium", "--full-page", "--viewport-size", "750,900", f"file://{tmp}", output_path], capture_output=True, text=True, timeout=60 ) ``` ### Technical Analysis Configuration values are inserted directly into an HTML document without contextual escaping or sanitization. This applies to scalar fields and nested fields such as founder tags, service titles and descriptions, target-audience entries, and perks. Although some fields intentionally support limited markup such as `` and `
    `, the implementation does not enforce such an allowlist. An attacker who can create or influence the configuration can insert ...[truncated 2149 chars]
    Remediation
    View remediation
    ` and `
    `. Reject: - Script and style elements - Iframes and embedded objects - Event-handler attributes - URL-bearing elements and attributes - Arbitrary CSS 3. Validate the JSON schema before rendering. Enforce expected types, maximum lengths, collection sizes, and allowed values. 4. Disable network access for the rendering process where possible. Alternatively, intercept Chromium requests and permit only local resources required for poster generation. 5. Run Chromium in a restricted environment with: - No access to sensitive internal networks - A read-only filesystem except for dedicated temporary and output directories - No unnecessary host credentials - Current browser security updates and sandboxing enabled 6. Add security tests using payloads containing `

    other

    Note
    Location
    scripts/generate.py:70
    Finding

    Poster generation performs an unnecessary external request to Google Fonts

    Content
    View full analysis
    Remediation
    View remediation
    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 (16)

    Undeclared Tool Scope

    Medium
    Category
    MCP Least Privilege
    Confidence
    88% confidence
    Finding

    The skill documents code paths that use both shell execution and network access, but the manifest does not declare any tool scope or permissions boundaries. This creates an implicit capability expansion where a caller may invoke behavior that sends data externally or runs local commands without clear policy review or user expectation.

    Content

    No source excerpt is available for this finding.

    Vague Triggers

    Medium
    Category
    Not specified by scanner
    Confidence
    91% confidence
    Finding

    The trigger language is broad enough that the skill may activate on loosely related requests about private clubs, paid communities, or recruitment materials. Over-broad activation can cause unintended execution of code with shell/network side effects, increasing the chance of accidental data handling or external transmission in contexts the user did not clearly request.

    Content

    No source excerpt is available for this finding.

    Missing User Warnings

    Medium
    Category
    Not specified by scanner
    Confidence
    90% confidence
    Finding

    The documentation promotes a one-step generate-and-send flow to Feishu without a clear warning that user-provided content will be transmitted to an external service. This can lead to unintentional disclosure of private branding, pricing, membership, or contact information if users assume the skill operates locally only.

    Content

    No source excerpt is available for this finding.

    Missing User Warnings

    Medium
    Category
    Not specified by scanner
    Confidence
    87% confidence
    Finding

    The manual Feishu flow references reading credentials from a local config file but does not warn about secret handling, storage location sensitivity, or the risks of using ambient credentials. This can encourage insecure operational patterns where the skill silently consumes reusable tokens or app secrets without clear user consent or least-privilege controls.

    Content

    No source excerpt is available for this finding.

    Natural-Language Policy Violations

    Medium
    Category
    Not specified by scanner
    Confidence
    96% confidence
    Finding

    The document declares lang="zh-CN", which hard-codes a specific language/locale for the skill output. Under the policy, locale-specific behavior should either be user-selectable or clearly justified as region-specific; neither is evident in this file.

    Content

    No source excerpt is available for this finding.

    Description-Behavior Mismatch

    Medium
    Category
    Not specified by scanner
    Confidence
    95% confidence
    Finding

    The manifest says the skill supports custom brand name, founder, service content, pricing, and seat quota, but this template only parameterizes a few hero fields while hard-coding founder identity, founder credentials, service descriptions, pricing amount, quota, CTA text, and footer branding. That means the implemented template does not actually provide the broad customization scope the skill description claims.

    Content

    No source excerpt is available for this finding.

    subprocess module call

    Medium
    Category
    Dangerous Code Execution
    Confidence
    72% confidence
    Finding

    The script renders attacker-controlled HTML content with Playwright/Chromium, and the generated HTML imports remote resources from Google Fonts. Because user-provided fields are interpolated directly into HTML without escaping, an attacker could inject markup that triggers external requests or active browser behavior during rendering, causing SSRF-like network access, data exfiltration, or unsafe local file interactions in the headless browser context.

    Content

    Scanner excerpt · scripts/generate.py (reported line 211)May include surrounding context.

    python
    f.write(html_content)
            tmp = f.name
        try:
            r = subprocess.run(
                ["playwright", "screenshot", "--browser", "chromium",
                 "--full-page", "--viewport-size", "750,900",
                 f"file://{tmp}", output_path],
    

    Missing User Warnings

    Medium
    Category
    Not specified by scanner
    Confidence
    91% confidence
    Finding

    This code sends generated content and identifiers to Feishu over the network, including authentication credentials and the rendered image, but provides no confirmation prompt and no clear disclosure in code comments or docstrings about the outbound transmission. Although the feature name suggests sending, the safety criteria still call for some visible disclosure for network transmission of user or system data.

    Content

    No source excerpt is available for this finding.

    subprocess module call

    Medium
    Category
    Dangerous Code Execution
    Confidence
    70% confidence
    Finding

    subprocess module calls execute external commands. Without careful input validation, this enables command injection.

    Content

    Scanner excerpt · scripts/generate.py (reported line 241)May include surrounding context.

    python
    print("[错误] 获取飞书 token 失败", file=sys.stderr); return False
    
        # 上传图片
        up = subprocess.run(
            ["curl", "-s", "-X", "POST", "https://open.feishu.cn/open-apis/im/v1/images",
             "-H", f"Authorization: Bearer {token}",
             "-F", "image_type=message", "-F", f"image=@{image_path}"],
    

    Description-Behavior Mismatch

    Low
    Category
    Not specified by scanner
    Confidence
    80% confidence
    Finding

    The manifest presents the skill as generating and sending a recruit image, but the documentation also states that it reads Feishu credentials from a local config file as an implicit side effect. Accessing local secrets outside clearly declared inputs increases the risk of unintended secret use and weakens transparency around what local data the skill can consume.

    Content

    No source excerpt is available for this finding.

    Context-Inappropriate Capability

    Low
    Category
    Not specified by scanner
    Confidence
    83% confidence
    Finding

    Reading Feishu credentials from ~/.openclaw/openclaw.json is broader than necessary for an image-generation skill and is not clearly tied to the minimal stated purpose. Even if intended for convenience, implicit access to a general local config store can expose unrelated credentials or normalize secret harvesting behavior in reusable skills.

    Content

    No source excerpt is available for this finding.

    Natural-Language Policy Violations

    Low
    Category
    Not specified by scanner
    Confidence
    78% confidence
    Finding

    The output hard-codes lang="zh-CN", and the surrounding user-facing text is also fixed in Chinese, which constitutes a language/locale constraint embedded in the skill. There is no opt-in, alternative locale support, or documentation that this is intentionally limited to a China-specific use case.

    Content

    No source excerpt is available for this finding.

    Missing User Warnings

    Low
    Category
    Not specified by scanner
    Confidence
    83% confidence
    Finding

    The function consumes app_id and app_secret to obtain an access token, which is a sensitive credential-handling operation. The file has no warning, docstring, or comment advising users that credentials are being transmitted to an external API or that they should be handled carefully.

    Content

    No source excerpt is available for this finding.

    Natural-Language Policy Violations

    Low
    Category
    Not specified by scanner
    Confidence
    92% confidence
    Finding

    The manifest description and introductory content require Chinese comprehension, but the file does not state that the skill is Chinese-only or provide any user language choice. This can violate a language/locale policy when skills are expected to be usable without forcing a specific language absent opt-in or justification.

    Content

    No source excerpt is available for this finding.

    Description-Behavior Mismatch

    Low
    Category
    Not specified by scanner
    Confidence
    89% confidence
    Finding

    The skill documentation states that Feishu credentials may be read from a local OpenClaw config file, which introduces implicit access to local secrets beyond the user's immediate prompt. Even if used only for message delivery, silently sourcing credentials from disk expands the skill's privilege boundary and could enable unintended secret use or disclosure if the script or surrounding agent behavior is compromised.

    Content

    No source excerpt is available for this finding.

    Context-Inappropriate Capability

    Low
    Category
    Not specified by scanner
    Confidence
    84% confidence
    Finding

    Reading a local credential file is not strictly necessary for the core task of generating a recruitment image, so this adds capability unrelated to image creation. Unnecessary secret access increases attack surface and makes the skill more dangerous in an agent setting, where users may not expect a 'poster generator' to inspect local configuration files.

    Content

    No source excerpt is available for this finding.

    Static analysis

    No suspicious patterns detected.