Back to skill

Security audit

Heartbeat Ollama Guard

Security checks for vulnerabilities and agentic risk

Overview

This skill is purpose-aligned but installs a persistent service that rewrites OpenClaw configuration and includes unsafe setup and notification handling that users should review carefully.

Install only if you intentionally want an always-running local guard that can overwrite OpenClaw heartbeat configuration. Prefer safer Ollama installation steps instead of curl piped to sh, review the generated guard files, keep heartbeat-guard.conf.json writable only by your user, and use --uninstall if you no longer want the background service.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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
Findings (3)

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:42
Finding
Unverified Remote Installer Is Piped Directly into a Shell<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:42-46`, `generate_readme_cn.py:79-83`, and `heartbeat_ollama_guard.py:597-604` **Vulnerability Type**: Remote payload retrieval and execution **Risk Level**: Critical ### Vulnerable Code `SKILL.md:42-46`: ```bash **Linux:** ```bash curl -fsSL https://ollama.com/install.sh | sh ``` ``` `generate_readme_cn.py:79-83`: ```python p2 = doc.add_paragraph(style="List Bullet") p2.add_run("Linux:").bold = True p2.add_run(" curl -fsSL https://ollama.com/install.sh | sh") ``` `heartbeat_ollama_guard.py:597-604`: ```python print(" 请先安装 Ollama:") print(" macOS: brew install ollama") print(" 或访问 https://ollama.com 下载") print(" Linux: curl -fsSL https://ollama.com/install.sh | sh") print() print(" 安装完成后,重新运行:") print(" python3 heartbeat_ollama_guard.py --setup") ``` ### Technical Analysis The recommended command downloads a mutable shell script from an external URL and immediately passes its contents to `sh`. It does not pin an immutable release, validate a cryptographic checksum or signature, save the script for inspection, or verify the effective payload before execution. The Python files do not automatically execute this command: `generate_readme_cn.py` embeds it in generated documentation, while `heartbeat_ollama_guard.py` prints it when Ollama is missing. Nevertheless, users are explicitly instructed to execute the command as part of the installation process. HTTPS protects the connection in transit but does not establish that future content returned by the URL is identical to the content reviewed during this audit. Compromise of the hosting service, its deployment process, DNS or certificate trust chain, or the installer itself could change the executed payload after publication. The destination is the official-looking Ollama domain and is relevant to the Skill's declared functionality. No unrelated remote destination was identified. However, direct remote-to-shell execu ...[truncated 1234 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the `curl | sh` instruction from all documentation and generated output. 2. Prefer a signed, versioned operating-system package or an official package-manager workflow. 3. If a standalone installer is unavoidable: - Use an immutable, version-specific release URL. - Download the installer to a local file instead of piping it to a shell. - Verify a publisher-provided cryptographic signature or pinned SHA-256 digest. - Display the source and allow the user to inspect it before execution. - Execute it as a separate, explicit step. 4. Keep the installer unprivileged unless a specific installation action demonstrably requires elevation. 5. Ensure `SKILL.md`, `generate_readme_cn.py`, and the CLI fallback instructions all use the same hardened procedure. A safer pattern is: ```bash curl -fL -o ollama-install.sh '<version-pinned-release-url>' printf '%s %s\n' '<trusted-sha256>' 'ollama-install.sh' | sha256sum -c - less ollama-install.sh sh ollama-install.sh ``` The checksum must be obtained through a trusted, independently authenticated release channel rather than from the same mutable response as the installer. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
heartbeat_ollama_guard.py:99
Finding
Unescaped Notification Data Can Be Interpreted as AppleScript Code<![CDATA[ ## Vulnerability Details **File Location**: `heartbeat_ollama_guard.py:99-111` **Vulnerability Type**: AppleScript code injection **Risk Level**: High ### Vulnerable Code The embedded guard constructs AppleScript source by directly interpolating notification data: ```python def notify(title: str, body: str): """macOS 系统通知(不依赖第三方库)""" script = ( f'display notification "{body}" with title "{title}" ' f'sound name "Basso"' ) try: subprocess.run( ["osascript", "-e", script], capture_output=True, timeout=5 ) except Exception: pass ``` The notification body includes the configurable `expected` value: ```python expected = rule.get("expected") ... notify( "🛡️ OpenClaw 心跳守卫", f"检测到未授权修改并已回滚\n" f"文件: {cfg_path.name}\n" f"改回: {expected}" ) ``` The expected value is initially derived from the command-line model identifier and is stored in the editable guard configuration: ```python target_value = f"{OPENCLAW_PROVIDER_KEY}/{model_id}" for p in instances: protected[str(p)] = { "path": HEARTBEAT_PATH, "expected": target_value } ``` ### Technical Analysis Using an argument array with `subprocess.run` prevents operating-system shell injection, but it does not prevent injection into the language interpreted by `osascript`. The entire `script` argument is AppleScript source code. Neither `title` nor `body` is encoded as an AppleScript string literal. A value containing a quotation mark and valid AppleScript syntax can terminate the intended string and introduce additional statements. The `expected` value can originate from the user-supplied `--model` option or from the locally editable `heartbeat-guard.conf.json` file. The vulnerable code is copied into the generated persistent guard script. Injection is reached when the guard detects a mismatch, rewrites the heartbeat value, and emits a macOS notification. ### Attack Path 1. An atta ...[truncated 1392 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not interpolate data into AppleScript source. 2. Use a fixed AppleScript program and pass the title and body through `argv`: ```python script = ''' on run argv set notificationBody to item 1 of argv set notificationTitle to item 2 of argv display notification notificationBody with title notificationTitle sound name "Basso" end run ''' subprocess.run( ["osascript", "-e", script, body, title], capture_output=True, timeout=5, check=False, ) ``` 3. Validate model identifiers with a conservative allowlist appropriate for Ollama model names. Reject control characters, quotation marks, line breaks, and unexpected scripting metacharacters. 4. Validate the schema and type of every guard configuration field before use. 5. Apply restrictive permissions to `heartbeat-guard.conf.json` and the generated daemon, such as user-read/write only for the configuration and no group/world write access. 6. Add tests using quotation marks, backslashes, newlines, and AppleScript fragments to verify that notification content remains data rather than executable code. ]]>

T06 · System Persistence

Warning
Location
heartbeat_ollama_guard.py:458
Finding
Setup Installs a Cross-Session Persistent Configuration-Rewriting Service<![CDATA[ ## Vulnerability Details **File Location**: `heartbeat_ollama_guard.py:458-547` **Vulnerability Type**: Persistent user service with configuration-write capability **Risk Level**: Medium ### Vulnerable Code The generated macOS LaunchAgent is configured to run at login and remain alive: ```python PLIST_CONTENT = """\ ... <key>ProgramArguments</key> <array> <string>/usr/bin/python3</string> <string>{guard_script}</string> </array> <key>KeepAlive</key> <true/> <key>RunAtLoad</key> <true/> ... """ ``` The Linux service is configured to restart and is installed into the default user target: ```python SYSTEMD_CONTENT = """\ [Unit] Description=OpenClaw Heartbeat Guard After=network.target [Service] Type=simple ExecStart=/usr/bin/python3 {guard_script} Restart=always RestartSec=10 StandardOutput=append:{lib_dir}/heartbeat-guard-stdout.log StandardError=append:{lib_dir}/heartbeat-guard-stderr.log [Install] WantedBy=default.target """ ``` Setup writes and enables the service: ```python def deploy_systemd() -> bool: SYSTEMD_SERVICE.parent.mkdir(parents=True, exist_ok=True) content = SYSTEMD_CONTENT.format( guard_script=GUARD_SCRIPT, lib_dir=LIB_DIR, ) try: SYSTEMD_SERVICE.write_text(content) except Exception as e: print(f" [ERROR] 写 systemd service 失败: {e}") return False run(["systemctl", "--user", "daemon-reload"], capture_output=True) run(["systemctl", "--user", "enable", "openclaw-heartbeat-guard"], capture_output=True) r = run(["systemctl", "--user", "start", "openclaw-heartbeat-guard"], capture_output=True) return r.returncode == 0 ``` The persistent daemon periodically rewrites configured JSON paths when their values differ: ```python actual = get_nested(cfg_data, dot_path) if actual == expected: continue set_nested(cfg_data, dot_path, expected) if save_json(cfg_path, cfg_data): log(f"[REVERT] 已回滚 {cfg_path.name} {dot_path} → {expecte ...[truncated 2432 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Separate the one-time heartbeat configuration from persistent guard installation. 2. Require an explicit, informed opt-in before creating a LaunchAgent or systemd service. 3. Display the exact script, service definition, target files, polling behavior, and uninstall procedure before installation. 4. Provide a nonpersistent `--check` or scheduled on-demand mode for users who do not need continuous enforcement. 5. Create the daemon and configuration with restrictive permissions and verify that neither is group- nor world-writable. 6. Validate and constrain configured target paths: - Resolve paths canonically. - Restrict targets to discovered OpenClaw configuration files. - Restrict the protected dotted path to `agents.defaults.heartbeat.model`. 7. Consider integrity verification for the generated daemon before each service start. 8. Use atomic writes for configuration updates to reduce corruption risk. 9. Complete Linux cleanup by invoking `systemctl --user daemon-reload` after deleting the service and optionally `systemctl --user reset-failed`. 10. Offer an explicit restoration option for backed-up `openclaw.json` files during uninstall while preserving the current default only after clear confirmation. ]]>
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (34)

External Script Fetching

High
Category
Supply Chain
Content
**Linux:**
```bash
curl -fsSL https://ollama.com/install.sh | sh
```

---
Confidence
98% confidence
Finding
The documentation instructs users to fetch and execute a remote shell script directly from the internet using curl piped to sh. This is dangerous because any compromise of the remote server, DNS/TLS interception, or malicious upstream change results in immediate arbitrary code execution on the user's machine.

Chaining Abuse

High
Category
Tool Misuse
Content
**Linux:**
```bash
curl -fsSL https://ollama.com/install.sh | sh
```

---
Confidence
97% confidence
Finding
The '| sh' construct is a classic command-chaining risk because it turns downloaded content into immediate code execution without verification or review. In this skill's context, the danger is amplified because the command is presented as a normal setup step, increasing the chance that users execute it reflexively.

External Script Fetching

High
Category
Supply Chain
Content
p2 = doc.add_paragraph(style="List Bullet")
    p2.add_run("Linux:").bold = True
    p2.add_run("  curl -fsSL https://ollama.com/install.sh | sh")

    doc.add_paragraph()
    doc.add_paragraph("第二步:运行安装向导")
Confidence
95% confidence
Finding
The generated README instructs users to install software by piping a remote script directly into a shell (`curl ... | sh`). This bypasses normal verification and makes users vulnerable to supply-chain compromise, MITM in misconfigured environments, or malicious changes on the remote host, especially because the command is presented as a recommended installation step in a trusted setup guide.

External Script Fetching

High
Category
Supply Chain
Content
print("  请先安装 Ollama:")
        print("    macOS:  brew install ollama")
        print("            或访问 https://ollama.com 下载")
        print("    Linux:  curl -fsSL https://ollama.com/install.sh | sh")
        print()
        print("  安装完成后,重新运行:")
        print("    python3 heartbeat_ollama_guard.py --setup")
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The file forces a single language for all user-facing instructions and safety disclosures, which can violate language/locale policy when no opt-in or alternative language is provided. There is no indication that the skill is intended only for a Chinese-speaking or region-specific audience.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
| 写入 openclaw.json | 仅 `heartbeat.model` + `models.providers.local` 字段 |
| 守卫守护进程 | 纯本地,60s 轮询,**无网络请求** |
| macOS 系统通知 | 仅守卫检测到未授权改动时触发 |
| 不需要 sudo | ✅ |
| 不读取对话内容 | ✅ |
| 不访问外部 API | ✅ |
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Session Persistence

Medium
Category
Rogue Agent
Content
| `~/.openclaw/workspace/.lib/heartbeat-guard.py` | 守卫守护进程脚本 |
| `~/.openclaw/workspace/.lib/heartbeat-guard.conf.json` | 守卫授权配置 |
| `~/.openclaw/workspace/.lib/heartbeat-guard.log` | 守卫运行日志 |
| `~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist` | macOS LaunchAgent |
| `~/.config/systemd/user/openclaw-heartbeat-guard.service` | Linux systemd |
| `~/.openclaw/workspace/.lib/.hog_backups/` | openclaw.json 备份 |
Confidence
90% confidence
Finding
The skill installs persistent user-level background execution via LaunchAgent/systemd to monitor and overwrite configuration changes every 60 seconds. Persistence is security-relevant because it survives the initial run, continues modifying files without fresh user consent, and can be repurposed or abused if the installed script or config is later tampered with.

Vague Triggers

Medium
Confidence
76% confidence
Finding
This manifest describes broad capabilities such as '一键安装' and automatic configuration/guard behavior, but does not specify explicit invocation conditions, boundaries, or exclusion cases. In a manifest file, this lack of trigger specificity can make it unclear when the skill should be selected versus other system-management skills.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The module docstring explicitly states it generates a Chinese README, and the document content is written in Chinese throughout. Under the policy, forcing a specific language without user opt-in or a documented justification is a natural-language policy concern.

Session Persistence

Medium
Category
Rogue Agent
Content
("~/.openclaw/workspace/.lib/heartbeat-guard.py", "守卫守护进程脚本(由安装向导生成)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.conf.json", "守卫授权配置(含所有受保护实例)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.log", "守卫运行日志"),
        ("~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist", "macOS LaunchAgent 配置"),
        ("~/.config/systemd/user/openclaw-heartbeat-guard.service", "Linux systemd 服务"),
        ("~/.openclaw/workspace/.lib/.hog_backups/", "openclaw.json 自动备份目录"),
    ]
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
("~/.openclaw/workspace/.lib/heartbeat-guard.py", "守卫守护进程脚本(由安装向导生成)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.conf.json", "守卫授权配置(含所有受保护实例)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.log", "守卫运行日志"),
        ("~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist", "macOS LaunchAgent 配置"),
        ("~/.config/systemd/user/openclaw-heartbeat-guard.service", "Linux systemd 服务"),
        ("~/.openclaw/workspace/.lib/.hog_backups/", "openclaw.json 自动备份目录"),
    ]
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
("~/.openclaw/workspace/.lib/heartbeat-guard.py", "守卫守护进程脚本(由安装向导生成)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.conf.json", "守卫授权配置(含所有受保护实例)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.log", "守卫运行日志"),
        ("~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist", "macOS LaunchAgent 配置"),
        ("~/.config/systemd/user/openclaw-heartbeat-guard.service", "Linux systemd 服务"),
        ("~/.openclaw/workspace/.lib/.hog_backups/", "openclaw.json 自动备份目录"),
    ]
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
("~/.openclaw/workspace/.lib/heartbeat-guard.py", "守卫守护进程脚本(由安装向导生成)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.conf.json", "守卫授权配置(含所有受保护实例)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.log", "守卫运行日志"),
        ("~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist", "macOS LaunchAgent 配置"),
        ("~/.config/systemd/user/openclaw-heartbeat-guard.service", "Linux systemd 服务"),
        ("~/.openclaw/workspace/.lib/.hog_backups/", "openclaw.json 自动备份目录"),
    ]
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
("~/.openclaw/workspace/.lib/heartbeat-guard.py", "守卫守护进程脚本(由安装向导生成)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.conf.json", "守卫授权配置(含所有受保护实例)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.log", "守卫运行日志"),
        ("~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist", "macOS LaunchAgent 配置"),
        ("~/.config/systemd/user/openclaw-heartbeat-guard.service", "Linux systemd 服务"),
        ("~/.openclaw/workspace/.lib/.hog_backups/", "openclaw.json 自动备份目录"),
    ]
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
("~/.openclaw/workspace/.lib/heartbeat-guard.py", "守卫守护进程脚本(由安装向导生成)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.conf.json", "守卫授权配置(含所有受保护实例)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.log", "守卫运行日志"),
        ("~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist", "macOS LaunchAgent 配置"),
        ("~/.config/systemd/user/openclaw-heartbeat-guard.service", "Linux systemd 服务"),
        ("~/.openclaw/workspace/.lib/.hog_backups/", "openclaw.json 自动备份目录"),
    ]
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
("~/.openclaw/workspace/.lib/heartbeat-guard.py", "守卫守护进程脚本(由安装向导生成)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.conf.json", "守卫授权配置(含所有受保护实例)"),
        ("~/.openclaw/workspace/.lib/heartbeat-guard.log", "守卫运行日志"),
        ("~/Library/LaunchAgents/com.openclaw.heartbeat-guard.plist", "macOS LaunchAgent 配置"),
        ("~/.config/systemd/user/openclaw-heartbeat-guard.service", "Linux systemd 服务"),
        ("~/.openclaw/workspace/.lib/.hog_backups/", "openclaw.json 自动备份目录"),
    ]
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
This Python skill presents its primary docstring, usage guidance, prompts, status messages, and warnings in Chinese, which imposes a specific language on users. The file does not provide any opt-in, alternative locale, or justification that the skill is intended only for a Chinese-speaking or region-specific environment.

Session Persistence

Medium
Category
Rogue Agent
Content
GUARD_BACKUP_DIR= LIB_DIR / ".hog_backups"

LAUNCHAGENT_LABEL  = "com.openclaw.heartbeat-guard"
LAUNCHAGENT_PLIST  = Path.home() / "Library" / "LaunchAgents" / f"{LAUNCHAGENT_LABEL}.plist"
SYSTEMD_SERVICE    = Path.home() / ".config" / "systemd" / "user" / "openclaw-heartbeat-guard.service"

OPENCLAW_PROVIDER_KEY = "local"
Confidence
90% confidence
Finding
The script is explicitly designed to install persistent user-level components via LaunchAgent or systemd user services, causing code to run automatically after setup. Persistence is security-relevant because it creates a long-lived background process that continuously monitors and rewrites configuration, and users may not fully understand that behavior or be able to easily detect tampering if the script or its config is later modified.

Session Persistence

Medium
Category
Rogue Agent
Content
GUARD_BACKUP_DIR= LIB_DIR / ".hog_backups"

LAUNCHAGENT_LABEL  = "com.openclaw.heartbeat-guard"
LAUNCHAGENT_PLIST  = Path.home() / "Library" / "LaunchAgents" / f"{LAUNCHAGENT_LABEL}.plist"
SYSTEMD_SERVICE    = Path.home() / ".config" / "systemd" / "user" / "openclaw-heartbeat-guard.service"

OPENCLAW_PROVIDER_KEY = "local"
Confidence
90% confidence
Finding
The script is explicitly designed to install persistent user-level components via LaunchAgent or systemd user services, causing code to run automatically after setup. Persistence is security-relevant because it creates a long-lived background process that continuously monitors and rewrites configuration, and users may not fully understand that behavior or be able to easily detect tampering if the script or its config is later modified.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
def run(cmd, **kw) -> subprocess.CompletedProcess:
    return subprocess.run(cmd, **kw)


def get_nested(obj: dict, dotted_path: str):
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Session Persistence

Medium
Category
Rogue Agent
Content
# ── launchagent / systemd ──────────────────────────────────────────────────────

PLIST_CONTENT = """\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Confidence
88% confidence
Finding
The embedded plist content defines a persistent LaunchAgent that will auto-run the guard on login and keep it alive. Even though this appears intended for a defensive use case, persistence materially increases risk if the deployed script or configuration is replaced or abused, because it ensures recurring execution without further user action.

Session Persistence

Medium
Category
Rogue Agent
Content
PLIST_CONTENT = """\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
PLIST_CONTENT = """\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
PLIST_CONTENT = """\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
PLIST_CONTENT = """\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Static analysis

No suspicious patterns detected.