{"data":{"skill":{"slug":"cloudflare-basin","name":"basin","icon":"📦","repo":"https://github.com/cloudflare/skills/tree/a18ffe2a99448ebff262fc87915b0fd14bab9b70/skills/basin","status":"approved","author":"cloudflare","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"d4df0cd0-1bd5-4a0f-8dd5-82158b80d554","skill_id":"d2ea5d9b-ce84-48b0-97df-1bac82aa04cf","version":1,"content_hash":"v3:e406bf64b5db6e514879399e87b346fa7ff7c2fb:d9bd504ac8125ef84820af6815b3a6f3417fb9126614bad68e420f0f01cec4e3:5f6d8e6932924af878f03dfc2caa6d5ea081f832a895fe540e30490336bd2003:736b696c6c732f636c6f7564666c6172652f626173696e:d6208d1cc5e1607b30931a5fb16a2ce5","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"All 70 static matches are false positives involving documentation links, placeholder URLs, legitimate service requests, SQL identifiers, and TypeScript strings. Four semantic risks concern unauthenticated ingestion, an unprotected analytics endpoint, ineffective IP redaction, and a command that prints an API token. No evidence found of prompt injection, malicious exfiltration, or covert code execution in the reviewed files.","remediation":[{"issue":"REST and Terraform examples disable HTTP ingest authentication.","severity":"medium","suggestion":"Enable authentication in both examples and require scoped send tokens; clearly label any intentional public ingestion with abuse and cost controls."},{"issue":"The dashboard Worker returns analytics using server credentials without checking caller identity.","severity":"high","suggestion":"Require verified Cloudflare Access or application authentication and authorization before querying; add request limits and return only approved fields."},{"issue":"The Logpush example claims IP redaction while retaining ClientIP.","severity":"medium","suggestion":"Remove ClientIP from stored output and correct the comment; use keyed pseudonymization where needed and document remaining privacy limitations."},{"issue":"The SQL troubleshooting checklist prints the complete authentication token.","severity":"medium","suggestion":"Replace token echoing with a nonempty-variable check that prints only status; warn against placing credentials in logs or transcripts."}],"risk_factor_evidence":[{"factor":"network","evidence":[{"file":"references/catalog/api.md","line_end":22,"line_start":22},{"file":"references/pipelines/api.md","line_end":14,"line_start":14},{"file":"references/pipelines/api.md","line_end":29,"line_start":29},{"file":"references/pipelines/api.md","line_end":36,"line_start":36},{"file":"references/pipelines/api.md","line_end":41,"line_start":41},{"file":"references/pipelines/api.md","line_end":109,"line_start":109},{"file":"references/pipelines/api.md","line_end":114,"line_start":114},{"file":"references/pipelines/patterns.md","line_end":9,"line_start":9},{"file":"references/pipelines/patterns.md","line_end":48,"line_start":48},{"file":"references/pipelines/patterns.md","line_end":48,"line_start":48},{"file":"references/pipelines/patterns.md","line_end":93,"line_start":93},{"file":"references/pipelines/README.md","line_end":51,"line_start":51},{"file":"references/sql/api.md","line_end":8,"line_start":8},{"file":"references/sql/configuration.md","line_end":36,"line_start":36},{"file":"references/sql/patterns.md","line_end":52,"line_start":52},{"file":"references/sql/patterns.md","line_end":62,"line_start":62},{"file":"references/sql/patterns.md","line_end":26,"line_start":26},{"file":"references/sql/patterns.md","line_end":22,"line_start":22},{"file":"references/sql/patterns.md","line_end":38,"line_start":38},{"file":"references/sql/patterns.md","line_end":51,"line_start":51},{"file":"SKILL.md","line_end":8,"line_start":8},{"file":"SKILL.md","line_end":12,"line_start":12},{"file":"SKILL.md","line_end":18,"line_start":18},{"file":"SKILL.md","line_end":19,"line_start":19},{"file":"SKILL.md","line_end":20,"line_start":20},{"file":"SKILL.md","line_end":22,"line_start":22}]},{"factor":"filesystem","evidence":[{"file":"references/catalog/api.md","line_end":30,"line_start":30},{"file":"references/catalog/patterns.md","line_end":10,"line_start":10},{"file":"references/catalog/patterns.md","line_end":11,"line_start":11},{"file":"references/catalog/README.md","line_end":16,"line_start":16},{"file":"references/pipelines/api.md","line_end":124,"line_start":124},{"file":"references/pipelines/gotchas.md","line_end":45,"line_start":45},{"file":"references/pipelines/patterns.md","line_end":122,"line_start":122},{"file":"references/pipelines/patterns.md","line_end":125,"line_start":125},{"file":"references/pipelines/patterns.md","line_end":130,"line_start":130},{"file":"references/pipelines/README.md","line_end":88,"line_start":88},{"file":"references/pipelines/README.md","line_end":89,"line_start":89},{"file":"references/sql/api.md","line_end":3,"line_start":3},{"file":"references/sql/api.md","line_end":96,"line_start":96},{"file":"references/sql/configuration.md","line_end":7,"line_start":7},{"file":"references/sql/patterns.md","line_end":109,"line_start":109},{"file":"references/sql/patterns.md","line_end":114,"line_start":114},{"file":"references/sql/patterns.md","line_end":118,"line_start":118},{"file":"references/sql/README.md","line_end":63,"line_start":63},{"file":"references/sql/README.md","line_end":64,"line_start":64}]},{"factor":"external_commands","evidence":[{"file":"references/sql/patterns.md","line_end":54,"line_start":51},{"file":"references/sql/patterns.md","line_end":57,"line_start":54},{"file":"references/sql/patterns.md","line_end":64,"line_start":57},{"file":"references/sql/patterns.md","line_end":72,"line_start":66},{"file":"SKILL.md","line_end":12,"line_start":12},{"file":"SKILL.md","line_end":24,"line_start":24}]}],"critical_findings":[],"high_findings":[{"title":"Dashboard Worker Exposes Analytics Without Caller Authorization","locations":[{"file":"references/sql/patterns.md","line_end":58,"line_start":50},{"file":"references/sql/patterns.md","line_end":69,"line_start":61}],"confidence":0.95,"description":"The Worker matches \"/api/analytics\", queries with its server-side token, and returns result.rows without checking caller identity or permissions. A public deployment without external protection could disclose analytics and permit repeated billable queries.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The complete handler performs only a pathname check before returning authenticated query results. No caller authentication is shown; external deployment controls could reduce exposure."}],"medium_findings":[{"title":"HTTP Ingestion Templates Disable Authentication","locations":[{"file":"references/pipelines/configuration.md","line_end":74,"line_start":69},{"file":"references/pipelines/configuration.md","line_end":121,"line_start":115}],"confidence":0.97,"description":"The REST example sets \"authentication\": false, and Terraform also sets authentication = false for HTTP ingestion. If deployed, unauthenticated senders could inject events, corrupt analytics, and increase storage or processing costs.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"Both executable configuration examples explicitly disable authentication without requiring an upstream access boundary. Exploitation depends on deploying these examples and accessing the ingest endpoint."},{"title":"Claimed IP Redaction Retains Raw Client Addresses","locations":[{"file":"references/pipelines/patterns.md","line_end":72,"line_start":64}],"confidence":1,"description":"The Logpush transform selects ClientIP alongside sha256(ClientIP) AS hashed_ip while claiming \"redact PII at ingest\". The stored output retains the original address, so following this example does not achieve the stated redaction.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The same SELECT explicitly includes both the raw ClientIP column and its hash. The misleading redaction comment directly contradicts the output projection."},{"title":"Troubleshooting Command Prints Authentication Secret","locations":[{"file":"references/sql/gotchas.md","line_end":32,"line_start":31}],"confidence":0.99,"description":"The checklist recommends \"echo $WRANGLER_BASIN_SQL_AUTH_TOKEN\" to test token presence. This reveals the complete credential in terminal output and can expose it through captured logs or assistant transcripts.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The command explicitly expands and prints the authentication token rather than checking whether it exists. Further disclosure depends on how terminal output is recorded."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":16,"total_lines":1104,"audit_model":"codex","audited_at":"2026-10-09T14:53:46.817+00:00","created_at":"2026-10-11T03:31:05.26728+00:00","static_findings":[{"id":"network:references/catalog/api.md:22:hardcoded-url","file":"references/catalog/api.md","pattern":"Hardcoded URL","snippet":"curl -s \"https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/r2-catalog/$BUCKET/namespaces/liv","category":"network","line_end":22,"severity":"low","line_start":22},{"id":"filesystem:references/catalog/api.md:30:path-traversal-sequence","file":"references/catalog/api.md","pattern":"Path traversal sequence","snippet":"\"metadata_location\": \"s3://live-data/__r2_data_catalog/.../metadata/01225-....metadata.json\",","category":"filesystem","line_end":30,"severity":"high","line_start":30},{"id":"filesystem:references/catalog/patterns.md:10:path-traversal-sequence","file":"references/catalog/patterns.md","pattern":"Path traversal sequence","snippet":"| Query through Cloudflare's serverless SQL service | [Basin SQL](../sql/) |","category":"filesystem","line_end":10,"severity":"high","line_start":10},{"id":"filesystem:references/catalog/patterns.md:11:path-traversal-sequence","file":"references/catalog/patterns.md","pattern":"Path traversal sequence","snippet":"| Stream events into tables | [Basin Pipelines patterns](../pipelines/patterns.md) |","category":"filesystem","line_end":11,"severity":"high","line_start":11},{"id":"filesystem:references/catalog/README.md:16:path-traversal-sequence","file":"references/catalog/README.md","pattern":"Path traversal sequence","snippet":"Related workflows: [Basin Pipelines](../pipelines/) for ingest and [Basin SQL](../sql/) for querying","category":"filesystem","line_end":16,"severity":"high","line_start":16},{"id":"network:references/pipelines/api.md:14:fetch-api-call","file":"references/pipelines/api.md","pattern":"Fetch API call","snippet":"async fetch(req: Request, env: Env, ctx: ExecutionContext): Promise<Response> {","category":"network","line_end":14,"severity":"low","line_start":14},{"id":"network:references/pipelines/api.md:29:hardcoded-url","file":"references/pipelines/api.md","pattern":"Hardcoded URL","snippet":"https://{stream-id}.ingest.cloudflare.com","category":"network","line_end":29,"severity":"low","line_start":29},{"id":"network:references/pipelines/api.md:36:hardcoded-url","file":"references/pipelines/api.md","pattern":"Hardcoded URL","snippet":"curl -X POST https://{stream-id}.ingest.cloudflare.com \\","category":"network","line_end":36,"severity":"low","line_start":36},{"id":"network:references/pipelines/api.md:41:hardcoded-url","file":"references/pipelines/api.md","pattern":"Hardcoded URL","snippet":"curl -X POST https://{stream-id}.ingest.cloudflare.com \\","category":"network","line_end":41,"severity":"low","line_start":41},{"id":"network:references/pipelines/api.md:109:hardcoded-url","file":"references/pipelines/api.md","pattern":"Hardcoded URL","snippet":"curl -s \"https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/r2-catalog/$BUCKET/namespaces/my_","category":"network","line_end":109,"severity":"low","line_start":109},{"id":"network:references/pipelines/api.md:114:hardcoded-url","file":"references/pipelines/api.md","pattern":"Hardcoded URL","snippet":"\"https://api.sql.cloudflarestorage.com/api/v1/accounts/$ACCOUNT_ID/basin-sql/query/$BUCKET\" \\","category":"network","line_end":114,"severity":"low","line_start":114},{"id":"filesystem:references/pipelines/api.md:124:path-traversal-sequence","file":"references/pipelines/api.md","pattern":"Path traversal sequence","snippet":"- [sql/api.md](../sql/api.md) — querying results","category":"filesystem","line_end":124,"severity":"high","line_start":124},{"id":"blocker:references/pipelines/configuration.md:52:system-reconnaissance","file":"references/pipelines/configuration.md","pattern":"System reconnaissance","snippet":"--access-key-id $KEY --secret-access-key $SECRET","category":"blocker","line_end":52,"severity":"low","line_start":52},{"id":"blocker:references/pipelines/configuration.md:116:system-reconnaissance","file":"references/pipelines/configuration.md","pattern":"System reconnaissance","snippet":"account_id     = var.cloudflare_account_id","category":"blocker","line_end":116,"severity":"low","line_start":116},{"id":"blocker:references/pipelines/configuration.md:125:system-reconnaissance","file":"references/pipelines/configuration.md","pattern":"System reconnaissance","snippet":"account_id = var.cloudflare_account_id","category":"blocker","line_end":125,"severity":"low","line_start":125},{"id":"blocker:references/pipelines/configuration.md:131:system-reconnaissance","file":"references/pipelines/configuration.md","pattern":"System reconnaissance","snippet":"account_id = var.cloudflare_account_id","category":"blocker","line_end":131,"severity":"low","line_start":131},{"id":"blocker:references/pipelines/configuration.md:139:system-reconnaissance","file":"references/pipelines/configuration.md","pattern":"System reconnaissance","snippet":"account_id = var.cloudflare_account_id","category":"blocker","line_end":139,"severity":"low","line_start":139},{"id":"filesystem:references/pipelines/gotchas.md:45:path-traversal-sequence","file":"references/pipelines/gotchas.md","pattern":"Path traversal sequence","snippet":"- **Pipeline SQL is row-level only** — no GROUP BY/aggregation/window functions (do aggregation in [","category":"filesystem","line_end":45,"severity":"high","line_start":45},{"id":"blocker:references/pipelines/gotchas.md:9:system-reconnaissance","file":"references/pipelines/gotchas.md","pattern":"System reconnaissance","snippet":"1. **Schema validation failure** — structured streams accept then **silently drop** invalid events d","category":"blocker","line_end":9,"severity":"low","line_start":9},{"id":"network:references/pipelines/patterns.md:9:fetch-api-call","file":"references/pipelines/patterns.md","pattern":"Fetch API call","snippet":"async fetch(req, env, ctx) {","category":"network","line_end":9,"severity":"low","line_start":9},{"id":"network:references/pipelines/patterns.md:48:fetch-api-call","file":"references/pipelines/patterns.md","pattern":"Fetch API call","snippet":"const items = await (await fetch(\"https://api.example.com/data\")).json();","category":"network","line_end":48,"severity":"low","line_start":48},{"id":"network:references/pipelines/patterns.md:48:hardcoded-url","file":"references/pipelines/patterns.md","pattern":"Hardcoded URL","snippet":"const items = await (await fetch(\"https://api.example.com/data\")).json();","category":"network","line_end":48,"severity":"low","line_start":48},{"id":"network:references/pipelines/patterns.md:93:hardcoded-url","file":"references/pipelines/patterns.md","pattern":"Hardcoded URL","snippet":"curl -X POST \"https://api.cloudflare.com/client/v4/graphql\" \\","category":"network","line_end":93,"severity":"low","line_start":93},{"id":"filesystem:references/pipelines/patterns.md:122:path-traversal-sequence","file":"references/pipelines/patterns.md","pattern":"Path traversal sequence","snippet":"1. Create bucket + enable catalog ([Basin Catalog](../catalog/configuration.md))","category":"filesystem","line_end":122,"severity":"high","line_start":122},{"id":"filesystem:references/pipelines/patterns.md:125:path-traversal-sequence","file":"references/pipelines/patterns.md","pattern":"Path traversal sequence","snippet":"4. Dashboard Worker querying Basin SQL ([sql/patterns.md](../sql/patterns.md))","category":"filesystem","line_end":125,"severity":"high","line_start":125},{"id":"filesystem:references/pipelines/patterns.md:130:path-traversal-sequence","file":"references/pipelines/patterns.md","pattern":"Path traversal sequence","snippet":"- [configuration.md](configuration.md) · [api.md](api.md) · [gotchas.md](gotchas.md) · [Basin SQL](.","category":"filesystem","line_end":130,"severity":"high","line_start":130},{"id":"blocker:references/pipelines/patterns.md:19:system-reconnaissance","file":"references/pipelines/patterns.md","pattern":"System reconnaissance","snippet":"Structured streams drop invalid events silently during processing. Validate before sending for immed","category":"blocker","line_end":19,"severity":"low","line_start":19},{"id":"network:references/pipelines/README.md:51:fetch-api-call","file":"references/pipelines/README.md","pattern":"Fetch API call","snippet":"async fetch(req: Request, env: Env, ctx: ExecutionContext): Promise<Response> {","category":"network","line_end":51,"severity":"low","line_start":51},{"id":"filesystem:references/pipelines/README.md:88:path-traversal-sequence","file":"references/pipelines/README.md","pattern":"Path traversal sequence","snippet":"- [Basin Catalog](../catalog/) — Iceberg sink destination","category":"filesystem","line_end":88,"severity":"high","line_start":88},{"id":"filesystem:references/pipelines/README.md:89:path-traversal-sequence","file":"references/pipelines/README.md","pattern":"Path traversal sequence","snippet":"- [Basin SQL](../sql/) — query the ingested data","category":"filesystem","line_end":89,"severity":"high","line_start":89},{"id":"blocker:references/pipelines/README.md:76:system-reconnaissance","file":"references/pipelines/README.md","pattern":"System reconnaissance","snippet":"- **Schema validation is deferred** — invalid events are accepted then silently dropped. Monitor via","category":"blocker","line_end":76,"severity":"low","line_start":76},{"id":"network:references/sql/api.md:8:hardcoded-url","file":"references/sql/api.md","pattern":"Hardcoded URL","snippet":"POST https://api.sql.cloudflarestorage.com/api/v1/accounts/{ACCOUNT_ID}/basin-sql/query/{BUCKET}","category":"network","line_end":8,"severity":"low","line_start":8},{"id":"filesystem:references/sql/api.md:3:path-traversal-sequence","file":"references/sql/api.md","pattern":"Path traversal sequence","snippet":"Read-only SQL over Iceberg (Apache DataFusion). Query templates only. For the authoritative list of ","category":"filesystem","line_end":3,"severity":"high","line_start":3},{"id":"filesystem:references/sql/api.md:96:path-traversal-sequence","file":"references/sql/api.md","pattern":"Path traversal sequence","snippet":"Aggregate, scalar, JSON, and array/map function catalogs are in the docs — pull `sql-reference/aggre","category":"filesystem","line_end":96,"severity":"high","line_start":96},{"id":"blocker:references/sql/api.md:59:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"INNER JOIN ns.http_requests h ON z.zone_id = h.zone_id","category":"blocker","line_end":59,"severity":"low","line_start":59},{"id":"blocker:references/sql/api.md:60:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"LEFT  JOIN ns.firewall_events f ON z.zone_id = f.zone_id","category":"blocker","line_end":60,"severity":"low","line_start":60},{"id":"blocker:references/sql/api.md:64:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"SELECT * FROM ns.t1 WHERE id IN (SELECT id FROM ns.t2 WHERE x > 0);","category":"blocker","line_end":64,"severity":"low","line_start":64},{"id":"blocker:references/sql/api.md:65:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"SELECT col, (SELECT COUNT(*) FROM ns.t2 s WHERE s.id = t.id) AS cnt FROM ns.t1 t;","category":"blocker","line_end":65,"severity":"low","line_start":65},{"id":"blocker:references/sql/api.md:68:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"WITH top AS (SELECT zone_id, COUNT(*) AS req FROM ns.http_requests GROUP BY zone_id ORDER BY req DES","category":"blocker","line_end":68,"severity":"low","line_start":68},{"id":"blocker:references/sql/api.md:69:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"SELECT t.zone_id, t.req FROM top t LEFT JOIN ns.zones z ON t.zone_id = z.zone_id;","category":"blocker","line_end":69,"severity":"low","line_start":69},{"id":"blocker:references/sql/api.md:72:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"SELECT zone_id FROM ns.firewall_events WHERE action = 'block'","category":"blocker","line_end":72,"severity":"low","line_start":72},{"id":"blocker:references/sql/api.md:73:system-reconnaissance","file":"references/sql/api.md","pattern":"System reconnaissance","snippet":"UNION SELECT zone_id FROM ns.http_requests WHERE risk_score > 0.8;","category":"blocker","line_end":73,"severity":"low","line_start":73},{"id":"network:references/sql/configuration.md:36:hardcoded-url","file":"references/sql/configuration.md","pattern":"Hardcoded URL","snippet":"\"https://api.sql.cloudflarestorage.com/api/v1/accounts/$ACCOUNT_ID/basin-sql/query/$BUCKET\" \\","category":"network","line_end":36,"severity":"low","line_start":36},{"id":"filesystem:references/sql/configuration.md:7:path-traversal-sequence","file":"references/sql/configuration.md","pattern":"Path traversal sequence","snippet":"- R2 bucket with Basin Catalog enabled ([catalog/configuration.md](../catalog/configuration.md))","category":"filesystem","line_end":7,"severity":"high","line_start":7},{"id":"sensitive:references/sql/configuration.md:27:environment-file-access","file":"references/sql/configuration.md","pattern":"Environment file access","snippet":"# or a .env file in the project dir (auto-loaded): WRANGLER_BASIN_SQL_AUTH_TOKEN=<your-token>","category":"sensitive","line_end":27,"severity":"high","line_start":27},{"id":"blocker:references/sql/gotchas.md:5:network-reconnaissance","file":"references/sql/gotchas.md","pattern":"Network reconnaissance","snippet":"## Access","category":"blocker","line_end":7,"severity":"low","line_start":5},{"id":"external_commands:references/sql/patterns.md:51:ruby-shell-backtick-execution","file":"references/sql/patterns.md","pattern":"Ruby/shell backtick execution","snippet":"const url = `https://api.sql.cloudflarestorage.com/api/v1/accounts/${env.ACCOUNT_ID}/basin-sql/query","category":"external_commands","line_end":54,"severity":"medium","line_start":51},{"id":"external_commands:references/sql/patterns.md:54:ruby-shell-backtick-execution","file":"references/sql/patterns.md","pattern":"Ruby/shell backtick execution","snippet":"headers: { Authorization: `Bearer ${env.R2_SQL_TOKEN}`, \"Content-Type\": \"application/json\" },","category":"external_commands","line_end":57,"severity":"medium","line_start":54},{"id":"external_commands:references/sql/patterns.md:57:ruby-shell-backtick-execution","file":"references/sql/patterns.md","pattern":"Ruby/shell backtick execution","snippet":"if (!resp.ok) throw new Error(`Basin SQL ${resp.status}: ${await resp.text()}`);","category":"external_commands","line_end":64,"severity":"medium","line_start":57},{"id":"external_commands:references/sql/patterns.md:66:ruby-shell-backtick-execution","file":"references/sql/patterns.md","pattern":"Ruby/shell backtick execution","snippet":"GROUP BY category ORDER BY cnt DESC LIMIT 10`);","category":"external_commands","line_end":72,"severity":"medium","line_start":66},{"id":"network:references/sql/patterns.md:52:fetch-api-call","file":"references/sql/patterns.md","pattern":"Fetch API call","snippet":"const resp = await fetch(url, {","category":"network","line_end":52,"severity":"low","line_start":52},{"id":"network:references/sql/patterns.md:62:fetch-api-call","file":"references/sql/patterns.md","pattern":"Fetch API call","snippet":"async fetch(req: Request, env: Env): Promise<Response> {","category":"network","line_end":62,"severity":"low","line_start":62},{"id":"network:references/sql/patterns.md:26:python-http-libraries","file":"references/sql/patterns.md","pattern":"Python HTTP libraries","snippet":"body = requests.post(API, headers=HEADERS, json={\"query\": query}, timeout=180).json()","category":"network","line_end":26,"severity":"low","line_start":26},{"id":"network:references/sql/patterns.md:22:hardcoded-url","file":"references/sql/patterns.md","pattern":"Hardcoded URL","snippet":"API = f\"https://api.sql.cloudflarestorage.com/api/v1/accounts/{ACCOUNT_ID}/basin-sql/query/{BUCKET}\"","category":"network","line_end":22,"severity":"low","line_start":22},{"id":"network:references/sql/patterns.md:38:hardcoded-url","file":"references/sql/patterns.md","pattern":"Hardcoded URL","snippet":"\"https://api.sql.cloudflarestorage.com/api/v1/accounts/$ACCOUNT_ID/basin-sql/query/$BUCKET\" \\","category":"network","line_end":38,"severity":"low","line_start":38},{"id":"network:references/sql/patterns.md:51:hardcoded-url","file":"references/sql/patterns.md","pattern":"Hardcoded URL","snippet":"const url = `https://api.sql.cloudflarestorage.com/api/v1/accounts/${env.ACCOUNT_ID}/basin-sql/query","category":"network","line_end":51,"severity":"low","line_start":51},{"id":"filesystem:references/sql/patterns.md:109:path-traversal-sequence","file":"references/sql/patterns.md","pattern":"Path traversal sequence","snippet":"- **Narrow time ranges**; **compact tables** (file count dominates latency — enable automatic compac","category":"filesystem","line_end":109,"severity":"high","line_start":109},{"id":"filesystem:references/sql/patterns.md:114:path-traversal-sequence","file":"references/sql/patterns.md","pattern":"Path traversal sequence","snippet":"After `npx wrangler basin pipelines setup` (Basin Catalog destination), wait for first flush (3–7 mi","category":"filesystem","line_end":114,"severity":"high","line_start":114},{"id":"filesystem:references/sql/patterns.md:118:path-traversal-sequence","file":"references/sql/patterns.md","pattern":"Path traversal sequence","snippet":"- [api.md](api.md) · [gotchas.md](gotchas.md) · [catalog/patterns.md](../catalog/patterns.md)","category":"filesystem","line_end":118,"severity":"high","line_start":118},{"id":"blocker:references/sql/patterns.md:92:system-reconnaissance","file":"references/sql/patterns.md","pattern":"System reconnaissance","snippet":"FROM ns.zones z INNER JOIN ns.http_requests h ON z.zone_id = h.zone_id","category":"blocker","line_end":92,"severity":"low","line_start":92},{"id":"filesystem:references/sql/README.md:63:path-traversal-sequence","file":"references/sql/README.md","pattern":"Path traversal sequence","snippet":"- [Basin Catalog](../catalog/) — PyIceberg/PySpark, table management","category":"filesystem","line_end":63,"severity":"high","line_start":63},{"id":"filesystem:references/sql/README.md:64:path-traversal-sequence","file":"references/sql/README.md","pattern":"Path traversal sequence","snippet":"- [Basin Pipelines](../pipelines/) — streaming ingest into queryable tables","category":"filesystem","line_end":64,"severity":"high","line_start":64},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Cloudflare Data Platform is now **Basin**. Cloudflare Pipelines, R2 Data Catalog, and R2 SQL are now","category":"external_commands","line_end":12,"severity":"medium","line_start":12},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The proposed Wrangler command families are `wrangler basin pipelines`, `wrangler basin catalog`, and","category":"external_commands","line_end":24,"severity":"medium","line_start":24},{"id":"network:SKILL.md:8:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Basin ingests and transforms events, manages Apache Iceberg tables in R2, and queries them with dist","category":"network","line_end":8,"severity":"low","line_start":8},{"id":"network:SKILL.md:12:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Cloudflare Data Platform is now **Basin**. Cloudflare Pipelines, R2 Data Catalog, and R2 SQL are now","category":"network","line_end":12,"severity":"low","line_start":12},{"id":"network:SKILL.md:18:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"| Receive events, transform rows, and deliver to R2 | Basin Pipelines | [Pipelines guide](references","category":"network","line_end":18,"severity":"low","line_start":18},{"id":"network:SKILL.md:19:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"| Manage Iceberg metadata, table maintenance, and engine access | Basin Catalog | [Catalog guide](re","category":"network","line_end":19,"severity":"low","line_start":19},{"id":"network:SKILL.md:20:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"| Query Iceberg tables with analytical SQL | Basin SQL | [SQL guide](references/sql/README.md) | [Ba","category":"network","line_end":20,"severity":"low","line_start":20},{"id":"network:SKILL.md:22:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Typical flow: Basin Pipelines → Basin Catalog tables in R2 → Basin SQL or a compatible external engi","category":"network","line_end":22,"severity":"low","line_start":22}],"finding_verdicts":[{"id":"network:references/catalog/api.md:22:hardcoded-url","reason":"The curl example reads table metadata from Cloudflare's account API with a supplied authentication token. It targets the documented provider, not an exfiltration destination.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/catalog/api.md:30:path-traversal-sequence","reason":"The JSON response uses an ellipsis to abbreviate an S3 metadata location. No filesystem access or parent-directory traversal occurs.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/catalog/patterns.md:10:path-traversal-sequence","reason":"The parent-directory notation is a Markdown link to the bundled SQL reference. It does not construct an executable filesystem path.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/catalog/patterns.md:11:path-traversal-sequence","reason":"This Markdown link navigates to the bundled pipelines patterns file. It remains within the skill references and performs no file operation.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/catalog/README.md:16:path-traversal-sequence","reason":"Both relative paths link sibling reference directories for related workflows. They are documentation navigation, not traversal through attacker-controlled input.","verdict":"false_positive","confidence":1},{"id":"network:references/pipelines/api.md:14:fetch-api-call","reason":"This fetch declaration is a Worker request handler, not an outbound fetch call. Its body sends a fixed example event through the configured stream binding.","verdict":"false_positive","confidence":1},{"id":"network:references/pipelines/api.md:29:hardcoded-url","reason":"The URL is the Cloudflare ingest endpoint format with a stream identifier placeholder. It does not specify an attacker-controlled destination.","verdict":"false_positive","confidence":0.99},{"id":"network:references/pipelines/api.md:36:hardcoded-url","reason":"The curl example posts fixed sample events to the selected Cloudflare stream. Authentication configuration risks are separately documented as semantic findings.","verdict":"false_positive","confidence":0.98},{"id":"network:references/pipelines/api.md:41:hardcoded-url","reason":"This single-event example sends synthetic data to a Cloudflare stream placeholder. The URL itself provides no evidence of unauthorized disclosure.","verdict":"false_positive","confidence":0.98},{"id":"network:references/pipelines/api.md:109:hardcoded-url","reason":"The request lists tables through Cloudflare's account API to verify ingestion. The supplied token is used for its intended provider authentication.","verdict":"false_positive","confidence":0.99},{"id":"network:references/pipelines/api.md:114:hardcoded-url","reason":"The HTTPS endpoint runs a fixed count query against the selected Basin SQL bucket. There is no unrelated recipient or secret-bearing payload.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/pipelines/api.md:124:path-traversal-sequence","reason":"This is a Markdown link to the sibling SQL API reference. It does not read arbitrary files or escape the skill tree.","verdict":"false_positive","confidence":1},{"id":"blocker:references/pipelines/configuration.md:52:system-reconnaissance","reason":"The flags supply R2 credentials for a raw storage sink, not host identity inspection. No system reconnaissance command is present.","verdict":"false_positive","confidence":0.98},{"id":"blocker:references/pipelines/configuration.md:116:system-reconnaissance","reason":"The Terraform assignment uses a configured Cloudflare account identifier for stream creation. It does not inspect the host system.","verdict":"false_positive","confidence":1},{"id":"blocker:references/pipelines/configuration.md:125:system-reconnaissance","reason":"This Terraform sink attribute references a supplied account variable. There is no reconnaissance behavior in the assignment.","verdict":"false_positive","confidence":1},{"id":"blocker:references/pipelines/configuration.md:131:system-reconnaissance","reason":"The sink configuration repeats the Cloudflare account variable required for storage setup. It neither invokes a command nor discovers machine identity.","verdict":"false_positive","confidence":1},{"id":"blocker:references/pipelines/configuration.md:139:system-reconnaissance","reason":"The account_id field configures a Terraform pipeline resource. Its identifier is not a system reconnaissance operation.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/pipelines/gotchas.md:45:path-traversal-sequence","reason":"The relative path links the SQL documentation while explaining transform limitations. It is not a filesystem traversal operation.","verdict":"false_positive","confidence":1},{"id":"blocker:references/pipelines/gotchas.md:9:system-reconnaissance","reason":"The prose describes deferred schema validation and service error metrics. It does not collect host information or run reconnaissance commands.","verdict":"false_positive","confidence":1},{"id":"network:references/pipelines/patterns.md:9:fetch-api-call","reason":"This fetch method receives Worker requests and emits a generated sample event. It is not an outbound network call to an unknown recipient.","verdict":"false_positive","confidence":1},{"id":"network:references/pipelines/patterns.md:48:fetch-api-call","reason":"The scheduled collector reads a placeholder example API without sending credentials or local data. Its purpose is ingestion from a configured source.","verdict":"false_positive","confidence":0.99},{"id":"network:references/pipelines/patterns.md:48:hardcoded-url","reason":"api.example.com is a placeholder source for the collector example. The request contains no authentication header or sensitive outbound payload.","verdict":"false_positive","confidence":0.99},{"id":"network:references/pipelines/patterns.md:93:hardcoded-url","reason":"The curl request queries ingestion metrics from Cloudflare's GraphQL API. Provider authentication and account filtering match the observability workflow.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/pipelines/patterns.md:122:path-traversal-sequence","reason":"This setup step links the bundled catalog configuration guide. The relative link does not execute a file operation.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/pipelines/patterns.md:125:path-traversal-sequence","reason":"The dashboard setup step links the SQL patterns guide in a sibling directory. This is normal documentation navigation.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/pipelines/patterns.md:130:path-traversal-sequence","reason":"The See Also entry links local guides and the sibling SQL directory. No untrusted path input or filesystem access is involved.","verdict":"false_positive","confidence":1},{"id":"blocker:references/pipelines/patterns.md:19:system-reconnaissance","reason":"This sentence recommends client validation because invalid stream events can be dropped. It contains no system reconnaissance instruction.","verdict":"false_positive","confidence":1},{"id":"network:references/pipelines/README.md:51:fetch-api-call","reason":"The fetch signature defines an incoming Worker handler. It uses a configured stream binding for synthetic events rather than contacting an unknown host.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/pipelines/README.md:88:path-traversal-sequence","reason":"The Markdown path links the bundled catalog directory. It is a reference link, not an exploitable file path.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/pipelines/README.md:89:path-traversal-sequence","reason":"The relative SQL directory link remains within the reference tree. No code resolves it against user-controlled filesystem input.","verdict":"false_positive","confidence":1},{"id":"blocker:references/pipelines/README.md:76:system-reconnaissance","reason":"The bullet warns about schema validation and GraphQL error metrics. It does not inspect machine identity or system configuration.","verdict":"false_positive","confidence":1},{"id":"network:references/sql/api.md:8:hardcoded-url","reason":"This is the Basin SQL endpoint specification using account and bucket placeholders. Its host matches the service described throughout the SQL references.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/sql/api.md:3:path-traversal-sequence","reason":"The prose abbreviates documentation paths with ellipses. It contains no parent traversal operation or executable filesystem path.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/sql/api.md:96:path-traversal-sequence","reason":"The scalar-functions path is abbreviated documentation notation. The sentence references function catalogs rather than accessing files.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:59:system-reconnaissance","reason":"zone_id is a column in an illustrative SQL join. The query does not invoke host identity utilities.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:60:system-reconnaissance","reason":"The SQL joins firewall events by zone_id. This is ordinary analytics over tables, not system reconnaissance.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:64:system-reconnaissance","reason":"The identifier id appears in a SQL subquery example. It is a table column, not a shell command.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:65:system-reconnaissance","reason":"The correlated SQL subquery compares s.id and t.id. No operating-system identity discovery occurs.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:68:system-reconnaissance","reason":"The CTE groups request counts by a zone_id column. It is a read-only analytical query rather than a reconnaissance command.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:69:system-reconnaissance","reason":"The query joins a CTE with a zones table using zone_id. These identifiers are data fields, not host inspection.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:72:system-reconnaissance","reason":"The SELECT reads zone identifiers from a firewall events table. It neither enumerates system users nor invokes external commands.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/api.md:73:system-reconnaissance","reason":"The UNION combines zone_id results from request logs. It is a SQL set operation with no system reconnaissance behavior.","verdict":"false_positive","confidence":1},{"id":"network:references/sql/configuration.md:36:hardcoded-url","reason":"The setup request sends a bounded sample query to Cloudflare's Basin SQL API. Its bearer token authenticates the intended service.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/sql/configuration.md:7:path-traversal-sequence","reason":"The prerequisite links a sibling catalog configuration document. There is no arbitrary file access or traversal vulnerability.","verdict":"false_positive","confidence":1},{"id":"sensitive:references/sql/configuration.md:27:environment-file-access","reason":"The comment explains user-managed authentication through a project .env file with a token placeholder. It does not instruct searching or disclosing existing secrets.","verdict":"false_positive","confidence":0.98},{"id":"blocker:references/sql/gotchas.md:5:network-reconnaissance","reason":"The Access section explains the absence of a Worker SQL binding and use of the REST API. It contains no network scanning.","verdict":"false_positive","confidence":1},{"id":"external_commands:references/sql/patterns.md:51:ruby-shell-backtick-execution","reason":"The backticks delimit a TypeScript template literal constructing the Basin SQL URL. They do not execute Ruby or shell commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:references/sql/patterns.md:54:ruby-shell-backtick-execution","reason":"The TypeScript template literal builds a bearer authorization header. There is no shell interpreter or command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:references/sql/patterns.md:57:ruby-shell-backtick-execution","reason":"The backticks format a TypeScript error message from an HTTP response. The string is not passed to an execution API.","verdict":"false_positive","confidence":1},{"id":"external_commands:references/sql/patterns.md:66:ruby-shell-backtick-execution","reason":"This backtick closes a multiline TypeScript string containing a fixed SQL query. No shell or Ruby execution occurs.","verdict":"false_positive","confidence":1},{"id":"network:references/sql/patterns.md:52:fetch-api-call","reason":"The helper sends queries to a fixed Cloudflare Basin SQL host using server-side authentication. Missing caller authorization is reported separately as a semantic finding.","verdict":"false_positive","confidence":0.99},{"id":"network:references/sql/patterns.md:62:fetch-api-call","reason":"The fetch declaration is an incoming Worker handler rather than an outbound request. Its missing access control is a separate semantic finding.","verdict":"false_positive","confidence":1},{"id":"network:references/sql/patterns.md:26:python-http-libraries","reason":"requests.post sends the supplied SQL query to the fixed Basin SQL endpoint with a timeout. The token authenticates Cloudflare, not an unrelated recipient.","verdict":"false_positive","confidence":0.99},{"id":"network:references/sql/patterns.md:22:hardcoded-url","reason":"The Python string defines Cloudflare's Basin SQL API URL using account and bucket parameters. It does not dynamically select an untrusted host.","verdict":"false_positive","confidence":0.99},{"id":"network:references/sql/patterns.md:38:hardcoded-url","reason":"The curl example posts a fixed aggregate query to Basin SQL. The HTTPS host and credential use match the skill's declared analytics purpose.","verdict":"false_positive","confidence":0.99},{"id":"network:references/sql/patterns.md:51:hardcoded-url","reason":"The TypeScript URL fixes the destination to the Cloudflare SQL service. Environment values select account and bucket, not an external exfiltration host.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:references/sql/patterns.md:109:path-traversal-sequence","reason":"The compaction advice links the bundled catalog configuration reference. It performs no filesystem operation.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/sql/patterns.md:114:path-traversal-sequence","reason":"The relative path points to the pipelines patterns document. The surrounding setup guidance does not use it as a command argument.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/sql/patterns.md:118:path-traversal-sequence","reason":"This See Also list links local references, including a sibling catalog document. It is documentation navigation within the skill tree.","verdict":"false_positive","confidence":1},{"id":"blocker:references/sql/patterns.md:92:system-reconnaissance","reason":"The SQL join uses zone_id columns for cross-table analytics. It does not inspect the local host or run an identity command.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/sql/README.md:63:path-traversal-sequence","reason":"The Markdown path links the sibling catalog reference directory. It is not a file access instruction outside the skill.","verdict":"false_positive","confidence":1},{"id":"filesystem:references/sql/README.md:64:path-traversal-sequence","reason":"The relative path links the bundled pipelines reference directory. No attacker-controlled path is resolved or executed.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","reason":"The backticks are Markdown formatting around legacy Wrangler command names. They do not form shell substitution or executable Ruby.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"Inline Markdown code names proposed Wrangler commands and an environment variable. The paragraph explicitly recommends checking installed versions before running commands.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:8:hardcoded-url","reason":"The HTTPS link points to Cloudflare's Basin documentation for implementation guidance. It contains no local-data upload or secret-bearing request.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:12:hardcoded-url","reason":"The GitHub link identifies a pull request in Cloudflare's documentation repository about the rebrand. It is a source citation, not an execution endpoint.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:18:hardcoded-url","reason":"The URL links Cloudflare's Basin Pipelines documentation. It supports workflow selection without requesting credential disclosure.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:19:hardcoded-url","reason":"The URL is a Cloudflare Basin Catalog documentation link. It is not a network instruction to transmit private data.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:20:hardcoded-url","reason":"The workflow table links Cloudflare's Basin SQL guide. There is no executable payload or unrelated external recipient.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:22:hardcoded-url","reason":"The link points to the provider's end-to-end getting started guide. It is documentation retrieval rather than data exfiltration.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"HTTP Ingestion Templates Disable Authentication","severity":"medium","locations":[{"file":"references/pipelines/configuration.md","line_end":74,"line_start":69},{"file":"references/pipelines/configuration.md","line_end":121,"line_start":115}],"confidence":0.97,"description":"The REST example sets \"authentication\": false, and Terraform also sets authentication = false for HTTP ingestion. If deployed, unauthenticated senders could inject events, corrupt analytics, and increase storage or processing costs.","confidence_reasoning":"Both executable configuration examples explicitly disable authentication without requiring an upstream access boundary. Exploitation depends on deploying these examples and accessing the ingest endpoint."},{"title":"Dashboard Worker Exposes Analytics Without Caller Authorization","severity":"high","locations":[{"file":"references/sql/patterns.md","line_end":58,"line_start":50},{"file":"references/sql/patterns.md","line_end":69,"line_start":61}],"confidence":0.95,"description":"The Worker matches \"/api/analytics\", queries with its server-side token, and returns result.rows without checking caller identity or permissions. A public deployment without external protection could disclose analytics and permit repeated billable queries.","confidence_reasoning":"The complete handler performs only a pathname check before returning authenticated query results. No caller authentication is shown; external deployment controls could reduce exposure."},{"title":"Claimed IP Redaction Retains Raw Client Addresses","severity":"medium","locations":[{"file":"references/pipelines/patterns.md","line_end":72,"line_start":64}],"confidence":1,"description":"The Logpush transform selects ClientIP alongside sha256(ClientIP) AS hashed_ip while claiming \"redact PII at ingest\". The stored output retains the original address, so following this example does not achieve the stated redaction.","confidence_reasoning":"The same SELECT explicitly includes both the raw ClientIP column and its hash. The misleading redaction comment directly contradicts the output projection."},{"title":"Troubleshooting Command Prints Authentication Secret","severity":"medium","locations":[{"file":"references/sql/gotchas.md","line_end":32,"line_start":31}],"confidence":0.99,"description":"The checklist recommends \"echo $WRANGLER_BASIN_SQL_AUTH_TOKEN\" to test token presence. This reveals the complete credential in terminal output and can expose it through captured logs or assistant transcripts.","confidence_reasoning":"The command explicitly expands and prints the authentication token rather than checking whether it exists. Further disclosure depends on how terminal output is recorded."}],"subject_marketplace_commit_sha":"e406bf64b5db6e514879399e87b346fa7ff7c2fb","subject_content_hash":"d9bd504ac8125ef84820af6815b3a6f3417fb9126614bad68e420f0f01cec4e3","subject_tree_hash":"5f6d8e6932924af878f03dfc2caa6d5ea081f832a895fe540e30490336bd2003","subject_plugin_path":"skills/cloudflare/basin","audit_payload_hash":"d6208d1cc5e1607b30931a5fb16a2ce5","confirmed_risk_level":"high","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"e406bf64b5db6e514879399e87b346fa7ff7c2fb","contentHash":"d9bd504ac8125ef84820af6815b3a6f3417fb9126614bad68e420f0f01cec4e3","treeHash":"5f6d8e6932924af878f03dfc2caa6d5ea081f832a895fe540e30490336bd2003","pluginPath":"skills/cloudflare/basin","auditPayloadHash":"d6208d1cc5e1607b30931a5fb16a2ce5"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/cloudflare-basin/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":4,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}