T09 · Insecure Skill Coding Practices
- Location
core/crawl_runner.py:84- Finding
Unrestricted URL Fetching Enables Server-Side Request Forgery
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a real web crawler, but it can follow untrusted links to arbitrary network locations and its research presets disable robots.txt checks by default.
Install only in an isolated environment with limited network reach, avoid running it where localhost, private network services, or cloud metadata endpoints are accessible, review or change the presets to respect robots.txt, and pin dependencies before operational use. Treat person-research outputs and the SQLite cache as potentially sensitive because crawled content is stored locally.
core/crawl_runner.py:84Unrestricted URL Fetching Enables Server-Side Request Forgery
requirements.txt:1Unpinned Dependencies Permit Unreviewed Supply-Chain Changes
This progress file uses Turkish throughout for status headings and descriptions, which imposes a specific language on readers without any indication of user opt-in or a documented regional constraint. Under the policy rule, forcing a specific language without offering choice or justification is a natural-language policy violation.
This markdown file documents a crawler that performs web research and writes results to output files, including examples involving a person's name, but it does not warn users about collecting, storing, or handling potentially sensitive personal data. For markdown files, SQP-2 applies when the skill description omits warnings about behaviors that could affect user data, privacy, or system integrity.
The skill documentation declares no explicit tool scope even though the skill’s described behavior clearly implies network access plus file read/write for crawling, checkpointing, and output generation. Missing permission boundaries increases the chance that an agent runtime grants broader capabilities than intended, making misuse or unintended data access harder to prevent or audit.
This code initializes a crawler that will fetch remote URLs and also sets up local cache/output storage, but the file provides no confirmation prompt, user-facing log, or explanatory comment/docstring warning that network requests and file writes will occur. Because these operations can affect privacy and local data handling, they meet the missing-disclosure criteria for code files.
The runner periodically saves checkpoints and writes a final report to disk, but there is no prompt, print/log statement, or explanatory comment/docstring informing the user that files will be created or updated. These are direct file-write operations and should be disclosed when no other warning is present in the code.
The argument help strings and related user-facing text are written only in Turkish, which imposes a specific language on all users without opt-in or alternative locale support. This matches the policy category for language or locale constraints that are not documented as optional or justified.
Both built-in presets set no_robots: True, which causes the crawler to ignore robots.txt restrictions by default for common research modes. In a web-crawling skill, shipping bypass behavior as a preset increases the likelihood of unauthorized or policy-violating collection, and the deterministic/research framing does not justify disabling a standard access-control signal.
The presets embed a robots.txt bypass capability for ordinary 'person-research' and 'deep-research' use cases without any narrow justification or safety guardrails. This makes misuse easier at scale, especially because these are ready-to-use defaults paired with relatively high page limits and concurrency.
The README contains the description "Scrapling tabanlı, browser'sız crawler." in Turkish, while the rest of the file is in English and there is no indication that the skill is intentionally region- or language-specific. This can violate a language/locale policy because it imposes a specific language on users without opt-in or justification.
At L06-L07, the function writes checkpoint data to disk using path.write_bytes(...), but there is no confirmation prompt, logging, print statement, or explanatory comment/docstring disclosing this file write. For a code file, file writes are in scope for missing-user-warning review when no visible disclosure is present in the file.
The inline comment at L22 is written in Turkish while the rest of the file is in Python and adjacent comments are in English. This creates a language-specific constraint in natural-language content without offering choice or documenting a justified locale requirement.
The dependency is specified with a lower-bound only, which allows future installs to resolve to different versions over time. This weakens build reproducibility and can unintentionally introduce vulnerable or breaking upstream releases through the software supply chain.
selectolax>=0.3.21
tenacity>=8.2.3
orjson>=3.10.0
scrapling>=0.2.96
Using an unpinned version range for this package permits non-deterministic dependency resolution across environments and over time. That increases supply-chain risk because a newly released compromised or vulnerable version could be installed without any change to this repository.
selectolax>=0.3.21
tenacity>=8.2.3
orjson>=3.10.0
scrapling>=0.2.96
The package is not pinned to an exact version, and the same file also shows this dependency has known advisories in some releases. Because installs may select any version at or above the minimum, affected versions could be pulled in, making this more dangerous than a generic reproducibility issue.
selectolax>=0.3.21
tenacity>=8.2.3
orjson>=3.10.0
scrapling>=0.2.96
The manifest does not pin orjson, and known advisories exist for some versions involving uncontrolled recursion on deeply nested JSON input. In a crawler-oriented skill that may process untrusted remote data, this can plausibly lead to denial of service through excessive recursion, crashes, or resource exhaustion if an affected version is installed.
A lower-bounded but unpinned dependency introduces supply-chain and reproducibility risk by allowing different resolved versions on different installs. In a crawler skill that fetches and processes external content, unexpected dependency changes can affect parsing behavior and security posture.
selectolax>=0.3.21
tenacity>=8.2.3
orjson>=3.10.0
scrapling>=0.2.96
No suspicious patterns detected.