Back to skill

Security audit

每日签到自动领取

Security checks for vulnerabilities and agentic risk

Overview

This check-in tool needs review because its login cleanup can close unrelated programs and its request previews can expose account credentials.

Have login cleanup restricted to the browser process this tool created before using that flow. Keep certificate verification enabled. Enter credentials locally and redact all secrets from captured requests, previews, logs, and chat. Protect config.json and browser-profile, and enable only intended sites and schedules. Inspection covered the full bundle, with isolated synthetic checks; live browser and service behavior remain untested.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (15)

Tainted flow: 'sid' from input (line 54, user input) → subprocess.run (code execution)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

External input (network, user) flows to a code execution sink. This enables remote code execution or command injection.

Content

Scanner excerpt · scripts/add_site.py (reported line 150)May include surrounding context.

python
if ask_yes("现在立即测试一次?"):
        import subprocess
        subprocess.run([sys.executable, str(BASE_DIR / "claim.py"), "--config", str(path), "--site", sid])

    return 0

The instruction to share a captured request warns only about Cookies, leaving other credentials and private payload data exposed.

High
Category
Output Handling
Confidence
98% confidence
Finding

The guide instructs users to share a complete captured request after removing only Cookie data, although it explicitly discusses Authorization tokens and other authentication headers elsewhere. Following this advice can expose reusable credentials, signed URLs, or private request bodies to the assistant service or anyone receiving the capture.

Content

No source excerpt is available for this finding.

The guide mandates Beijing time regardless of the user's system timezone without offering a choice or explaining a regional requirement.

Medium
Category
Output Handling
Confidence
90% confidence
Finding

The guide explicitly forces all time calculations to Beijing time, overriding the system timezone. It provides neither user opt-in nor a justification tying this locale constraint to the target sites' requirements.

Content

No source excerpt is available for this finding.

The troubleshooting instructions disable TLS certificate verification without warning about the security consequences.

Medium
Category
Output Handling
Confidence
99% confidence
Finding

The troubleshooting table recommends disabling certificate verification as a routine fix without explaining the loss of server authentication. For authenticated check-in requests, this can let an attacker controlling the network intercept session credentials or alter responses.

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/add_site.py (reported line 150)May include surrounding context.

python
if ask_yes("现在立即测试一次?"):
        import subprocess
        subprocess.run([sys.executable, str(BASE_DIR / "claim.py"), "--config", str(path), "--site", sid])

    return 0

Terminates a process tree without disclosing that behavior to the user.

Medium
Category
Output Handling
Confidence
92% confidence
Finding

The login workflow calls kill_tree on a fixed port before launching its dedicated browser, without establishing that any existing listener belongs to this workflow. Port-based termination can consequently disrupt an unrelated process and its children, potentially losing unsaved work; the login description does not disclose that side effect.

Content

No source excerpt is available for this finding.

Internal Network Request

Medium
Category
Server-Side Request Forgery
Confidence
70% confidence
Finding

Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Content

Scanner excerpt · scripts/cdp.py (reported line 122)May include surrounding context.

python
self.port = port

    def _get(self, path):
        return json.loads(urllib.request.urlopen(
            f"<redacted-url>}", timeout=10).read())

    def page_ws(self, url=None, timeout=30):

Internal Network Request

Medium
Category
Server-Side Request Forgery
Confidence
70% confidence
Finding

Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Content

Scanner excerpt · scripts/cdp.py (reported line 128)May include surrounding context.

python
def page_ws(self, url=None, timeout=30):
        """拿到一个 page target 的 ws 地址;必要时新开一个。"""
        if url:
            req = urllib.request.Request(
                f"<redacted-url>, safe=':/?=&')}",
                method="PUT")
            try:

The module's explicit three-operation scope excludes its cookie-extraction capability.

Medium
Category
Excessive Agency
Confidence
94% confidence
Finding

L003 explicitly says the module implements only connecting to a page target, sending Runtime.evaluate, and reading results. However, L160–L165 separately invoke Network.getCookies and return cookie records, defaulting to WorkBuddy URLs; this exposes authentication-sensitive data beyond the expressly documented operations.

Content

No source excerpt is available for this finding.

Browser cookies are retrieved without disclosure that sensitive session credentials may be accessed.

Medium
Category
Output Handling
Confidence
90% confidence
Finding

The cookies method retrieves browser cookies through Network.getCookies, which can include authentication and session credentials. Unlike page creation and process termination, this sensitive operation has no explanatory docstring, comment, prompt, or user-facing log, and the module description only mentions connecting to page targets and evaluating expressions.

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/cdp.py (reported line 181)May include surrounding context.

python
kwargs = {}
    if os.name == "nt":
        kwargs["creationflags"] = 0x00000008 | 0x00000200  # DETACHED | NEW_GROUP
    p = subprocess.Popen(args, stdout=subprocess.DEVNULL,
                         stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL, **kwargs)
    return p

Internal Network Request

Medium
Category
Server-Side Request Forgery
Confidence
70% confidence
Finding

Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Content

Scanner excerpt · scripts/cdp.py (reported line 190)May include surrounding context.

python
deadline = time.time() + timeout
    while time.time() < deadline:
        try:
            urllib.request.urlopen(f"<redacted-url>", timeout=2).read()
            return True
        except Exception:
            time.sleep(1)

kill_tree claims graceful Browser.close shutdown but never sends that command.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The purported graceful shutdown never sends Browser.close and instead attempts a WebSocket upgrade against an HTTP metadata endpoint. With a normal CDP server this fails and leads to forced process-tree termination, creating avoidable data-loss and availability risks rather than the documented graceful behavior.

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/cdp.py (reported line 206)May include surrounding context.

python
pass
    try:
        import subprocess
        out = subprocess.run(["netstat", "-ano"], capture_output=True, text=True).stdout
        pids = set()
        for line in out.splitlines():
            if f":{port}" in line and "LISTENING" in line:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
98% confidence
Finding

The code forcibly terminates a process and all its children based only on a substring match against netstat output. It does not verify browser or profile ownership, and the match can also select other ports containing the requested port text, causing unrelated process termination and data loss.

Content

Scanner excerpt · scripts/cdp.py (reported line 212)May include surrounding context.

python
if f":{port}" in line and "LISTENING" in line:
                pids.add(line.split()[-1])
        for pid in pids:
            subprocess.run(["taskkill", "/PID", pid, "/T", "/F"], capture_output=True)
    except Exception:
        pass