Back to skill

Security audit

Iran Chemical Database

Security checks across malware telemetry and agentic risk

Overview

The skill is a coherent crawler/database application, but it starts persistent networked services and automated web crawling with several security hardening gaps that warrant Review before installation.

Install only in a contained trusted environment. Review the supplier list and crawl schedule before starting workers, keep Redis/API/dashboard off public interfaces or add authentication, use egress allowlisting where possible, avoid cookie-based crawling unless you have explicit authorization, and pin dependencies for production use.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (46)

subprocess module call

Medium
Category
Dangerous Code Execution
Content
start_time = datetime.now()
        try:
            result = subprocess.run(
                cmd, capture_output=True, text=True,
                timeout=config.max_time + 300, cwd=str(self.base_dir),
            )
Confidence
86% confidence
Finding
result = subprocess.run( cmd, capture_output=True, text=True, timeout=config.max_time + 300, cwd=str(self.base_dir), )

subprocess module call

Medium
Category
Dangerous Code Execution
Content
f"--depth={depth}", "--stay-on-same-domain", "--connection-per-second=1", "-q",
        ]
        try:
            result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
            return {"return_code": result.returncode, "url_count": len(urls),
                    "timed_out": False}
        except subprocess.TimeoutExpired:
Confidence
84% confidence
Finding
result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)

Lp3

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding
The skill explicitly declares unrestricted outbound network access and provides instructions to run shell commands, manage environment variables, read/write files, and operate local services, yet it lacks a formal permissions model beyond metadata. For an agent skill, this creates a real over-privilege risk: if invoked without tight sandboxing, it can crawl arbitrary hosts, modify local state, and access secrets from .env or the environment.

Intent-Code Divergence

Medium
Confidence
92% confidence
Finding
The README makes a contradictory security claim: it says 'No secrets are read, stored, logged, or transmitted' while elsewhere explicitly documenting that DB_PASSWORD and optional API keys are read from the environment or .env. Misstating secret handling can mislead operators about the application's trust boundary and cause unsafe deployment assumptions, even if the code only reads secrets in a conventional way.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The code explicitly supports crawling login-required sites by accepting arbitrary cookies and passing them to HTTrack. In a system whose stated scope is public supplier catalogues, this expands collection into authenticated content and creates a pathway for misuse, unauthorized access, and leakage of session material via process arguments, logs, or configuration persistence.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The module-level documentation promises that the parser never fetches from the internet, but the constructor wires in network-capable components by default: ChemicalValidator may resolve CAS data remotely and OrganicClassifier defaults to network_lookup=True from config. This creates a trust-boundary mismatch where operators may process untrusted mirrored content believing the stage is offline, while the code can still trigger outbound requests, causing data leakage, policy violations, or unexpected interaction with external services.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The documentation describes automatic supplier discovery using search engines, directory crawling, HTTrack mirroring, link analysis, and registry queries, but it does not place a prominent operational warning near those steps that they trigger external network access and may mirror third-party sites. In a security-sensitive or regulated environment, this can lead users to initiate outbound scanning/crawling behavior without fully understanding legal, privacy, bandwidth, attribution, or monitoring consequences.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The `/rejections` endpoint returns raw rejected catalogue fields such as `raw_title`, `cas_number`, rejection stage, and reason without any authentication, authorization, or data-minimization controls shown in this route. In an academic chemical procurement context, these records can reveal sensitive supplier catalogue content, internal validation outcomes, and potentially controlled or commercially sensitive chemical listings, making unauthorized enumeration and data harvesting more impactful.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
Creating a cookie-bearing crawler configuration with no visible warning or disclosure normalizes the use of sensitive session material in an automated mirroring tool. This increases the chance that operators unknowingly feed live authentication cookies into a crawler, leading to credential mishandling, overcollection of restricted data, or accidental persistence of secrets in logs and job metadata.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
Automatically appending cookies to crawler flags means any supplied cookie is silently propagated into the HTTrack invocation, potentially exposing session secrets through process listings, error messages, telemetry, or persisted configs. Because this occurs in the generic profile-selection path, authenticated access can be enabled more broadly than intended and without clear operator awareness.

Missing User Warnings

Medium
Confidence
72% confidence
Finding
Name-based resolution can transmit raw or normalized record titles to PubChem, and supplier titles may contain more than just chemical identity, such as commercial wording, grades, lot-like strings, or organization-specific catalog text. In this academic procurement research context, exporting third-party catalogue text to an external service creates a real data-sharing/privacy risk, especially because the fallback retries with the raw title if normalization fails.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
Organic classification enables network-backed lookup by default via configuration fallback, with no local warning at the point of use. In a pipeline advertised as operating on local mirrors, this can silently send extracted chemical identifiers or product metadata to third-party services, undermining operator expectations and potentially exposing sensitive research or procurement activity.

Credential Access

High
Category
Privilege Escalation
Content
# Load local values for the installer without logging them.
set -a
# shellcheck disable=SC1091
. ./.env
set +a

if [ -z "${DB_PASSWORD:-}" ] || [ "$DB_PASSWORD" = "change-this-to-a-long-random-password" ]; then
Confidence
94% confidence
Finding
.env

Unpinned Dependencies

Low
Category
Supply Chain
Content
# HTTrack-powered live crawling architecture (see SKILL.md / docs/)

# ---- API / web ----
fastapi>=0.115
uvicorn[standard]>=0.30
pydantic>=2.8
pydantic-settings>=2.4
Confidence
95% confidence
Finding
fastapi>=0.115

Unpinned Dependencies

Low
Category
Supply Chain
Content
# ---- API / web ----
fastapi>=0.115
uvicorn[standard]>=0.30
pydantic>=2.8
pydantic-settings>=2.4
python-multipart>=0.0.9
Confidence
95% confidence
Finding
pydantic>=2.8

Unpinned Dependencies

Low
Category
Supply Chain
Content
fastapi>=0.115
uvicorn[standard]>=0.30
pydantic>=2.8
pydantic-settings>=2.4
python-multipart>=0.0.9

# ---- Database ----
Confidence
94% confidence
Finding
pydantic-settings>=2.4

Unpinned Dependencies

Low
Category
Supply Chain
Content
uvicorn[standard]>=0.30
pydantic>=2.8
pydantic-settings>=2.4
python-multipart>=0.0.9

# ---- Database ----
sqlalchemy>=2.0
Confidence
98% confidence
Finding
python-multipart>=0.0.9

Unpinned Dependencies

Low
Category
Supply Chain
Content
python-multipart>=0.0.9

# ---- Database ----
sqlalchemy>=2.0
psycopg2-binary>=2.9
alembic>=1.13
redis>=5.0
Confidence
93% confidence
Finding
sqlalchemy>=2.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
# ---- Database ----
sqlalchemy>=2.0
psycopg2-binary>=2.9
alembic>=1.13
redis>=5.0
Confidence
93% confidence
Finding
psycopg2-binary>=2.9

Unpinned Dependencies

Low
Category
Supply Chain
Content
# ---- Database ----
sqlalchemy>=2.0
psycopg2-binary>=2.9
alembic>=1.13
redis>=5.0

# ---- Task queue ----
Confidence
92% confidence
Finding
alembic>=1.13

Unpinned Dependencies

Low
Category
Supply Chain
Content
sqlalchemy>=2.0
psycopg2-binary>=2.9
alembic>=1.13
redis>=5.0

# ---- Task queue ----
celery>=5.4
Confidence
93% confidence
Finding
redis>=5.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
redis>=5.0

# ---- Task queue ----
celery>=5.4

# ---- Crawling / mirroring ----
# httrack is a SYSTEM package:  sudo apt install httrack libhttrack-dev
Confidence
93% confidence
Finding
celery>=5.4

Unpinned Dependencies

Low
Category
Supply Chain
Content
# httrack is a SYSTEM package:  sudo apt install httrack libhttrack-dev

# ---- HTML parsing (local mirror files only) ----
beautifulsoup4>=4.12
lxml>=5.2
parsel>=1.9
Confidence
91% confidence
Finding
beautifulsoup4>=4.12

Unpinned Dependencies

Low
Category
Supply Chain
Content
# ---- HTML parsing (local mirror files only) ----
beautifulsoup4>=4.12
lxml>=5.2
parsel>=1.9

# ---- PDF / Excel parsing ----
Confidence
98% confidence
Finding
lxml>=5.2

Unpinned Dependencies

Low
Category
Supply Chain
Content
# ---- HTML parsing (local mirror files only) ----
beautifulsoup4>=4.12
lxml>=5.2
parsel>=1.9

# ---- PDF / Excel parsing ----
pdfplumber>=0.11
Confidence
90% confidence
Finding
parsel>=1.9

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
install.sh:65

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
tests/test_packaging.py:71