Back to skill

Security audit

perplexity-web-bridge

Security checks for vulnerabilities and agentic risk

Overview

This skill is not plainly malicious, but it can autonomously click and type in a logged-in browser while sending page-derived context to external model services, so it needs careful review.

Install only if you are comfortable with a generic autonomous browser controller using your logged-in web sessions. Restrict use to low-risk sites or dedicated browser profiles, avoid accounts where one click can purchase, delete, publish, or change permissions, and only set JEZW_ESCALER_URL to a model endpoint you trust with page labels, field values, goals, and action history.

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 (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/jevw-escaler.py:52
Finding

Untrusted webpage content can steer actions in an authenticated browser session

Content
View full analysis

Vulnerability Details

File Location: src/jev_webbridge/table.py:46-69, scripts/jevw-escaler.py:52-84, src/jev_webbridge/loop.py:330-369, src/jev_webbridge/executor.py:139-180
Vulnerability Type: Indirect prompt injection into an autonomous browser-action decision
Risk Level: Medium

Complete Code Snippets

src/jev_webbridge/table.py:46-69 collects attacker-controlled webpage labels and values:

javascript
const els = Array.from(document.querySelectorAll(sel))
  .filter(el => VIS(el) && !el.disabled)
  .filter(el => !(el.closest('[aria-hidden="true"]')));
const rows = [];
const rowEls = [];
els.forEach((el, i) => {
  const ops = OPS(el);
  let name = (el.getAttribute('aria-label') || el.getAttribute('placeholder')
    || el.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 80);
  if (!name && el.id) {
    const lb = document.querySelector('label[for="' + el.id.replace(/"/g, '') + '"]');
    if (lb) name = (lb.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 80);
  }
  let value = null;
  if ('value' in el && typeof el.value === 'string') value = el.value.slice(0, 80);
  else if (el.isContentEditable) value = (el.textContent || '').slice(0, 80);
  const typeable = ops.includes('TYPE_TEXT');
  if (!name && !value && !typeable) return;
  if (!name) name = '(unnamed ' + (el.getAttribute('role') || el.tagName.toLowerCase()) + ')';
  el.setAttribute('data-jw-idx', String(rows.length));
  rowEls.push(el);
  rows.push({idx: rows.length, role: (el.getAttribute('role') || el.tagName.toLowerCase()),
             name, value, ops});
});

scripts/jevw-escaler.py:52-84 places those labels directly into an LLM prompt and converts its response into an executable decision:

python
rows = payload.get("rows") or []
table = "\n".join(
    f"{r.get('idx')} | {r.get('role')} | {(r.get('name') or r.get('value') or '')[:60]
...[truncated 7282 chars]
Remediation
View remediation

Remediation Suggestions

  1. Treat every page-derived field as untrusted data. Serialize element metadata in a clearly delimited structured object and explicitly instruct the decision model that text inside those fields is data, not executable instructions.
  2. Add a deterministic post-escalation validator before executor.act. At minimum, verify that the target exists in the observed rows, that the operation is supported by that row, and that the operation is permitted for the current workflow state.
  3. Add an authorization policy for consequential actions. Require explicit user confirmation before activating controls associated with submission, deletion, payment, publication, permission changes, account changes, or cross-origin navigation.
  4. Bind each run to an allowlisted origin or set of origins. Pause for confirmation when an action would leave the user-approved origin.
  5. Do not default an LLM-selected TYPE_TEXT action to the complete goal text unless the target has been deterministically identified as the intended query field. Require an approved field classification or explicit target binding.
  6. Prefer deterministic site adapters for high-impact workflows rather than allowing a generic LLM to choose among every visible interactive control.
  7. Preserve receipts, but expose the proposed action to the user before execution when a confirmation policy is triggered. Logging after a decision must not be treated as authorization.
  8. Add adversarial tests with instruction-like button labels, placeholders, links, and accessibility labels to verify that page text cannot override goal and origin restrictions.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (64)

Tainted flow: 'req' from os.environ.get (line 40, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
95% confidence
Finding

The script sends sensitive browser-automation context, including the goal, UI element table, recent action history, and an API key in the Authorization header, to a network endpoint whose base URL is controlled by the JEZW_ESCALER_URL environment variable. If that environment variable is influenced by an attacker or misconfigured, the skill can exfiltrate sensitive runtime data and credentials to an arbitrary remote service; in this skill's context, that is especially risky because the payload may contain private page content and control-flow state from escalated browser sessions.

Content

Scanner excerpt · scripts/jevw-escaler.py (reported line 43)May include surrounding context.

python
req = urllib.request.Request(URL, data=body, method="POST",
                                 headers={"Content-Type": "application/json",
                                          "Authorization": f"Bearer {key}"})
    with urllib.request.urlopen(req, timeout=20) as r:
        data = json.loads(r.read())
    return data["choices"][0]["message"]["content"]

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This finding correctly captures that the skill is positioned as Perplexity chat but is actually a generic DOM observation and automation framework with site-agnostic validation goals. That context makes the mismatch more dangerous because the skill can act across authenticated websites, not just within a constrained Perplexity conversation flow.

Content

No source excerpt is available for this finding.

Obfuscated Code

High
Category
Supply Chain
Confidence
50% confidence
Finding

Code contains obfuscation (base64, hex encoding with execution). This is often used to hide malicious functionality.

Content

Scanner excerpt · docs/assets/loop.svg (reported line 1)May include surrounding context.

text
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 940.534px; background-color: white;" viewBox="0 0 940.5340576171875 2042.453125" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#666;stroke:#666;}#my-svg .marker.cross{stroke:#666;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#000000;color:#000000;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#eee;stroke:#999;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .lab
...[truncated 28 chars]

Obfuscated Code

High
Category
Supply Chain
Confidence
50% confidence
Finding

Code contains obfuscation (base64, hex encoding with execution). This is often used to hide malicious functionality.

Content

Scanner excerpt · docs/assets/loop.svg (reported line 1)May include surrounding context.

text
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 940.534px; background-color: white;" viewBox="0 0 940.5340576171875 2042.453125" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#666;stroke:#666;}#my-svg .marker.cross{stroke:#666;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#000000;color:#000000;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#eee;stroke:#999;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .lab
...[truncated 28 chars]

Obfuscated Code

High
Category
Supply Chain
Confidence
50% confidence
Finding

Code contains obfuscation (base64, hex encoding with execution). This is often used to hide malicious functionality.

Content

Scanner excerpt · docs/assets/loop.svg (reported line 1)May include surrounding context.

text
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 940.534px; background-color: white;" viewBox="0 0 940.5340576171875 2042.453125" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#666;stroke:#666;}#my-svg .marker.cross{stroke:#666;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#000000;color:#000000;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#eee;stroke:#999;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .lab
...[truncated 28 chars]

Obfuscated Code

High
Category
Supply Chain
Confidence
50% confidence
Finding

Code contains obfuscation (base64, hex encoding with execution). This is often used to hide malicious functionality.

Content

Scanner excerpt · docs/assets/loop.svg (reported line 1)May include surrounding context.

text
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 940.534px; background-color: white;" viewBox="0 0 940.5340576171875 2042.453125" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#666;stroke:#666;}#my-svg .marker.cross{stroke:#666;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#000000;color:#000000;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#eee;stroke:#999;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .lab
...[truncated 28 chars]

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Confidence
80% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · docs/assets/loop.svg (reported line 1)May include surrounding context.

text
<svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 940.534px; background-color: white;" viewBox="0 0 940.5340576171875 2042.453125" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-th

Static analysis

Detected: suspicious.install_untrusted_source

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
tests/fixtures/probe_states/state_03_gh_tree.json:1

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
tests/fixtures/probe_states/state_04_gh_blob.json:1

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
tests/fixtures/probe_states/state_05_gh_repo.json:1

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
tests/fixtures/snap_thread.json:1