Skip to main content

Pylint CVE-2026-114608

| EUVDEUVD-2026-108257 MEDIUM
Deserialization of Untrusted Data (CWE-502)
2026-10-22 GitHub_M GHSA-22qq-2fwx-7p67
5.4
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Gain write access to shared PYLINT_HOME cache
  2. Exploit
    Replace stats cache with crafted pickle
  3. Execution
    Victim runs Pylint, pickle.load deserializes payload
  4. Impact
    Arbitrary code executes as victim user

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V1 - Encoding and Sanitization Safe deserialization, type allowlists
MITRE ATT&CK

2 techniques across 2 tactics: Execution, Initial Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires PYLINT_HOME to resolve to a shared, group-writable, or otherwise untrusted directory AND the attacker to have write access to that cache directory so they can overwrite the predictable module-statistics pickle file; the victim must then run Pylint (any version from 0.15.2 up to but not including 4.0.9), which reloads the cache via pickle.load. The exploit is explicitly NOT possible against the default configuration: the default cache ~/.cache/pylint is writable only by the user running Pylint, so this is a multi-user/shared-host and CI-runner concern rather than a default-install flaw. Limiting factors: local access only, attacker needs a foothold on the host, a non-default or misconfigured shared PYLINT_HOME, and victim-triggered execution (the next Pylint run).

Impact

This is a genuine CWE-502 pickle-deserialization code-execution flaw (CVSS 4.0 base 5.4, Medium) that is correctly rated as a real but conditional issue rather than an emergency - the vuln.today Decision label is 'this_month', not act_now/emergency. The supplied CVSS 4.0 vector tells a consistent story: local vector (AV:L), high attack complexity (AC:H), a present attack requirement (AT:P), low privileges (PR:L), and passive user interaction (UI:P) gated behind high confidentiality/integrity/availability impact (VC:H/VI:H/VA:H) with no scope/subsequent-system effect. No EPSS score and no KEV status were provided; absence of KEV means this is NOT confirmed as actively exploited, and the lack of an EPSS figure means widespread-exploitation probability cannot be quantified from the input - state this as a gap rather than assuming low risk. The references are the GitHub Security Advisory, two fix commits, and the release tag; none is an exploit, and the input does not mark any PoC as 'Publicly available (confirmed)', so there is no public exploit identified at time of analysis. The decisive risk limiter is architectural: exploitation requires an attacker-writable PYLINT_HOME, and the default per-user cache (~/.cache/pylint) is writable only by the running user, so the attack surface collapses to multi-user hosts with a shared or group-writable cache. Net: a legitimately impactful RCE in a hugely popular tool, but a narrow precondition keeps real-world priority moderate - patch on a normal cycle, prioritize shared-host/CI environments.

Exploit ScenarioDerived

On a multi-user build server where PYLINT_HOME points to a shared, group-writable cache directory, a low-privileged attacker overwrites the predictable stats cache file with a crafted pickle payload. When another user (e.g. a developer or a CI service account) next runs Pylint, pickle.load deserializes the malicious file and executes arbitrary code with that victim's privileges. No public exploit is identified in the input, but the pickle-RCE technique is well understood and the fix commit confirms the vulnerable code path.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 22, 2026

Arbitrary code execution in Pylint (0.15.2 through 4.0.8) stems from the linter persisting its per-module statistics as Python pickles inside PYLINT_HOME and reloading them with pickle.load on the next invocation. An attacker who can write into that cache directory - for example a shared, group-writable, or otherwise untrusted PYLINT_HOME on a multi-user host or CI runner - can drop a crafted serialized stats file with a predictable name, and code then executes with the privileges of whoever next runs Pylint against that cache. The default per-user cache (~/.cache/pylint) is writable only by the invoking user, so exploitation requires a non-default or misconfigured shared cache plus local write access; no public exploit code or confirmed active exploitation was identified at time of analysis, and the vuln.today priority label is 'this_month'.

RemediationAI

Vendor-released patch: upgrade to Pylint 4.0.9, where the stats cache is stored and read as JSON instead of pickle (release notes at https://github.com/pylint-dev/pylint/releases/tag/v4.0.9, advisory GHSA-22qq-2fwx-7p67). Alternatively, apply the upstream commits 58c87cffca9de2b3e89aa07b89686cbc90cfea2d and 5b241f66318220e9ba7b21ca631fbfe8e77682ca if a pin upstream of a tagged release is required, though a released patched version is confirmed at 4.0.9. As an interim workaround the vendor states that PYLINT_HOME must not point at an untrusted, shared, or group-writable directory; the default ~/.cache/pylint is writable only by the user running Pylint, so leaving PYLINT_HOME unset or redirecting it to a per-user, non-shared path removes the attack primitive. After upgrading, delete pre-existing pickle-based stats cache files: the new JSON loader rejects them with a UserWarning asking you to remove the stale file, so they are no longer deserialized and the warning is expected until cleaned up.

Affected VersionsENISA

pylint < 4.0.9

Affected Packages

pypi pylint fix: 4.0.9

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Pylint is a Python static analyser; since 2006 (release 0.15.2) its result cache module (pylint/lint/caching.py) wrote LinterStats objects to disk with pickle.dump and read them back with pickle.load during save_results/load_results. Because pickle is a code-execution format rather than a data format, any file the loader accepts can instantiate arbitrary objects and run arbitrary callables via __reduce__. This is the classic CWE-502 (Deserialization of Untrusted Data) pattern: the root cause is not a memory-safety bug but trust in the integrity of a cache path derived from PYLINT_HOME, where the statistics filenames are predictable (_get_pdata_path) so a co-located user can target them directly. The upstream fix (commits 58c87cffca9de2b3e89aa07b89686cbc90cfea2d and 5b241f66318220e9ba7b21ca631fbfe8e77682ca, released as v4.0.9) replaces pickle with JSON, adding _stats_to_dict/_stats_from_dict helpers that serialize the two set-valued fields (modules_names, dependencies) as sorted lists and rebuild them on load, and it also corrects save_results to compute the cache path using pylint_home. A cache that fails to parse is now tolerated with a UserWarning instructing the user to delete the stale file rather than being unpickled.

Know when Pylint gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 5.4 MEDIUM
CVSS:4.0/AV:L/AC:H/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
vuln.today AI 6.7 MEDIUM

Local attack via a shared cache (AV:L), non-default shared/writable PYLINT_HOME raises AC:H, a local account is needed (PR:L), and the victim must run Pylint (UI:R), yielding full code execution as that user (C/I/A:H).

3.1 AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
4.0 AV:L/AC:H/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Red Hat 6.7 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Local
Attack Complexity
High
Attack Requirements
Present
Privileges Required
Low
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Oct 22, 2026 - 18:18 EUVD
CVE Published
Oct 22, 2026 - 16:50 cve.org
MEDIUM 5.4

DescriptionCVE.org

Pylint is a static code analyser for Python. From 0.15.2 until 4.0.9, Pylint stores module statistics in predictable files under PYLINT_HOME and loads those files with pickle.load on a later run. An attacker who can write to a shared, group-writable, or otherwise untrusted cache directory can replace a stats cache with crafted serialized data, causing arbitrary code to execute with the privileges of the user who next runs Pylint. The default per-user cache is not normally writable by another user. This issue is fixed in version 4.0.9.

Threat Intelligence Overview

EPSS Score
0.1%
Top 99% exploitable
Prevalence
High
extremely common Python static-analysis tool across developer and CI environments
Threat Intel
1
1 source
Social Media
1
Sightings
Data Quality
3 sources
Confidence: Low

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact· derived
High

Priority Score

27
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +27
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Insecure deserialization occurs when an application converts serialized data (a stream of bytes representing an object's state) back into a living object without proper validation.

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy