Back to skill

Security audit

Website Email Scraper (Apify)

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it says, but it defaults to collecting personal contact data and handles the Apify token in higher-risk ways that deserve review before installation.

Install only if you are comfortable sending target website domains and scrape settings to Apify and collecting public contact data for a lawful, user-approved purpose. Prefer APIFY_TOKEN from a protected environment variable, avoid --apify-token on the command line, set includePersonalData=false unless personal contacts are explicitly needed, use a budget limit, and pin or verify the skills installer version before running the README npx commands.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/website_email_scraper_actor.py:171
Finding

Apify API Token Exposed Through Command-Line Arguments and URL Query Parameters

Content
View full analysis
str: token = explicit or os.getenv("APIFY_TOKEN", "") if not token: raise SkillError("Apify token missing. Pass --apify-token or set APIFY_TOKEN.") return token ``` ```python def run_actor(token: str, actor_id: str, payload: dict[str, Any], timeout_sec: int, budget_usd: float | None) -> dict[str, Any]: params: dict[str, str | int | float] = { "token": token, "timeout": timeout_sec, "clean": "true", } if budget_usd is not None: if budget_usd <= 0: raise SkillError("--budget-usd must be > 0.") params["maxTotalChargeUsd"] = budget_usd actor_path = urllib.parse.quote(actor_id, safe="") url = f"https://api.apify.com/v2/acts/{actor_path}/run-sync-get-dataset-items?{urllib.parse.urlencode(params)}" ``` ```python parser.add_argument("--apify-token") ``` ### Technical Analysis The runner permits the Apify credential to be supplied through the `--apify-token` command-line option. Command-line arguments can be retained in shell history and may be visible in process inspection facilities to other accounts with sufficient local permissions. Regardless of whether the token originates from the environment or the command line, `run_actor` places it in the URL query string as `token=`. HTTPS protects the URL from passive network observers while it is in transit, but query strings are frequently captured by application diagnostics, HTTP debugging tools, endpoint monitoring, proxy infrastructure, or telemetry. Credential-bearing URLs may also be copied or disclosed during trouble ...[truncated 1308 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
README.md:65
Finding

Installation Instructions Execute an Unpinned Package Through npx

Content
View full analysis
Remediation
View remediation
add hundevmode/apify-website-email-scraper-agent-skill \ --skill website-email-scraper-apify ``` 2. Document the expected registry and official package publisher so users can verify package provenance. 3. Publish and verify package integrity hashes or signatures where the distribution tooling supports them. 4. Avoid `-y` in security-sensitive installation instructions so users can review prompts and resolved package details. 5. Recommend inspecting the resolved package version before execution. 6. Periodically review and update the pinned version rather than relying on the latest registry release. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (13)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
8. Run `scripts/website_email_scraper_actor.py` or call the Apify API directly.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
8. Run `scripts/website_email_scraper_actor.py` or call the Apify API directly.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
8. Run `scripts/website_email_scraper_actor.py` or call the Apify API directly.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
8. Run `scripts/website_email_scraper_actor.py` or call the Apify API directly.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill requires environment access, file reads, and network access to call the Apify API, but it does not declare an explicit tool scope such as permissions or allowed-tools. That creates an avoidable trust gap: an agent platform may grant broader capabilities than intended, making it harder to constrain or audit what the skill can access during execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This skill is designed to extract emails, phone numbers, and social links from websites, and it even supports includePersonalData=true, but the user-facing description does not clearly warn that personal contact data may be collected and processed. In a lead-enrichment context, that omission increases the risk of privacy misuse, non-compliant data handling, and users unintentionally scraping personal information without informed consent or appropriate legal basis.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The contract explicitly supports extraction of person-like emails, phone numbers, and personal LinkedIn URLs from public websites, but it provides no privacy notice, permitted-use constraints, or guidance for handling personal data. Even though the data is publicly accessible, collecting and operationalizing it at scale increases privacy, compliance, and misuse risk, especially for lead generation, profiling, or unsolicited contact.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill is marketed for collecting public business contact details, but it sets includePersonalData to True by default in both normalized and quick-run payloads. That creates a privacy and data-minimization issue because users may unintentionally collect personal emails or other personal contact data beyond the stated business-purpose scope.

Content

No source excerpt is available for this finding.

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/website_email_scraper_actor.py (reported line 183)May include surrounding context.

python
params["maxTotalChargeUsd"] = budget_usd

    actor_path = urllib.parse.quote(actor_id, safe="")
    url = f"https://api.apify.com/v2/acts/{actor_path}/run-sync-get-dataset-items?{urllib.parse.urlencode(params)}"
    request = urllib.request.Request(
        url,
        data=json.dumps(payload).encode("utf-8"),

Scope Creep

Low
Category
Excessive Agency
Confidence
70% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · LICENSE (reported line 12)May include surrounding context.

text
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE