{"data":{"skill":{"slug":"expo-expo-api-routes","name":"expo-api-routes","icon":"📦","repo":"https://github.com/expo/skills/tree/main/plugins/expo-app-design/skills/expo-api-routes/","status":"approved","author":"expo","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"55803ab6-4d82-40e7-81f6-9c053c51411f","skill_id":"9b8d7f09-7513-4a63-a139-a057254d6b06","version":3,"content_hash":"e06e43f4ff3042d4f9be6535eb9a1334","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":null,"manual_install_policy":null,"summary":"Static analysis flagged many shell, network, filesystem, environment, and weak crypto patterns, but most are false positives from Markdown code fences, inline code, route examples, or legitimate server-side configuration guidance. Human review found no prompt injection or malicious behavior, but several copyable examples could lead to insecure implementations if used without additional hardening.","remediation":[],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":43,"line_start":35},{"file":"SKILL.md","line_end":47,"line_start":43},{"file":"SKILL.md","line_end":52,"line_start":47},{"file":"SKILL.md","line_end":58,"line_start":52},{"file":"SKILL.md","line_end":77,"line_start":58},{"file":"SKILL.md","line_end":81,"line_start":77},{"file":"SKILL.md","line_end":86,"line_start":81},{"file":"SKILL.md","line_end":92,"line_start":86},{"file":"SKILL.md","line_end":100,"line_start":92},{"file":"SKILL.md","line_end":104,"line_start":100},{"file":"SKILL.md","line_end":114,"line_start":104},{"file":"SKILL.md","line_end":118,"line_start":114},{"file":"SKILL.md","line_end":128,"line_start":118},{"file":"SKILL.md","line_end":132,"line_start":128},{"file":"SKILL.md","line_end":134,"line_start":132},{"file":"SKILL.md","line_end":143,"line_start":134},{"file":"SKILL.md","line_end":154,"line_start":143},{"file":"SKILL.md","line_end":158,"line_start":154},{"file":"SKILL.md","line_end":159,"line_start":158},{"file":"SKILL.md","line_end":165,"line_start":159},{"file":"SKILL.md","line_end":179,"line_start":165},{"file":"SKILL.md","line_end":183,"line_start":179},{"file":"SKILL.md","line_end":194,"line_start":183},{"file":"SKILL.md","line_end":200,"line_start":194},{"file":"SKILL.md","line_end":202,"line_start":200},{"file":"SKILL.md","line_end":204,"line_start":202},{"file":"SKILL.md","line_end":208,"line_start":204},{"file":"SKILL.md","line_end":211,"line_start":208},{"file":"SKILL.md","line_end":217,"line_start":211},{"file":"SKILL.md","line_end":220,"line_start":217},{"file":"SKILL.md","line_end":224,"line_start":220},{"file":"SKILL.md","line_end":226,"line_start":224},{"file":"SKILL.md","line_end":232,"line_start":226},{"file":"SKILL.md","line_end":237,"line_start":232},{"file":"SKILL.md","line_end":241,"line_start":237},{"file":"SKILL.md","line_end":249,"line_start":241},{"file":"SKILL.md","line_end":257,"line_start":249},{"file":"SKILL.md","line_end":271,"line_start":257},{"file":"SKILL.md","line_end":285,"line_start":271},{"file":"SKILL.md","line_end":298,"line_start":285},{"file":"SKILL.md","line_end":302,"line_start":298},{"file":"SKILL.md","line_end":313,"line_start":302},{"file":"SKILL.md","line_end":319,"line_start":313},{"file":"SKILL.md","line_end":342,"line_start":319},{"file":"SKILL.md","line_end":346,"line_start":342},{"file":"SKILL.md","line_end":353,"line_start":346},{"file":"SKILL.md","line_end":358,"line_start":353}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":139,"line_start":139},{"file":"SKILL.md","line_end":265,"line_start":265},{"file":"SKILL.md","line_end":304,"line_start":304},{"file":"SKILL.md","line_end":308,"line_start":308},{"file":"SKILL.md","line_end":352,"line_start":352},{"file":"SKILL.md","line_end":264,"line_start":264},{"file":"SKILL.md","line_end":139,"line_start":139},{"file":"SKILL.md","line_end":204,"line_start":204},{"file":"SKILL.md","line_end":209,"line_start":209},{"file":"SKILL.md","line_end":210,"line_start":210},{"file":"SKILL.md","line_end":265,"line_start":265},{"file":"SKILL.md","line_end":353,"line_start":353}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":336,"line_start":336},{"file":"SKILL.md","line_end":336,"line_start":336}]},{"factor":"env_access","evidence":[{"file":"SKILL.md","line_end":143,"line_start":143},{"file":"SKILL.md","line_end":290,"line_start":290},{"file":"SKILL.md","line_end":291,"line_start":291},{"file":"SKILL.md","line_end":353,"line_start":353},{"file":"SKILL.md","line_end":132,"line_start":132},{"file":"SKILL.md","line_end":143,"line_start":143},{"file":"SKILL.md","line_end":290,"line_start":290},{"file":"SKILL.md","line_end":291,"line_start":291},{"file":"SKILL.md","line_end":353,"line_start":353},{"file":"SKILL.md","line_end":143,"line_start":143},{"file":"SKILL.md","line_end":234,"line_start":234},{"file":"SKILL.md","line_end":353,"line_start":353}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Overly Permissive CORS Example Allows Authorization Headers","locations":[{"file":"SKILL.md","line_end":178,"line_start":165}],"confidence":0.78,"description":"The CORS example allows any origin while also allowing the Authorization header. If copied into a production API, this can expose authenticated endpoints to browser calls from untrusted origins unless additional authentication and origin checks are added.","confidence_reasoning":"The code is a documentation example, not executable skill code, but the insecure CORS pattern is explicit and copyable. The risk depends on how users adapt the example in production."},{"title":"External API Proxy Example Does Not Encode User Input","locations":[{"file":"SKILL.md","line_end":354,"line_start":349}],"confidence":0.74,"description":"The weather proxy example interpolates a query parameter directly into an external API URL with an API key. A copied implementation could allow query manipulation and unreliable upstream requests unless the value is validated and encoded.","confidence_reasoning":"The host is hardcoded, so this is not clear SSRF, but direct interpolation of request-controlled input into a URL is visible. The issue is a realistic implementation risk for copied example code."}],"low_findings":[{"title":"Shell Command Examples Are Documentation, Not Hidden Execution","locations":[{"file":"SKILL.md","line_end":210,"line_start":200},{"file":"SKILL.md","line_end":225,"line_start":217}],"confidence":0.93,"description":"The analyzer flagged many Markdown backticks and bash examples as command execution. These commands are visible installation, login, local testing, curl, and deployment examples rather than code that the skill runs automatically.","confidence_reasoning":"The relevant text is inside Markdown fences and no helper script or hidden executable file is present. The commands are ordinary Expo and HTTP testing workflows."},{"title":"Environment Variable Examples Are Legitimate Server-Side Guidance","locations":[{"file":"SKILL.md","line_end":143,"line_start":132},{"file":"SKILL.md","line_end":291,"line_start":289},{"file":"SKILL.md","line_end":353,"line_start":352}],"confidence":0.86,"description":"The skill demonstrates server-side use of environment variables for API keys and database credentials. This is appropriate for API routes, though the examples should remind users to avoid command history exposure and to use secret managers where available.","confidence_reasoning":"The skill explicitly says secrets belong server-side and warns never to commit local env files. No evidence shows exfiltration or collection of environment values by the skill itself."},{"title":"Secret Value Placeholder Appears In Command Example","locations":[{"file":"SKILL.md","line_end":234,"line_start":232}],"confidence":0.68,"description":"The EAS environment command uses a placeholder API key value in a shell command. The placeholder is not a real secret, but real values passed this way can appear in shell history or process listings.","confidence_reasoning":"The value shown is clearly a placeholder, which lowers severity. The command pattern can still teach a less safe secret entry method if copied with a real value."},{"title":"Relative Import Misclassified As Path Traversal","locations":[{"file":"SKILL.md","line_end":336,"line_start":335}],"confidence":0.95,"description":"The path traversal finding points to a TypeScript relative import from a route file to a utility module. It is not file access and does not read user-controlled paths.","confidence_reasoning":"The flagged sequence appears only in an import path inside a code example. There is no filesystem API call or user input involved."},{"title":"Weak Cryptography Detection Is A False Positive","locations":[{"file":"SKILL.md","line_end":3,"line_start":3},{"file":"SKILL.md","line_end":262,"line_start":258},{"file":"SKILL.md","line_end":364,"line_start":364}],"confidence":0.9,"description":"The weak cryptography detections do not correspond to use of MD5, SHA-1, DES, or another weak primitive. The only crypto example uses SHA-256 through Web Crypto.","confidence_reasoning":"Line 258 through 262 shows SHA-256, which is not the weak algorithm category flagged by the analyzer. The other flagged lines are prose and status-code guidance, not cryptographic code."}],"dangerous_patterns":[{"title":"Copyable Production-Sensitive Examples Require Hardening","locations":[{"file":"SKILL.md","line_end":178,"line_start":165},{"file":"SKILL.md","line_end":234,"line_start":232},{"file":"SKILL.md","line_end":354,"line_start":349}],"confidence":0.76,"description":"The skill contains examples for CORS, environment variables, external API proxying, curl testing, and deployment commands. These are expected for the topic, but users should adapt them with validation, origin restrictions, and secret handling controls before production use.","confidence_reasoning":"The patterns are visible in examples and align with common production risks. They are not evidence of malicious skill behavior."}],"files_scanned":1,"total_lines":369,"audit_model":"codex","audited_at":"2026-06-30T01:00:34.599+00:00","created_at":"2026-06-30T01:34:34.595321+00:00","static_findings":[],"finding_verdicts":[],"semantic_findings":[],"subject_marketplace_commit_sha":null,"subject_content_hash":null,"subject_tree_hash":null,"subject_plugin_path":null,"audit_payload_hash":null,"confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":null,"contentHash":null,"treeHash":null,"pluginPath":null,"auditPayloadHash":null},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"canonical install advisories are incomplete"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":6,"needsReviewCount":0,"falsePositiveCount":1,"agentAutoInstallPolicy":null,"manualInstallPolicy":null,"artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}