Back to skill

Security audit

Housing Scout — Smart House(Sale or Lease) Search & Alerts

Security checks for vulnerabilities and agentic risk

Overview

Housing Scout is mostly coherent, but it can send unvalidated listing URLs through a third-party fetch proxy, so it belongs in Review rather than automatic install.

Before installing, be comfortable with public listing URLs and fetched page content being sent to r.jina.ai, and do not pass internal/private URLs or URLs containing tokens, credentials, or private query parameters. Keep the skill data directory private, review stored chat IDs/subscriptions, and prune profiles, caches, and alert destinations when no longer needed.

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/housing_scout/housing_scout.mjs:231
Finding
Unrestricted User-Supplied URL Disclosure Through a Third-Party Fetch Proxy<![CDATA[ ## Vulnerability Details **File Location**: `scripts/housing_scout/housing_scout.mjs:231-241`; `scripts/housing_scout/providers/redfin.mjs:135-140` **Vulnerability Type**: Unvalidated URL forwarding and third-party data disclosure **Risk Level**: Medium ### Vulnerable Code ```js async function buildSubjectFromRedfinUrl(redfinUrl, results = []) { const hit = results.find((x) => String(x.url || "").replace(/\/$/, "") === String(redfinUrl || "").replace(/\/$/, "")); if (hit) return buildSubjectFromListing(hit, { status: "for_sale" }); const mirror = `https://r.jina.ai/http://${String(redfinUrl).replace(/^https?:\/\//, "")}`; const res = await fetch(mirror, { headers: { "user-agent": "Mozilla/5.0" } }); if (!res.ok) throw new Error(`Failed to fetch redfin-url subject (${res.status})`); const text = await res.text(); return parseRedfinTitleSubject(text, redfinUrl); } ``` A second unrestricted forwarding helper is present in the Redfin provider: ```js async function fetchViaJina(url) { const mirror = `https://r.jina.ai/http://${url.replace(/^https?:\/\//, "")}`; const res = await fetch(mirror, { headers: { "user-agent": "Mozilla/5.0" } }); if (!res.ok) throw new Error(`Jina fetch failed ${res.status}`); return res.text(); } ``` ### Technical Analysis The `--redfin-url` argument is treated as an arbitrary string and embedded into a request to the external `r.jina.ai` fetch service. The implementation does not use `new URL()` to validate the input and does not enforce: - An HTTPS source URL. - A Redfin-owned hostname. - Standard destination ports. - The absence of embedded usernames or passwords. - Rejection of localhost, private, link-local, reserved, or cloud metadata destinations. - Redirect restrictions. - Removal of sensitive URL query parameters or fragments. The documentation warns users not to supply private or internal URLs, but this warning is not an enforceable security boundary. A caller can still pass such a URL di ...[truncated 2776 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse every externally supplied URL using `new URL()` and reject malformed input. 2. Require the source protocol to be exactly `https:`. 3. Enforce a strict hostname allowlist, such as `www.redfin.com` and any explicitly reviewed Redfin subdomains. Avoid suffix checks that would accept domains such as `redfin.com.attacker.example`. 4. Reject URLs containing `username`, `password`, nonstandard ports, or unnecessary sensitive query parameters. 5. Reject IP-literal destinations and resolve hostnames before use. Block loopback, private, link-local, multicast, reserved, and cloud metadata address ranges for both IPv4 and IPv6. 6. Apply validation at every trust boundary: - When accepting `--redfin-url`. - When importing cache records. - Immediately before each outbound request. 7. Disable automatic redirect following or validate every redirect destination against the same protocol, host, port, and IP-address policy. 8. Do not pass arbitrary destinations to a third-party proxy. Prefer direct requests to an approved Redfin endpoint where operationally possible. 9. If a proxy remains necessary, explicitly request user consent and document what URL and listing information is disclosed to that service. 10. Add negative tests covering localhost, RFC1918 addresses, link-local and metadata addresses, IPv6 loopback/private ranges, encoded hostnames, embedded credentials, nonstandard ports, deceptive subdomains, and redirects to disallowed destinations. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (29)

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `node ./scripts/housing_scout/housing_scout.mjs quickstart --name "great nyc area" --city "New York" --state "NY" --beds-min 3 --budget-max 2000000 --run true
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Missing User Warnings

High
Confidence
97% confidence
Finding
When a user supplies --redfin-url, the code silently forwards that URL to r.jina.ai via fetch without telling the user. This is a stronger privacy issue than ordinary network access because a user-provided target URL is disclosed to a separate third-party service, which may log request metadata and the property URL, and users would reasonably not expect that behavior from a comps lookup.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The skill persists profiles, queries, subscriptions, and snapshots to local JSON files, including location preferences and contact destinations such as Telegram chat IDs, without any user-facing notice or consent flow. In a housing-search context, this data is sensitive because it reveals where a user wants to live, budget constraints, and notification endpoints, which can expose personal habits if the workspace is shared or later exfiltrated.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The skill takes a user-provided Redfin URL, rewrites it to an r.jina.ai mirror URL, and fetches it over the network. This sends user-supplied browsing targets to an unrelated third party and creates an unnecessary external data flow for a housing tool, increasing privacy and supply-chain risk if the mirror logs, alters, or misrepresents content.

Static analysis

No suspicious patterns detected.