live · scanning repos
Scanrepo
github.com
github.com / scrapy

scrapy/scrapy

Python·676 files·commit eb778e6·scanned 10d ago·cached ✓
15/100
LOW RISK
Minor findings consistent with the project type. Nothing reachable from install hooks.

score capped at 1564,027+ stars — findings likely false positives

verdict accurate?
64,027 stars
Partial architecture graph
threat-state: lowlive

FINDINGS ░▒▓

criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.scrapy/utils/engine.py
        try:
            checks += [(test, eval(test))]  # noqa: S307
        except Exception as e:
            checks += [(test, f"{type(e).__name__} (exception)")]
+8
criticalPython dynamic code executioneval(), exec() or compile() on untrusted input can execute arbitrary code. Common in Python malware for running obfuscated payloads.scrapy/utils/engine.py
        try:
            checks += [(test, eval(test))]  # noqa: S307
        except Exception as e:
            checks += [(test, f"{type(e).__name__} (exception)")]
+7
warningPython subprocess / os.system usageos.system() or subprocess with shell=True / suspicious commands can execute arbitrary shell commands. Plain pip/package installs are usually benign.scrapy/commands/edit.py
    """
    return subprocess.call([*shlex.split(editor), os.fspath(file_path)])  # noqa: S603

+4
criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.scrapy/extensions/remote_control.py
        try:
            # eval() returns a coroutine if and only if the source used a top-level await,
            # else it runs synchronously and returns None.
            eval_result = eval(code_o...
+8
criticalPython dynamic code executioneval(), exec() or compile() on untrusted input can execute arbitrary code. Common in Python malware for running obfuscated payloads.scrapy/extensions/remote_control.py
        try:
            # eval() returns a coroutine if and only if the source used a top-level await,
            # else it runs synchronously and returns None.
            eval_result = eval(code_o...
+7
criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.scrapy/shell.py
        if self.code:
            print(eval(self.code, globals(), self.vars))  # noqa: S307
        else:
            # Detect interactive shell setting in scrapy.cfg
+8
criticalPython dynamic code executioneval(), exec() or compile() on untrusted input can execute arbitrary code. Common in Python malware for running obfuscated payloads.scrapy/shell.py
        if self.code:
            print(eval(self.code, globals(), self.vars))  # noqa: S307
        else:
            # Detect interactive shell setting in scrapy.cfg
+7
infoSuspicious files are not reachable from entry pointsFlagged files exist but are not imported by any entry point. They may be dead code, tests, or attack payloads triggered by another mechanism.+2
warningHigh-entropy string literalsFound 5 long strings with high Shannon entropy. This is common in obfuscated payloads that hide URLs, keys, or bytecode.tests/utils/bases/download_handlers_http.py+3
warningHigh-entropy string literalsFound 11 long strings with high Shannon entropy. This is common in obfuscated payloads that hide URLs, keys, or bytecode.tests/utils/bases/http_request.py+3
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.docs/conf.py+3
warningHigh-entropy string literalsFound 3 long strings with high Shannon entropy. This is common in obfuscated payloads that hide URLs, keys, or bytecode.scrapy/core/_http2/protocol.py+3
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.tests/spiders.py+3
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.tests/test_exporters.py+3

Scores are heuristics. A “safe” verdict means no known-malicious patterns were found — clever malware can look boring. Wrong verdict? Flag it above; confirmed false positives become regression tests.

468 files scanned @ eb778e6 | 8/25/2026 | heuristic scan — always review manually

risk by category
code execution25
network & exfiltration0
file system access0
obfuscation15
supply chain0
owasp / injection0
telemetry
files 468/676rules hit 14engine v5commit eb778e6

github

scrapy/scrapy

Scrapy, a fast high-level web crawling & scraping framework for Python.

Python
64027
11921
6039d
676 files
468 scanned(69%)
eb778e6

architecture░▒▓

entry (0) flagged (45) pkg (414)
814 nodes · 3851 edgesscroll to zoom · click node to jump to finding