Back to skill

Security audit

Situation Monitor

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly fits a monitoring and demo purpose, but it bundles high-impact Kubernetes disruption and deletion tooling plus under-scoped data handling that should be reviewed before install.

Install only in a test or tightly controlled environment unless you remove or isolate 02-incidents.sh, restrict Kubernetes credentials to read-only for monitoring, constrain Apify fixture loading to approved files, and set clear retention/permission controls for Redis and local state. Update or review the Node dependency tree before running the Apify actor.

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

Error
Location
main.js:326
Finding

Actor-Controlled Fixture Path Enables Arbitrary Local JSON File Disclosure

Content
View full analysis
0) { await Actor.pushData(incidents); } ``` `main.js:326-332` resolves and reads the path without enforcing an allowed directory: ```javascript async function loadFixtureIncidents(fixturePath) { const absolutePath = path.resolve(__dirname, fixturePath); const payload = JSON.parse(await readFile(absolutePath, 'utf8')); return payload.map((item, index) => ({ id: item.id || item.incident_id || `fixture-${index + 1}`, ...item, })); } ``` ### Technical Analysis `fixturePath` is controlled through actor input, but it is not restricted to `examples/` or to a predefined filename. `path.resolve(__dirname, fixturePath)` canonicalizes traversal sequences but does not prevent the resulting path from escaping the project directory. If the selected file is readable, valid JSON, and contains an array, each object is spread into the resulting incident collection. The collection is subsequently uploaded through `Actor.pushData()`. This turns a local path traversal flaw into a disclosure channel through the Apify dataset. The fallback can be deliberately reached by setting all three live-source flags to `false` while keepi ...[truncated 1597 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/monitoring_the_situation/memory.py:27
Finding

Sensitive Discord and Kubernetes Reports Are Persisted Without Adequate Confidentiality or Expiration Controls

Content
View full analysis
None: self.path = path self.path.parent.mkdir(parents=True, exist_ok=True) def _read(self) -> dict[str, object]: if not self.path.exists(): return {"checkpoints": {}} return json.loads(self.path.read_text()) def _write(self, payload: dict[str, object]) -> None: self.path.write_text(json.dumps(payload, indent=2)) ``` `src/monitoring_the_situation/memory.py:67-82` stores Discord reports in Redis without expiration: ```python class RedisStateStore(StateStore): def __init__(self, url: str) -> None: self.client = Redis.from_url(url, decode_responses=True) def load_latest_report(self) -> SituationReport | None: payload = self.client.get("mts:latest_report") if not payload: return None return SituationReport.from_dict(json.loads(payload)) def save_latest_report(self, report: SituationReport) -> None: self.client.set("mts:latest_report", json.dumps(report.to_dict())) def save_checkpoint(self, key: str, timestamp: datetime) -> None: self.client.hset("mts:checkpoints", key, timestamp.isoformat()) ``` `src/monitoring_the_situation/kubewatch.py:149-179` retains incident records and reports locally or in Redis. The deduplication key expires, but history and latest-report values do not: ```python def record_incident(self, incident: IncidentRecord) -> bool: fingerprint = incident.fingerprint() if self.client: ...[truncated 3798 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (94)

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script includes a direct gcloud container clusters delete ... --quiet path that can destroy the entire GKE cluster without any approval gate or safety check. In the context of a skill described as monitoring, triaging, and approval-gated actions, this grants destructive infrastructure control far beyond stated scope and could cause full service outage and data-loss exposure if triggered.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The destructive cluster deletion path runs with --quiet, suppressing confirmation for an irreversible infrastructure action. This materially increases the chance of accidental or scripted deletion and is especially dangerous because the skill's stated purpose does not justify this level of destructive access.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · README.md (reported line 59)May include surrounding context.

bash
cd /Users/sarahhatcher/Documents/monitoring-the-situation-openclaw
cp .env.example .env
bash scripts/mts --help

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README describes using an incident drill script that injects failures into a live GKE cluster, which is an active disruption capability unrelated to simple monitoring. Even if intended for demos, operational fault injection can cause outages, data loss, or service instability if run against the wrong environment.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding

If the skill can directly execute kubectl against a live Kubernetes cluster via kubeconfig while presenting itself as broader triage/reporting functionality, users may unknowingly grant cluster access to a skill they believe is largely observational. Undeclared live-cluster interaction materially raises the chance of unauthorized changes, secrets exposure, or production impact.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: adm-zip==0.5.16 — 2 advisory(ies): CVE-2026-76845 (adm-zip extraction follows destination symlinks, allowing arbitrary file overwri); CVE-2026-39244 (adm-zip: Crafted ZIP file triggers 4GB memory allocation)

High
Category
Supply Chain
Confidence
91% confidence
Finding

adm-zip 0.5.16 is present as a transitive dependency and the cited classes of issues (ZIP extraction following destination symlinks and memory exhaustion on crafted archives) are plausible and relevant for software that may process downloaded artifacts. In this skill's context, Apify/crawling components can ingest remote content, so malformed ZIP content could become attacker-controlled input and lead to file overwrite or denial of service if this library is exercised.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.6 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

axios 1.13.6 is included transitively and has multiple advisories, including SSRF/proxy-bypass and prototype-pollution-related impact. Because this skill integrates live Discord/Apify intake and outbound network access, any weakness in request routing, proxy honoring, or unsafe object handling can materially increase exposure if attacker-controlled URLs or config are ever used.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: basic-ftp==5.2.0 — 4 advisory(ies): GHSA-6v7q-wjvx-w8wg (basic-ftp: Incomplete CRLF Injection Protection Allows Arbitrary FTP Command Exe); CVE-2026-39983 (basic-ftp has FTP Command Injection via CRLF); CVE-2026-41324 (basic-ftp vulnerable to denial of service via unbounded memory consumption in Cl) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

basic-ftp 5.2.0 is present transitively and its advisory class includes FTP command injection and memory-consumption issues. Exploitability depends on whether attacker-controlled FTP endpoints or path/user input are ever used, but since this stack includes broad network-fetching capability, the dependency represents a credible risk surface rather than a purely theoretical one.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==2.0.2 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: event-stream (Malicious package (credential theft))

High
Category
Supply Chain
Confidence
95% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
80% confidence
Finding

form-data 4.0.5 is flagged for CRLF injection through multipart field names and filenames. This becomes relevant if the skill relays attacker-controlled names/files to upstream services, potentially enabling request smuggling or malformed multipart requests in integrations.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ip-address==10.1.0 — 2 advisory(ies): CVE-2026-69192 (ip-address: Address4 decodes leading-zero octets as decimal while resolvers deco); CVE-2026-42338 (ip-address has XSS in Address6 HTML-emitting methods)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: lodash==4.17.23 — 2 advisory(ies): CVE-2025-13465 (lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and ); CVE-2021-23337 (lodash vulnerable to Code Injection via `_.template` imports key names)

High
Category
Supply Chain
Confidence
80% confidence
Finding

lodash 4.17.23 is associated with known prototype pollution and template/code-injection history. Even as a transitive dependency, this matters in a system that ingests untrusted Discord and incident data, because unsafe deep property operations or templating on attacker-controlled objects can lead to logic manipulation or compromise in surrounding code paths.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.20.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
80% confidence
Finding

ws 8.20.0 has advisories for memory disclosure and memory-exhaustion denial of service. Since the skill description explicitly mentions live Discord activity and likely long-lived network/event connections, a vulnerable WebSocket stack is more operationally relevant than in an offline tool and could expose data or crash the service.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · README.md (reported line 133)May include surrounding context.

md
def fetch_cluster_incidents(
    settings: Settings, namespace: str | None = None
) -> list[IncidentRecord]:
    kubeconfig = settings.resolved_kubeconfig
    if kubeconfig is None or not kubeconfig.exists():
        raise ValueError(
            "No kubeconfig found. Set KUBECONFIG or create .local/kubeconfig."

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · src/monitoring_the_situation/cluster_live.py (reported line 22)May include surrounding context.

python
def fetch_cluster_incidents(
    settings: Settings, namespace: str | None = None
) -> list[IncidentRecord]:
    kubeconfig = settings.resolved_kubeconfig
    if kubeconfig is None or not kubeconfig.exists():
        raise ValueError(
            "No kubeconfig found. Set KUBECONFIG or create .local/kubeconfig."

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · src/monitoring_the_situation/cluster_live.py (reported line 23)May include surrounding context.

python
def fetch_cluster_incidents(
    settings: Settings, namespace: str | None = None
) -> list[IncidentRecord]:
    kubeconfig = settings.resolved_kubeconfig
    if kubeconfig is None or not kubeconfig.exists():
        raise ValueError(
            "No kubeconfig found. Set KUBECONFIG or create .local/kubeconfig."

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
src/monitoring_the_situation/friendli.py:12