Back to skill

Security audit

Walmart Product Data API - Search, Detail, Reviews, Offers

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent Walmart product-data connector that sends user-requested search, product, seller, review, and location lookup inputs to Scavio's API.

Install this only if you are comfortable using Scavio as a third-party API provider and sending Walmart search terms, product IDs, seller IDs, and any ZIP/postal-code or store-targeting inputs to that service. Keep SCAVIO_API_KEY in an environment variable or secret store and avoid committing it to source control.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (11)

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# 1. Search (1 credit on the default com domain)
results = requests.post(f"{BASE}/api/v1/walmart/search", headers=HEADERS,
    json={"query": "wireless headphones", "sort_by": "price_low", "max_price": 100}).json()

product_id = results["data"]["products"][0]["id"]   # search rows carry `id`, not `product_id`

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# 1. Search (1 credit on the default com domain)
results = requests.post(f"{BASE}/api/v1/walmart/search", headers=HEADERS,
    json={"query": "wireless headphones", "sort_by": "price_low", "max_price": 100}).json()

product_id = results["data"]["products"][0]["id"]   # search rows carry `id`, not `product_id`

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
product_id = results["data"]["products"][0]["id"]   # search rows carry `id`, not `product_id`

# 2. Full product detail
product = requests.post(f"{BASE}/api/v1/walmart/product", headers=HEADERS,
    json={"product_id": product_id}).json()

# 3. Reviews, page 2 (10 per page)

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
json={"product_id": product_id}).json()

# 3. Reviews, page 2 (10 per page)
reviews = requests.post(f"{BASE}/api/v1/walmart/reviews", headers=HEADERS,
    json={"product_id": product_id, "page": 2, "sort": "rating-desc"}).json()

# 4. Buy box for an item

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
json={"product_id": product_id, "page": 2, "sort": "rating-desc"}).json()

# 4. Buy box for an item
offers = requests.post(f"{BASE}/api/v1/walmart/offers", headers=HEADERS,
    json={"product_id": "2979510112"}).json()

# 5. Seller storefront, then their catalog (numeric seller_catalog_id)

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
json={"product_id": "2979510112"}).json()

# 5. Seller storefront, then their catalog (numeric seller_catalog_id)
seller = requests.post(f"{BASE}/api/v1/walmart/seller", headers=HEADERS,
    json={"seller_id": "101480084"}).json()
catalog = requests.post(f"{BASE}/api/v1/walmart/seller-products", headers=HEADERS,
    json={"seller_id": "101480084"}).json()

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
# 5. Seller storefront, then their catalog (numeric seller_catalog_id)
seller = requests.post(f"{BASE}/api/v1/walmart/seller", headers=HEADERS,
    json={"seller_id": "101480084"}).json()
catalog = requests.post(f"{BASE}/api/v1/walmart/seller-products", headers=HEADERS,
    json={"seller_id": "101480084"}).json()

# 6. Mexican marketplace search: this call costs 2 credits, not 1

External Transmission

Medium
Category
Data Exfiltration
Confidence
83% confidence
Finding

This example transmits a ZIP code to an external API in order to locate nearby stores, but the skill does not pair this capability with a clear privacy warning or user-consent guidance. Although the transmission is functionally necessary and not covert, location-derived data can be sensitive and should be explicitly disclosed before sending it off-platform.

Content

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

md
json={"query": "audifonos", "domain": "com.mx"}).json()

# 7. Stores near a ZIP, then one store's search results (2 credits, 10-60s)
stores = requests.post(f"{BASE}/api/v1/walmart/stores", headers=HEADERS,
    json={"zipcode": "50036"}).json()
store_id = stores["data"]["stores"][0]["store_id"]   # nearest first, e.g. "1389"
local = requests.post(f"{BASE}/api/v1/walmart/search", headers=HEADERS, timeout=120,

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This request sends a search term together with delivery_zip and store_id to target a specific local store, increasing the sensitivity of the transmitted data because it can reveal user location and local shopping intent. The behavior is central to the feature, but the lack of explicit privacy disclosure and consent makes this a genuine, though low-severity, privacy issue.

Content

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

md
stores = requests.post(f"{BASE}/api/v1/walmart/stores", headers=HEADERS,
    json={"zipcode": "50036"}).json()
store_id = stores["data"]["stores"][0]["store_id"]   # nearest first, e.g. "1389"
local = requests.post(f"{BASE}/api/v1/walmart/search", headers=HEADERS, timeout=120,
    json={"query": "whole milk", "delivery_zip": "50036", "store_id": store_id}).json()
print(local["data"]["location"])   # the store the results were served against

External Transmission

Medium
Category
Data Exfiltration
Confidence
83% confidence
Finding

This example transmits a Canadian postal code to the external API to find nearby stores. As with the US ZIP example, the transmission is expected for the skill's function but still constitutes sharing potentially sensitive location data without an explicit privacy notice in the skill content.

Content

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

print(local["data"]["location"]) # the store the results were served against

8. Same on walmart.ca: postal code + domain "ca" on both calls

ca_stores = requests.post(f"{BASE}/api/v1/walmart/stores", headers=HEADERS, json={"zipcode": "M5V 2T6", "domain": "ca"}).json()

text

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill explicitly supports sending location-related data such as ZIP codes, Canadian postal codes, delivery_zip, and store targeting to an external API, but it does not clearly warn users that this data will be transmitted off-platform. While this is part of the feature set rather than covert exfiltration, location data is still sensitive enough that missing disclosure creates a privacy risk and weakens informed consent.

Content

No source excerpt is available for this finding.