T09 · Insecure Skill Coding Practices
- Location
scripts/wine_search.py:123- Finding
Firecrawl bearer token retransmitted with TLS certificate verification disabled
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a read-only wine lookup tool, but its optional Firecrawl path can retry an authenticated request with TLS certificate checks disabled, which could expose the API key on a hostile network.
Review before installing if you plan to use Firecrawl. Do not use this version with a Firecrawl API key on untrusted or intercepted networks unless the TLS retry is removed or fixed, and rotate any key used during certificate failures or suspicious timeouts. Treat the health guidance as general information, not medical advice.
scripts/wine_search.py:123Firecrawl bearer token retransmitted with TLS certificate verification disabled
scripts/requirements.txt:8Optional OCR dependencies are installed without artifact integrity verification
Firecrawl requests include an Authorization bearer token derived from FIRECRAWL_API_KEY and are sent over the network. In this helper, SSL verification failures and timeouts can trigger logic that ultimately permits a retry path with certificate validation disabled elsewhere in the same Firecrawl flow, making the token exposable to MitM interception despite the comments claiming safety.
4. The bearer token is already transmitted over the same HTTPS connection
"""
try:
return urllib.request.urlopen(req, context=_ssl_ctx, timeout=timeout)
except (ssl.SSLCertVerificationError, urllib.error.URLError, TimeoutError, OSError) as e:
# Check if it's an SSL verification error or a timeout that might be
# caused by SSL handshake issues (common in restricted network environments)
This line explicitly retries a Firecrawl API request carrying an Authorization bearer token using an SSL context with hostname checks disabled and verify_mode=CERT_NONE. That allows an active network attacker to impersonate api.firecrawl.dev, intercept the API key, and tamper with scraped responses.
setattr(insecure_ctx, "check_hostname", False)
setattr(insecure_ctx, "verify_mode", getattr(ssl, "CERT_NONE"))
try:
return urllib.request.urlopen(req, context=insecure_ctx, timeout=timeout)
except Exception:
pass # Fall through to raise original error
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
is used directly without any fallback logic.
"""
try:
return urllib.request.urlopen(req, context=_ssl_ctx, timeout=timeout)
except (ssl.SSLCertVerificationError, urllib.error.URLError) as e:
if isinstance(e, ssl.SSLCertVerificationError) or \
(isinstance(e, urllib.error.URLError) and isinstance(e.reason, ssl.SSLCertVerificationError)):
Accepting a Firecrawl credential and using an external scraping/proxy service is a stronger capability than a simple local search/display skill description suggests. Even if the API key is optional, the current wording can cause users and platforms to misclassify the skill's trust requirements and data-flow exposure.
Accepting a Firecrawl credential and using an external scraping/proxy service is a stronger capability than a simple local search/display skill description suggests. Even if the API key is optional, the current wording can cause users and platforms to misclassify the skill's trust requirements and data-flow exposure.
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
Referenced artifact was not completely inspected
python scripts/wine_search.py "Lafite" --firecrawl-key fc-xxxx
The skill expands from wine lookup into personalized health and drinking advice, including age bands, medical conditions, and consumption limits. This creates out-of-scope medical guidance and can cause harm if users rely on inaccurate or overly generalized recommendations, especially for pregnancy, liver disease, medication interactions, or chronic illness.