Back to skill

Security audit

Firecrawl Web Scraper

Security checks for vulnerabilities and agentic risk

Overview

This skill is a straightforward Firecrawl API wrapper for scraping, crawling, and search, with expected third-party network use and API-key access disclosed enough to be understandable.

Install only if you are comfortable sending requested URLs, search terms, crawl scopes, and the Firecrawl API key to Firecrawl. Avoid using it on private intranet URLs, confidential documents, sensitive search terms, or targets you are not authorized to scrape, and monitor credit usage for larger crawls.

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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (14)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill advertises commands that use network access and read an API key from local files/environment variables, but it declares no explicit tool scope or permissions boundary. This can cause the hosting agent or user to invoke a capability-bearing skill without clear consent or policy enforcement, increasing the chance of unintended outbound requests and secret use.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill sends scraped URLs, search terms, and potentially page contents to the Firecrawl third-party service, but the description does not clearly warn users that their inputs and retrieved data leave the local environment. This creates a real data exposure risk if users submit internal URLs, sensitive queries, or proprietary content under the assumption the operation is local.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This duplicate finding highlights the same outbound scrape request carrying the API key in the Authorization header and user-supplied payload to a third-party API. While HTTPS protects in transit, the operation still expands trust to the external provider and should be treated as a real data-sharing event.

Content

Scanner excerpt · scripts/scrape.py (reported line 73)May include surrounding context.

python
payload["waitFor"] = wait_for
    
    try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/scrape",
            headers={
                "Content-Type": "application/json",

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This duplicate finding highlights the same outbound scrape request carrying the API key in the Authorization header and user-supplied payload to a third-party API. While HTTPS protects in transit, the operation still expands trust to the external provider and should be treated as a real data-sharing event.

Content

Scanner excerpt · scripts/scrape.py (reported line 73)May include surrounding context.

python
payload["waitFor"] = wait_for
    
    try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/scrape",
            headers={
                "Content-Type": "application/json",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script sends user-supplied URLs and search queries to the external Firecrawl service, along with the bearer API key, but provides no explicit notice or consent mechanism warning that inputs will leave the local environment. In an agent-skill context, users may assume local processing and could unintentionally transmit sensitive internal URLs, query terms, or proprietary targets to a third party.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The hardcoded Firecrawl endpoint confirms that scrape operations always involve a third-party network destination. That is not inherently malicious, but it is a genuine security-relevant external transmission path that matters when users may expect local-only processing.

Content

Scanner excerpt · scripts/scrape.py (reported line 74)May include surrounding context.

python
try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/scrape",
            headers={
                "Content-Type": "application/json",
                "Authorization": f"Bearer {api_key}"

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This duplicate finding captures the same crawl submission, which authorizes with the Firecrawl API key and sends crawl scope data off-system. The agent-skill setting increases risk because users may not realize a third-party service is performing the crawl and receiving the targets.

Content

Scanner excerpt · scripts/scrape.py (reported line 133)May include surrounding context.

python
payload["includePaths"] = include_paths
    
    try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/crawl",
            headers={
                "Content-Type": "application/json",

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This duplicate finding captures the same crawl submission, which authorizes with the Firecrawl API key and sends crawl scope data off-system. The agent-skill setting increases risk because users may not realize a third-party service is performing the crawl and receiving the targets.

Content

Scanner excerpt · scripts/scrape.py (reported line 133)May include surrounding context.

python
payload["includePaths"] = include_paths
    
    try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/crawl",
            headers={
                "Content-Type": "application/json",

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The hardcoded crawl endpoint shows that website crawl requests are delegated to Firecrawl rather than executed locally. This is expected for the skill's purpose, but it still creates confidentiality and trust-boundary concerns for submitted domains and crawl scopes.

Content

Scanner excerpt · scripts/scrape.py (reported line 134)May include surrounding context.

python
try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/crawl",
            headers={
                "Content-Type": "application/json",
                "Authorization": f"Bearer {api_key}"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · scripts/scrape.py (reported line 157)May include surrounding context.

python
try:
        response = requests.get(
            f"https://api.firecrawl.dev/v1/crawl/{crawl_id}",
            headers={"Authorization": f"Bearer {api_key}"},
            timeout=30
        )

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This duplicate finding reflects the same external search request with bearer authentication and a user-supplied query. The main risk is confidentiality of the transmitted query and reliance on an external service boundary, not code execution or injection.

Content

Scanner excerpt · scripts/scrape.py (reported line 197)May include surrounding context.

python
}
    
    try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/search",
            headers={
                "Content-Type": "application/json",

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This duplicate finding reflects the same external search request with bearer authentication and a user-supplied query. The main risk is confidentiality of the transmitted query and reliance on an external service boundary, not code execution or injection.

Content

Scanner excerpt · scripts/scrape.py (reported line 197)May include surrounding context.

python
}
    
    try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/search",
            headers={
                "Content-Type": "application/json",

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The hardcoded search endpoint confirms that all search queries are sent to Firecrawl for processing. In this skill context the behavior is expected, but without prominent disclosure it remains a legitimate confidentiality concern because user intent and query content leave the local system.

Content

Scanner excerpt · scripts/scrape.py (reported line 198)May include surrounding context.

python
try:
        response = requests.post(
            "https://api.firecrawl.dev/v1/search",
            headers={
                "Content-Type": "application/json",
                "Authorization": f"Bearer {api_key}"

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The function reads credentials from secret-file locations and from the FIRECRAWL_API_KEY environment variable, but the script provides no visible runtime notice that it is using local credentials. For skills, secret access should be disclosed somewhere user-visible unless already clearly documented elsewhere.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.