T09 · Insecure Skill Coding Practices
- Location
SKILL.md:72- Finding
Unvalidated File-Controlled Browser Navigation Target
- Content
View full analysis
targetId= targetUrl= ``` ### Technical Analysis The workflow treats a profile URL read from a user-supplied spreadsheet as a trusted LinkedIn URL. It does not require the agent to parse, canonicalize, or validate the URL before passing it to the browser navigation tool. In particular, the instructions do not enforce: - The `https` scheme. - An exact permitted hostname such as `www.linkedin.com`. - An expected LinkedIn profile path such as `/in/`. - Rejection of embedded credentials, nonstandard ports, deceptive subdomains, or encoded hostnames. - Validation of the final destination after an HTTP redirect. - Final-domain validation after clicking a profile link returned by Google. Because the workflow reuses an existing authenticated browser tab, a malicious or compromised data file can cause that tab to navigate to attacker-controlled content. Browser same-origin controls ordinarily prevent a foreign site from directly reading LinkedIn cookies, so this issue does not by itself establish direct cookie theft. Nevertheless, the hostile page can present a convincing login prompt, solicit sensitive information, exploit browser vulnerabilities, or manipulate subsequent user actions. ### Attack Path 1. An attacker supplies or modifies the CSV/TSV used by the Sk ...[truncated 1288 chars]- Remediation
View remediation
`. 4. Reject URLs containing embedded credentials, unexpected ports, deceptive subdomains, malformed encodings, or unsupported schemes. 5. Do not rely on substring checks such as `"linkedin.com" in url`; compare the parsed hostname exactly. 6. After every navigation or search-result click, inspect the final URL and stop if it is outside the approved LinkedIn origin. 7. Treat redirects to non-allowlisted origins as failures rather than continuing the workflow. 8. For Google fallback results, extract and validate the destination URL before clicking it. 9. Warn the user and mark the row as invalid when an untrusted URL is encountered. A suitable policy is: ```text scheme == "https" hostname == "www.linkedin.com" path starts with "/in/" no embedded username/password no unexpected port final redirected URL passes the same checks ``` ]]>
