Back to skill

Security audit

web-browser

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent browser automation tool, but it also gives agents broad power to capture, store, reuse, and revoke credentials, with some unsafe defaults users should review carefully.

Install only if you intentionally want an agent to help with browser UI testing and credential issuance. For credential tasks, require explicit approval for each service, scope, destination store, and revoke/delete action; prefer Vault, OS keyrings, or provider secret stores over .env/temp files; avoid passing passwords on command lines; do not use the cdp-trace --login path on untrusted or invalid-TLS sites; and pin npm/Playwright tooling before using it with logged-in sessions.

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/cdp-trace.js:103
Finding

TLS Certificate Validation Disabled During Automated Credential Submission

Content
View full analysis

Vulnerability Details

File Location: scripts/cdp-trace.js, lines 45–46, 88–90, and 103–108
Vulnerability Type: Improper certificate validation leading to credential disclosure
Risk Level: Medium

Relevant Code:

javascript
else if (argv[i] === '--login') {
  args.login = takeValue('--login', i);
  i++;
}
javascript
await fillAndSubmit(user, 'text');
await page.waitForTimeout(4000);
await fillAndSubmit(pass, 'password');
javascript
const browser = await chromium.launch({
  headless: false,
  slowMo: 800,
  args: ['--start-maximized']
});
const ctx = await browser.newContext({
  ignoreHTTPSErrors: true,
  viewport: null
});
const page = await ctx.newPage();

console.log(`[1] navigate ${args.url}`);
await page.goto(args.url, {
  waitUntil: 'domcontentloaded',
  timeout: 30000
});

Technical Analysis

The script accepts a target URL and optional credentials through --url and --login. It creates a Playwright browser context with ignoreHTTPSErrors: true, which suppresses TLS certificate validation failures for every destination.

When --login is supplied, the script subsequently locates text/email and password fields in the loaded page and submits the supplied username and password. Therefore, credentials may be entered even when the HTTPS endpoint presents an expired, self-signed, hostname-mismatched, or otherwise untrusted certificate.

This breaks the server-authentication guarantee expected from HTTPS. The browser continues to a page whose identity has not been cryptographically validated, and the automatic login routine treats that page as the intended service.

Attack Path

  1. The user invokes the script with an HTTPS target and the documented credential option:
    bash
    node scripts/cdp-trace.js \
      --url https://target.example/login \
      --parts "app-group" \
      --login user:password
    
  2. A network-positioned attacker intercepts the connection, redirects traffic, or impersonates the ...[truncated 1011 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove ignoreHTTPSErrors: true and use Playwright's secure default:

    javascript
    const ctx = await browser.newContext({ viewport: null });
    
  2. If invalid certificates must be supported for explicitly authorized local development, add a clearly named opt-in flag such as --allow-insecure-tls. Keep certificate validation enabled by default.

  3. Prohibit credential submission whenever insecure TLS mode is active:

    javascript
    if (args.login && args.allowInsecureTls) {
      throw new Error(
        'Credential submission is not allowed when TLS verification is disabled.'
      );
    }
    
  4. Restrict any development-only exception to expected local targets rather than disabling validation globally. Validate the URL scheme and hostname before creating the browser context.

  5. Prefer interactive user authentication or secure secret input over --login user:pass, because command-line arguments may also expose credentials through shell history or process inspection. If programmatic login remains necessary, read the secret from a protected prompt, file descriptor, or secret manager.

  6. Add regression tests confirming that:

    • invalid HTTPS certificates are rejected by default;
    • insecure TLS requires explicit opt-in;
    • --login cannot be combined with insecure TLS mode; and
    • ordinary trusted HTTPS targets continue to work.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (45)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 21)May include surrounding context.

md
| cdp-trace | CDP-based closed shadow DOM cascade diagnosis (DOM.getDocument pierce:true + CSS.getMatchedStylesForNode) | [cdp-trace.md](./cdp-trace.md) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 268)May include surrounding context.

md
| cdp-trace | CDP-based closed shadow DOM cascade diagnosis (DOM.getDocument pierce:true + CSS.getMatchedStylesForNode) | [cdp-trace.md](./cdp-trace.md) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 22)May include surrounding context.

md
issue access key/token/secret → hand off to automation | [credential-issue.md](./credential-issue.md) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 107)May include surrounding context.

md
issue access key/token/secret → hand off to automation | [credential-issue.md](./credential-issue.md) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 152)May include surrounding context.

md
issue access key/token/secret → hand off to automation | [credential-issue.md](./credential-issue.md) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 269)May include surrounding context.

md
issue access key/token/secret → hand off to automation | [credential-issue.md](./credential-issue.md) |

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

This section directs the agent to collect newly issued access keys, tokens, and secrets from the user and then reuse them for automation and persistence. That normalizes transmission of raw secrets through the conversation channel and expands exposure across chat history, agent memory, and downstream tooling.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill broadly institutionalizes storing and reusing secrets across Vault, GitHub secrets, local config files, .env, and other stores as a standard workflow. In context, this creates a powerful credential-harvesting and persistence mechanism that could silently expand an agent's long-term access if misused or compromised.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
87% confidence
Finding

Referencing ~/.docker/config.json as a reuse path points the agent toward a file that may contain registry auth material or credential-helper pointers. While not always raw-secret storage, it is still a sensitive authentication surface and should not be treated as casually inspectable.

Content

Scanner excerpt · credential-issue.md (reported line 204)May include surrounding context.

md
| Service / token type | Primary store (preferred) | Persist command | Reuse path |
|---------------------|---------------------------|-----------------|------------|
| GitHub PAT (classic / fine-grained) | **gh CLI keyring** (OS-native — macOS Keychain / Windows Credential Manager / libsecret) | `echo <token> \| gh auth login --hostname github.com --with-token` | `gh auth token -u <user>` (and Docker uses `~/.docker/config.json` after `docker login` once) |
| GitHub Actions repo/org secret | **GitHub secret store** | `gh secret set <NAME> -b<token>` | Workflow `${{ secrets.NAME }}` |
| AWS access key / secret | **Vault** (preferred) or `~/.aws/credentials` profile | `vault kv put secret/aws/<profile> access_key=... secret_key=...` OR `aws configure --profile <name>` | `AWS_PROFILE=<name>` / `vault kv get -field=secret_key secret/aws/<profile>` |
| Cloudflare R2 S3 token | **Vault** | `vault kv put secret/r2/<bucket> access_key=... secret_key=...` | `vault kv get -field=secret_key secret/r2/<bucket>` |

Credential Access

High
Category
Privilege Escalation
Confidence
94% confidence
Finding

The skill endorses reading from or writing to ~/.aws/credentials, which is a highly sensitive credential store containing reusable cloud keys. In combination with the skill's automation and persistence rules, this materially expands credential access and the blast radius of any agent misuse or compromise.

Content

Scanner excerpt · credential-issue.md (reported line 206)May include surrounding context.

md
|---------------------|---------------------------|-----------------|------------|
| GitHub PAT (classic / fine-grained) | **gh CLI keyring** (OS-native — macOS Keychain / Windows Credential Manager / libsecret) | `echo <token> \| gh auth login --hostname github.com --with-token` | `gh auth token -u <user>` (and Docker uses `~/.docker/config.json` after `docker login` once) |
| GitHub Actions repo/org secret | **GitHub secret store** | `gh secret set <NAME> -b<token>` | Workflow `${{ secrets.NAME }}` |
| AWS access key / secret | **Vault** (preferred) or `~/.aws/credentials` profile | `vault kv put secret/aws/<profile> access_key=... secret_key=...` OR `aws configure --profile <name>` | `AWS_PROFILE=<name>` / `vault kv get -field=secret_key secret/aws/<profile>` |
| Cloudflare R2 S3 token | **Vault** | `vault kv put secret/r2/<bucket> access_key=... secret_key=...` | `vault kv get -field=secret_key secret/r2/<bucket>` |
| OCI API key | **`~/.oci/config`** (CLI-native) | append profile section + `oci_cli_rc` if needed | `OCI_CLI_PROFILE=<name>` |
| Authentik admin token | **Vault** | `vault kv put secret/authentik/<env> token=...` | `vault kv get -field=token secret/authentik/<env>` |

Ssd 3

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill explicitly instructs the agent to extract token values programmatically from web pages after the user authenticates. This turns the agent into an active credential-capture mechanism, which is especially dangerous because the user may authenticate into high-value accounts and the resulting secret is then available to the agent for reuse or exfiltration.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

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

Content

Scanner excerpt · credential-issue.md (reported line 456)May include surrounding context.

md
| `github` / create OAuth app | ❌ UI-only | `https://github.com/settings/developers` | store client id/secret in `vault kv put` |
| `oci` / Customer Secret Key | ❌ console-only | OCI console → User → Customer Secret Keys | rclone/aws-cli S3 config |
| `authentik` / akadmin API token | ✅ (terraform/API) | (only if console needed) | terraform var / `vault kv put` |
| `vsce` (VS Code Marketplace publisher) / issue Azure DevOps PAT for `vsce publish` | ❌ UI-only (Azure DevOps Personal Access Token) | `https://dev.azure.com/<org>/_usersSettings/tokens` — `<org>` is the Azure DevOps organization linked to the Marketplace publisher (if not provided by caller, **ask via AskUserQuestion** before opening the page). Sign in via "Sign in with GitHub" SSO (see "Login provider preference" above). Token scope: `Marketplace > Manage` | `gh secret set VSCE_PAT -R <owner>/<repo>` + local `npx vsce publish --packagePath <vsix> --pat $VSCE_PAT` |
| `ovsx` (Open VSX Registry publisher) / issue Open VSX PAT for `ovsx publish` | ❌ UI-only | `https://open-vsx.org/user-settings/tokens` — sign in via the **GitHub** option (Open VSX is GitHub-SSO native) | `gh secret set OVSX_PAT -R <owner>/<repo>` + local `npx ovsx publish <vsix> -p $OVSX_PAT` |
| any / register a GitHub Secret | ✅ `gh secret set` | (not needed) | — |
| `tailscale` / revoke an auth key | ✅ API revoke available — `DELETE /api/v2/tailnet/:tailnet/keys/:keyID` (requires an access token / fine-grained trust-credential with key-management scope; console-only if no such token is already available) | `https://login.tailscale.com/admin/settings/keys` → sign in → locate the key by its ID/name → delete (fallback when no API token exists) | none (revoke has no follow-up handoff — see "Revoke flow" above) |

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

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

Content

Scanner excerpt · credential-issue.md (reported line 459)May include surrounding context.

md
| `vsce` (VS Code Marketplace publisher) / issue Azure DevOps PAT for `vsce publish` | ❌ UI-only (Azure DevOps Personal Access Token) | `https://dev.azure.com/<org>/_usersSettings/tokens` — `<org>` is the Azure DevOps organization linked to the Marketplace publisher (if not provided by caller, **ask via AskUserQuestion** before opening the page). Sign in via "Sign in with GitHub" SSO (see "Login provider preference" above). Token scope: `Marketplace > Manage` | `gh secret set VSCE_PAT -R <owner>/<repo>` + local `npx vsce publish --packagePath <vsix> --pat $VSCE_PAT` |
| `ovsx` (Open VSX Registry publisher) / issue Open VSX PAT for `ovsx publish` | ❌ UI-only | `https://open-vsx.org/user-settings/tokens` — sign in via the **GitHub** option (Open VSX is GitHub-SSO native) | `gh secret set OVSX_PAT -R <owner>/<repo>` + local `npx ovsx publish <vsix> -p $OVSX_PAT` |
| any / register a GitHub Secret | ✅ `gh secret set` | (not needed) | — |
| `tailscale` / revoke an auth key | ✅ API revoke available — `DELETE /api/v2/tailnet/:tailnet/keys/:keyID` (requires an access token / fine-grained trust-credential with key-management scope; console-only if no such token is already available) | `https://login.tailscale.com/admin/settings/keys` → sign in → locate the key by its ID/name → delete (fallback when no API token exists) | none (revoke has no follow-up handoff — see "Revoke flow" above) |

## Note on GitHub PR image hosting (why R2)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% 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).

Content

Scanner excerpt · credential-issue.md (reported line 459)May include surrounding context.

md
| `vsce` (VS Code Marketplace publisher) / issue Azure DevOps PAT for `vsce publish` | ❌ UI-only (Azure DevOps Personal Access Token) | `https://dev.azure.com/<org>/_usersSettings/tokens` — `<org>` is the Azure DevOps organization linked to the Marketplace publisher (if not provided by caller, **ask via AskUserQuestion** before opening the page). Sign in via "Sign in with GitHub" SSO (see "Login provider preference" above). Token scope: `Marketplace > Manage` | `gh secret set VSCE_PAT -R <owner>/<repo>` + local `npx vsce publish --packagePath <vsix> --pat $VSCE_PAT` |
| `ovsx` (Open VSX Registry publisher) / issue Open VSX PAT for `ovsx publish` | ❌ UI-only | `https://open-vsx.org/user-settings/tokens` — sign in via the **GitHub** option (Open VSX is GitHub-SSO native) | `gh secret set OVSX_PAT -R <owner>/<repo>` + local `npx ovsx publish <vsix> -p $OVSX_PAT` |
| any / register a GitHub Secret | ✅ `gh secret set` | (not needed) | — |
| `tailscale` / revoke an auth key | ✅ API revoke available — `DELETE /api/v2/tailnet/:tailnet/keys/:keyID` (requires an access token / fine-grained trust-credential with key-management scope; console-only if no such token is already available) | `https://login.tailscale.com/admin/settings/keys` → sign in → locate the key by its ID/name → delete (fallback when no API token exists) | none (revoke has no follow-up handoff — see "Revoke flow" above) |

## Note on GitHub PR image hosting (why R2)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The manifest description uses a long 'Use when' trigger list containing broad phrases like 'browser', 'UI check', 'open login screen', and 'service credential'. In a markdown/manifest-scoped trigger description, these terms are not narrowly constrained and could match many ordinary requests, increasing the chance of unintended invocation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
74% confidence
Finding

The skill documents invoking Playwright via an unpinned npx playwright command, which allows the resolved package version to drift over time and can expose executions to unexpected or malicious upstream changes. In a security-sensitive browser automation skill that handles login flows and token issuance, supply-chain uncertainty raises the risk of compromised tooling affecting credential-bearing sessions.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · SKILL.md (reported line 104)May include surrounding context.

md
| # | Don't | Do |
|---|-------|----|
| 1 | Hit a login wall → write "please have finance/ops enter payment details themselves for security" and stop, without asking | Decompose the remaining flow: **payment/credential entry** should be deferred to the user/business owner, but **login + viewing the resulting screen** is often just informational — ask which is actually needed before deciding to stop |
| 2 | Treat "login" and "entering payment info" as one bundled decision to skip together | They are different risk levels. Login-then-observe (e.g., see the real cart/checkout price) does not require entering card/account credentials — only the latter needs deferral |
| 3 | Report a pre-login/promotional price or state as if it were final, without flagging the gap | If the login-gated final screen wasn't verified, explicitly flag it ("actual payment screen not verified — may differ from the listed price") instead of presenting the pre-login figure as authoritative |
| 4 | Assume the backend can't support interactive login without checking | Check chrome-devtools connection + visibility (per `credential-issue.md` "Fresh-login flow") first; if visible, open the page there and have the user sign in in that same window, then continue capturing |

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · SKILL.md (reported line 107)May include surrounding context.

md
| 1 | Hit a login wall → write "please have finance/ops enter payment details themselves for security" and stop, without asking | Decompose the remaining flow: **payment/credential entry** should be deferred to the user/business owner, but **login + viewing the resulting screen** is often just informational — ask which is actually needed before deciding to stop |
| 2 | Treat "login" and "entering payment info" as one bundled decision to skip together | They are different risk levels. Login-then-observe (e.g., see the real cart/checkout price) does not require entering card/account credentials — only the latter needs deferral |
| 3 | Report a pre-login/promotional price or state as if it were final, without flagging the gap | If the login-gated final screen wasn't verified, explicitly flag it ("actual payment screen not verified — may differ from the listed price") instead of presenting the pre-login figure as authoritative |
| 4 | Assume the backend can't support interactive login without checking | Check chrome-devtools connection + visibility (per `credential-issue.md` "Fresh-login flow") first; if visible, open the page there and have the user sign in in that same window, then continue capturing |
| 5 | Decide unilaterally that "this is good enough" when the report's factual accuracy depends on the gated screen | If the gap could make a delivered report/guide factually wrong (e.g., a payment-request report citing a price that turns out incorrect), the stop-vs-continue decision belongs to the user, not the assistant |

### Violation case (2026-07-22, 1st)

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · credential-issue.md (reported line 309)May include surrounding context.

md
| 1 | Hit a login wall → write "please have finance/ops enter payment details themselves for security" and stop, without asking | Decompose the remaining flow: **payment/credential entry** should be deferred to the user/business owner, but **login + viewing the resulting screen** is often just informational — ask which is actually needed before deciding to stop |
| 2 | Treat "login" and "entering payment info" as one bundled decision to skip together | They are different risk levels. Login-then-observe (e.g., see the real cart/checkout price) does not require entering card/account credentials — only the latter needs deferral |
| 3 | Report a pre-login/promotional price or state as if it were final, without flagging the gap | If the login-gated final screen wasn't verified, explicitly flag it ("actual payment screen not verified — may differ from the listed price") instead of presenting the pre-login figure as authoritative |
| 4 | Assume the backend can't support interactive login without checking | Check chrome-devtools connection + visibility (per `credential-issue.md` "Fresh-login flow") first; if visible, open the page there and have the user sign in in that same window, then continue capturing |
| 5 | Decide unilaterally that "this is good enough" when the report's factual accuracy depends on the gated screen | If the gap could make a delivered report/guide factually wrong (e.g., a payment-request report citing a price that turns out incorrect), the stop-vs-continue decision belongs to the user, not the assistant |

### Violation case (2026-07-22, 1st)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The documented Discord flow explicitly says to capture a bot token and write it to a temp file before handing it to subsequent automation, but it does not pair that with a prominent warning about local secret persistence, file permissions, cleanup, or transcript exposure. Writing freshly issued credentials to disk materially increases the risk of token disclosure through other local processes, backups, logs, or later forensic recovery.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file contains conflicting guidance: earlier sections hard-stop on requiring visible, non-headless browser use for interactive verification, while the Tool Priority Matrix says plain/tmux uses Playwright MCP with a headless default. In practice, operators may follow the permissive matrix and run hidden browser sessions during login or verification tasks, reducing user oversight and increasing the chance of unnoticed credential capture or unsafe automation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill explicitly instructs use of DOM.getDocument({ depth: -1, pierce: true }) to enumerate the full DOM tree including closed shadow roots, then extract computed styles and matched CSS rules from internals that are intentionally encapsulated. In a general-purpose browser skill, this meaningfully expands inspection capability beyond normal page-visible interaction and can expose implementation details or sensitive UI internals that component authors expected to be hidden.

Content

No source excerpt is available for this finding.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Content

Scanner excerpt · credential-issue.md (reported line 18)May include surrounding context.

md
| `service` | The provider whose console issues the credential | `google-forms`, `cloudflare-r2`, `github`, `oci`, `aws`, `authentik` |
| `command` | What to issue / do once logged in | `issue Google API OAuth token`, `issue R2 S3 token`, `issue fine-grained PAT`, `revoke <key-id>` (see "Revoke flow" below) |
| `login-url` | Direct URL to the issuance page (when known) | `https://console.cloud.google.com/apis/credentials`, `https://dash.cloudflare.com/?to=/:account/r2/api-tokens` |
| `handoff` | Follow-up automation to run with the issued credential | `gcloud auth print-access-token`, `aws s3 cp`, `gh secret set` |

## Backend selection (Step 0 + credential-specific preference)

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Content

Scanner excerpt · credential-issue.md (reported line 193)May include surrounding context.

md
| `service` | The provider whose console issues the credential | `google-forms`, `cloudflare-r2`, `github`, `oci`, `aws`, `authentik` |
| `command` | What to issue / do once logged in | `issue Google API OAuth token`, `issue R2 S3 token`, `issue fine-grained PAT`, `revoke <key-id>` (see "Revoke flow" below) |
| `login-url` | Direct URL to the issuance page (when known) | `https://console.cloud.google.com/apis/credentials`, `https://dash.cloudflare.com/?to=/:account/r2/api-tokens` |
| `handoff` | Follow-up automation to run with the issued credential | `gcloud auth print-access-token`, `aws s3 cp`, `gh secret set` |

## Backend selection (Step 0 + credential-specific preference)

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Content

Scanner excerpt · credential-issue.md (reported line 450)May include surrounding context.

md
| `service` | The provider whose console issues the credential | `google-forms`, `cloudflare-r2`, `github`, `oci`, `aws`, `authentik` |
| `command` | What to issue / do once logged in | `issue Google API OAuth token`, `issue R2 S3 token`, `issue fine-grained PAT`, `revoke <key-id>` (see "Revoke flow" below) |
| `login-url` | Direct URL to the issuance page (when known) | `https://console.cloud.google.com/apis/credentials`, `https://dash.cloudflare.com/?to=/:account/r2/api-tokens` |
| `handoff` | Follow-up automation to run with the issued credential | `gcloud auth print-access-token`, `aws s3 cp`, `gh secret set` |

## Backend selection (Step 0 + credential-specific preference)

Static analysis

No suspicious patterns detected.