Back to skill

Security audit

line-oa-chat-send

Security checks for vulnerabilities and agentic risk

Overview

This skill is transparent about its browser and login-handoff powers, but it needs review because it can send LINE business messages and has a real recipient-matching flaw plus unpinned dependency execution.

Review before installing in production. Use only with non-sensitive test messages until exact recipient matching is fixed, provision a pinned reviewed Playwright runtime instead of the automatic uv fallback, run the browser under an unprivileged dedicated account, and treat any handoff URL as a short-lived bearer secret to share only with the intended user.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/send_line_oa_chat.py:75
Finding
Substring Recipient Matching Can Send Messages to an Unintended Chat## Vulnerability Details **File Location**: `scripts/send_line_oa_chat.py`, lines 75-92 **Vulnerability Type**: Improper recipient validation caused by substring matching **Risk Level**: Medium ### Vulnerable Code ```python def unique_chat_result(page: Page, recipient: str, timeout_ms: int) -> Locator: # `exact=True` prevents matching the unrelated "輸入搜尋內容" field. search = page.get_by_placeholder("搜尋", exact=True) search.fill(recipient) page.wait_for_timeout(min(timeout_ms, 1000)) # The chat label can be hidden on responsive layouts. Its anchor remains clickable. results = page.locator("mark").filter(has_text=recipient).locator("xpath=ancestor::a") deadline = time.monotonic() + timeout_ms / 1000 while results.count() == 0 and time.monotonic() < deadline: page.wait_for_timeout(200) count = results.count() if count != 1: raise RuntimeError( f"Recipient search for {recipient!r} returned {count} chat candidates; " "do not guess when the recipient is ambiguous." ) return results.first ``` ### Technical Analysis The Skill declares that a message must be sent to an exact, explicitly authorized recipient. However, the result locator uses Playwright's `filter(has_text=recipient)`, which performs text containment rather than exact equality. The code only verifies that one candidate contains the requested text. It does not verify that the complete displayed chat name equals the authorized recipient. Consequently, a unique partial match is treated as an exact match. The `exact=True` argument applies only to locating the search input placeholder and does not make the chat-result comparison exact. ### Attack Path 1. The user authorizes a message to a recipient named `Alice`. 2. The script enters `Alice` in the LINE chat search field. 3. The result set contains one chat named `Alice Support`, but no chat whose complete name is `Alice`. 4. `has_text="Alice"` matches the `Alice ...[truncated 851 chars]
Remediation
## Remediation Suggestions 1. Read the complete displayed recipient label from each result and compare it with the requested recipient using exact equality. 2. Normalize only explicitly accepted presentation differences, such as leading or trailing whitespace. Do not silently apply substring, fuzzy, or case-insensitive matching unless that behavior is separately authorized. 3. Verify the selected chat header again after navigation and before filling or submitting the message. 4. Abort if the exact recipient is absent, even when there is only one partial search result. 5. Add automated tests covering: - A single exact match. - A single partial match such as `Alice Support` for `Alice`. - Multiple partial matches. - Duplicate exact display names. - Names that differ only by whitespace or case. 6. Return a stable identifier or validated chat metadata from the selection function rather than relying only on a text-containing anchor. A hardened pattern should conceptually enforce: ```python candidates = results.all() exact_matches = [ candidate for candidate in candidates if candidate.inner_text().strip() == recipient.strip() ] if len(exact_matches) != 1: raise RuntimeError("Expected exactly one exact recipient match") ``` The exact DOM element containing the authoritative chat name should be used instead of comparing all text within the anchor.

T08 · Insecure Dependencies

Warning
Location
scripts/setup_line_oa_runtime.sh:39
Finding
Unpinned Playwright Dependency Is Downloaded and Executed## Vulnerability Details **File Location**: `scripts/setup_line_oa_runtime.sh`, lines 39-48 **Vulnerability Type**: Unpinned executable dependency and browser download **Risk Level**: Medium ### Vulnerable Code ```bash mkdir -p "$runtime_dir" chmod 700 "$runtime_dir" uv venv "$runtime_dir/venv" uv pip install --python "$runtime_dir/venv/bin/python" playwright chmod 700 "$runtime_dir/venv" browser_dir="$runtime_dir/ms-playwright" if (( install_browser )); then mkdir -p "$browser_dir" chmod 700 "$browser_dir" PLAYWRIGHT_BROWSERS_PATH="$browser_dir" "$runtime_dir/venv/bin/python" -m playwright install chromium fi ``` ### Technical Analysis The setup script installs `playwright` without a version constraint, lockfile, or package hash. Its effective code therefore depends on the latest package version resolved from the configured package index at installation time. The installed package is subsequently imported and executed by the message-sending implementation. If browser installation is enabled, the unpinned package also selects and downloads a Chromium executable. Isolation in a private virtual environment prevents ordinary package conflicts but does not establish package integrity. A malicious or compromised upstream release, package-index compromise, or unsafe alternate index configuration could cause unreviewed code to execute with the operator's account privileges. ### Attack Path 1. An operator runs `scripts/setup_line_oa_runtime.sh --runtime-dir &lt;directory&gt;`. 2. `uv pip install ... playwright` resolves the currently available Playwright distribution from the configured package source. 3. A compromised, malicious, or unexpectedly changed distribution is downloaded and installed without comparison to an approved hash. 4. The package is imported by `scripts/send_line_oa_chat.py` or executed through `python -m playwright install chromium`. 5. The third-party code runs with the Skill operator's permissions. 6. During later Skill operation, th ...[truncated 714 chars]
Remediation
## Remediation Suggestions 1. Pin Playwright to a reviewed version rather than installing the unconstrained package name. 2. Maintain a committed lockfile containing exact versions and cryptographic hashes for Playwright and its transitive dependencies. 3. Install with hash verification and fail closed if the locked artifact is unavailable. 4. Pin and verify the browser revision expected by the reviewed Playwright version. 5. Document the approved package index and reject unexpected index overrides in security-sensitive deployments. 6. Perform dependency updates through a deliberate review process with automated vulnerability and provenance checks. 7. Prefer distribution-provided Chromium where practical, while still pinning and reviewing the Python client dependency. For example, use a locked requirements file and an installation mode equivalent to: ```bash uv pip install \ --python "$runtime_dir/venv/bin/python" \ --require-hashes \ -r requirements.lock ```

T03 · Remote Payload Retrieval and Execution

Warning
Location
scripts/run_line_oa_chat.sh:27
Finding
Normal Launcher Can Implicitly Retrieve and Execute an Unpinned Dependency## Vulnerability Details **File Location**: `scripts/run_line_oa_chat.sh`, lines 27-29 **Vulnerability Type**: Implicit remote dependency resolution during routine execution **Risk Level**: Medium ### Vulnerable Code ```bash if command -v uv >/dev/null 2>&1; then # Creates/reuses uv's managed cache only; does not create a browser profile or handle credentials. exec uv run --no-project --with playwright python "$script_dir/send_line_oa_chat.py" "$@" fi ``` ### Technical Analysis When no existing Python installation with Playwright is found, the normal message launcher invokes `uv run --with playwright`. Because no Playwright version or artifact hash is specified, this path can retrieve and execute the currently resolved package during a routine chat operation. This behavior makes the effective executable payload mutable after review and obscures the trust transition from “run the local Skill” to “download and execute third-party code.” The managed cache does not provide initial provenance or integrity guarantees and may preserve whichever artifact was first resolved. Although this issue overlaps with the setup script's unpinned installation, it is separately significant because it occurs automatically in the normal launcher rather than during an explicit provisioning step. ### Attack Path 1. The host has `uv` installed but lacks a Python environment where `playwright` can be imported. 2. The operator invokes `scripts/run_line_oa_chat.sh`, potentially with `--send`. 3. The launcher automatically executes `uv run --with playwright`. 4. `uv` resolves and may download an unconstrained Playwright package from the configured package source. 5. The package is imported while executing `send_line_oa_chat.py`. 6. Compromised dependency code runs under the operator's identity and can attempt to access the local CDP endpoint or other user-accessible resources. 7. The operator may believe only repository-reviewed code was executed because no explicit setup or dow ...[truncated 597 chars]
Remediation
## Remediation Suggestions 1. Remove automatic `uv run --with playwright` dependency resolution from the normal launcher. 2. Require operators to provision a reviewed, pinned runtime explicitly before any authenticated-browser operation. 3. Fail closed with setup instructions when no approved Playwright runtime is available. 4. If fallback retrieval must remain, pin an exact Playwright version and require lockfile/hash verification. 5. Clearly notify the operator before any network retrieval and require explicit opt-in. 6. Record and expose the resolved dependency version for auditability without logging browser or authentication secrets. 7. Keep dependency installation separate from message authorization and execution so a package update cannot occur implicitly in the same operation as an external message send.
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (55)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description is about runtime behavior for sending LINE Official Account messages via Chromium with optional noVNC-assisted login. The supplied code does not implement messaging, Chromium session control, LINE interaction, authentication handoff, or browser automation. Instead, it is an infrastructure/build script for constructing Docker image variants. That is a materially different primary purpose, so this is a clear description-behavior mismatch.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description focuses on a LINE Official Account messaging skill using Chromium and possible noVNC-assisted login. The supplied code chunk has a different purpose: it checks environment variables and CPU architecture compatibility, refuses to run under likely emulation, and then launches the passed command. This is not merely a supporting implementation detail for the declared behavior because, in isolation, the chunk exposes none of the core declared capabilities and instead serves as container runtime enforcement logic. Therefore the code chunk does not accurately represent the declared purpose.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The declared purpose is about sending LINE Official Account messages via a persistent browser session and temporary interactive login handoff. The supplied code does not implement messaging, Chromium control, LINE login, or noVNC handoff. Instead, it performs environment maintenance and cleanup for Docker test artifacts, including removing containers, persistent profile volumes, and optionally images. That is a materially different primary purpose and introduces undeclared capabilities related to Docker resource management.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared purpose is about sending LINE Official Account chat messages via a persistent Chromium session, potentially with a temporary remote noVNC handoff for login/reauthentication. The supplied code does not perform messaging, browser automation, LINE interaction, authentication handoff, or session reuse on a real host profile. Instead, it is infrastructure code for launching isolated Docker test environments with specific variants, mounts, and runtime settings. Its primary behavior is materially different from the declared skill purpose, so this chunk is a mismatch.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description is about sending LINE Official Account messages via a persistent browser session and possibly handing browser control to a user for login. The supplied code does none of that. It is a documentation utility script that finds Markdown files, extracts relative links, checks whether their targets exist, and fails if links are broken. This is a materially different primary purpose and behavior, so the description does not accurately represent the code chunk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The declared description centers on sending authorized LINE Official Account chat messages via a persistent Chromium session, with temporary browser-control handoff for login/reauthentication. The actual code chunk is a measurement utility: it runs baseline and grace-window sweep experiments, starts/stops Chromium and VNC handoff helper scripts, parses timing logs, and writes performance summaries. Although it relates to the same broader LINE/browser handoff ecosystem, its primary purpose is operational benchmarking of the remote handoff/tunnel flow, not message sending or user login execution itself. That is a materially different behavior and includes undeclared capabilities around benchmarking and tunnel exposure management.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared description is about operational LINE OA messaging via Chromium with optional user-interactive login handoff. The supplied code chunk instead only provisions an isolated runtime: it validates arguments, creates a private directory and virtual environment, installs Playwright, and optionally installs Chromium. This is a setup/support script, not the described messaging/login capability. While such setup could support the broader skill, this specific chunk’s actual purpose is materially different from the declared purpose, so it is a mismatch.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
python3 \
      chromium \
      chromium-sandbox \
    && rm -rf /var/lib/apt/lists/*

# Runtime/cache data. Deliberately outside the read-only source mount and
# outside the browser profile.
Confidence
90% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
python3 \
      chromium \
      chromium-sandbox \
    && rm -rf /var/lib/apt/lists/*

# Runtime/cache data. Deliberately outside the read-only source mount and
# outside the browser profile.
Confidence
90% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
python3 \
      chromium \
      chromium-sandbox \
    && rm -rf /var/lib/apt/lists/*

# Runtime/cache data. Deliberately outside the read-only source mount and
# outside the browser profile.
Confidence
90% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
python3 \
      chromium \
      chromium-sandbox \
    && rm -rf /var/lib/apt/lists/*

# Runtime/cache data. Deliberately outside the read-only source mount and
# outside the browser profile.
Confidence
90% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Chaining Abuse

High
Category
Tool Misuse
Content
python3 \
      chromium \
      chromium-sandbox \
    && rm -rf /var/lib/apt/lists/*

# Runtime/cache data. Deliberately outside the read-only source mount and
# outside the browser profile.
Confidence
75% confidence
Finding
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
--skip-browser-install; \
      chown -R lineoa:lineoa "$LINE_OA_SEND_CHAT_RUNTIME_DIR"; \
    fi; \
    rm -f /tmp/uv /tmp/setup_line_oa_runtime.sh

# Present but unauthenticated profile. An empty directory would make this
# variant identical to "full", so Chromium is run once to materialize a real
Confidence
85% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Privileged Container / Container Escape

High
Category
Privilege Escalation
Content
Two further divergences from a real host, both introduced by the container and
neither present on the target:

- `--security-opt seccomp=unconfined`, because Docker's default seccomp filter
  blocks the namespace creation Chromium's zygote needs. This drops the
  container's outer confinement so Chromium can build its own sandbox; the
  browser's sandbox stays intact. Preferred over `--no-sandbox`, which would
Confidence
85% confidence
Finding
Potential security issue detected. Manual review is recommended.

Privileged Container / Container Escape

High
Category
Privilege Escalation
Content
Two further divergences from a real host, both introduced by the container and
neither present on the target:

- `--security-opt seccomp=unconfined`, because Docker's default seccomp filter
  blocks the namespace creation Chromium's zygote needs. This drops the
  container's outer confinement so Chromium can build its own sandbox; the
  browser's sandbox stays intact. Preferred over `--no-sandbox`, which would
Confidence
85% confidence
Finding
Potential security issue detected. Manual review is recommended.

Privileged Container / Container Escape

High
Category
Privilege Escalation
Content
exec docker run --rm ${tty_args[@]+"${tty_args[@]}"} \
  --platform "linux/${host_arch}" \
  --hostname "line-oa-test-${variant}" \
  --security-opt seccomp=unconfined \
  --shm-size=1g \
  -e LINE_OA_CONTAINER_HOST_ARCH="$host_arch" \
  -v "$repo_root:/workspace:ro" \
Confidence
91% confidence
Finding
Running the container with '--security-opt seccomp=unconfined' disables Docker's default seccomp syscall filtering, reducing container isolation and increasing the blast radius if code inside the container is compromised. In this skill's context, the container hosts browser automation and a persistent Chromium profile, so any malicious repository command or browser exploit gains a less-confined execution environment than necessary.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
bash scripts/start_line_oa_chromium.sh >/dev/null 2>&1 || exit 1
  pid=$(grep ^chromium_pid= "$LINE_OA_SEND_CHAT_RUNTIME_DIR/session.env" | cut -d= -f2)
  kill -KILL "$pid" 2>/dev/null || true            # hard kill leaves SingletonLock behind
  sleep 1; rm -f "$LINE_OA_SEND_CHAT_RUNTIME_DIR/session.env"
  pkill -f Xvfb 2>/dev/null || true; sleep 1
  out="$(bash scripts/start_line_oa_chromium.sh 2>&1)" || { echo "$out"; exit 1; }
  grep -qF "Cleared a stale profile lock" <<<"$out"'
Confidence
95% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Chaining Abuse

High
Category
Tool Misuse
Content
bash scripts/start_line_oa_chromium.sh >/dev/null 2>&1 || exit 1
  pid=$(grep ^chromium_pid= "$LINE_OA_SEND_CHAT_RUNTIME_DIR/session.env" | cut -d= -f2)
  kill -KILL "$pid" 2>/dev/null || true            # hard kill leaves SingletonLock behind
  sleep 1; rm -f "$LINE_OA_SEND_CHAT_RUNTIME_DIR/session.env"
  pkill -f Xvfb 2>/dev/null || true; sleep 1
  out="$(bash scripts/start_line_oa_chromium.sh 2>&1)" || { echo "$out"; exit 1; }
  grep -qF "Cleared a stale profile lock" <<<"$out"'
Confidence
75% confidence
Finding
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Credential Access

High
Category
Privilege Escalation
Content
command -v cloudflared >/dev/null 2>&1 || {
  printf 'ERROR: missing handoff dependency: cloudflared\n' >&2
  printf 'Install commands (run by an identity with host package permission; no sudo is invoked by this skill):\n' >&2
  printf '  curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg -o /usr/share/keyrings/cloudflare-main.gpg\n' >&2
  printf '  printf "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\\n" > /etc/apt/sources.list.d/cloudflared.list\n' >&2
  printf '  apt-get update && apt-get install -y cloudflared\n' >&2
  exit 2
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
command -v cloudflared >/dev/null 2>&1 || {
  printf 'ERROR: missing handoff dependency: cloudflared\n' >&2
  printf 'Install commands (run by an identity with host package permission; no sudo is invoked by this skill):\n' >&2
  printf '  curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg -o /usr/share/keyrings/cloudflare-main.gpg\n' >&2
  printf '  printf "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\\n" > /etc/apt/sources.list.d/cloudflared.list\n' >&2
  printf '  apt-get update && apt-get install -y cloudflared\n' >&2
  exit 2
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
command -v cloudflared >/dev/null 2>&1 || {
  printf 'ERROR: missing handoff dependency: cloudflared\n' >&2
  printf 'Install commands (run by an identity with host package permission; no sudo is invoked by this skill):\n' >&2
  printf '  curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg -o /usr/share/keyrings/cloudflare-main.gpg\n' >&2
  printf '  printf "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\\n" > /etc/apt/sources.list.d/cloudflared.list\n' >&2
  printf '  apt-get update && apt-get install -y cloudflared\n' >&2
  exit 2
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
command -v cloudflared >/dev/null 2>&1 || {
  printf 'ERROR: missing handoff dependency: cloudflared\n' >&2
  printf 'Install commands (run by an identity with host package permission; no sudo is invoked by this skill):\n' >&2
  printf '  curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg -o /usr/share/keyrings/cloudflare-main.gpg\n' >&2
  printf '  printf "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\\n" > /etc/apt/sources.list.d/cloudflared.list\n' >&2
  printf '  apt-get update && apt-get install -y cloudflared\n' >&2
  exit 2
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
command -v cloudflared >/dev/null 2>&1 || {
  printf 'ERROR: missing handoff dependency: cloudflared\n' >&2
  printf 'Install commands (run by an identity with host package permission; no sudo is invoked by this skill):\n' >&2
  printf '  curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg -o /usr/share/keyrings/cloudflare-main.gpg\n' >&2
  printf '  printf "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\\n" > /etc/apt/sources.list.d/cloudflared.list\n' >&2
  printf '  apt-get update && apt-get install -y cloudflared\n' >&2
  exit 2
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
command -v cloudflared >/dev/null 2>&1 || {
  printf 'ERROR: missing handoff dependency: cloudflared\n' >&2
  printf 'Install commands (run by an identity with host package permission; no sudo is invoked by this skill):\n' >&2
  printf '  curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg -o /usr/share/keyrings/cloudflare-main.gpg\n' >&2
  printf '  printf "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main\\n" > /etc/apt/sources.list.d/cloudflared.list\n' >&2
  printf '  apt-get update && apt-get install -y cloudflared\n' >&2
  exit 2
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
# left behind here means the next start is not refused as "in use on another
# computer" -- and it is safe precisely because the process is confirmed gone.
if [[ -n "$profile_dir" && -L "$profile_dir/SingletonLock" ]]; then
  rm -f "$profile_dir/SingletonLock" "$profile_dir/SingletonCookie" "$profile_dir/SingletonSocket"
  printf 'Cleared the profile lock left by the stopped session.\n'
fi
Confidence
95% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Static analysis

No suspicious patterns detected.