CVE-2020-13092
scikit-learn Deserialization of Untrusted Data
CVE-2020-13092 is a critical vulnerability (CVSS 9.8) in Scikit-learn, published May 15, 2020. Its validity is disputed. EPSS puts the chance of exploitation in the next 30 days at 3.41%, the 88th percentile. Fixed in scikit-learn 0.23.1.
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if reduce makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
NVD Score used
9.8
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if reduce makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner
- Record
CVE-2020-13092- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - CVSS 2.0
- 7.5 High
AV:N/AC:L/Au:N/C:P/I:P/A:P - Weakness
- CWE-502
- Updated
- 2026-11-02
CVE List No score
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if reduce makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner
- Record
CVE-2020-13092- Updated
- 2026-11-02
EUVDEUVD-2020-0179 No score
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if reduce makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner
- Record
EUVD-2020-0179- Updated
- 2026-11-03
GitHub AdvisoriesGHSA-jjw5-xxj6-pcv5
9.8
scikit-learn Deserialization of Untrusted Data
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if __reduce__ makes an os.system call.
NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner.
- Record
GHSA-jjw5-xxj6-pcv5- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-502
- Updated
- 2026-11-02
OSV
9.8
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if reduce makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner
- Record
CVE-2020-13092- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
OSVDEBIAN-CVE-2020-13092
9.8
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if reduce makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner
- Record
DEBIAN-CVE-2020-13092- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
OSVGHSA-jjw5-xxj6-pcv5
9.8
scikit-learn Deserialization of Untrusted Data
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if __reduce__ makes an os.system call.
NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner.
- Record
GHSA-jjw5-xxj6-pcv5- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-502
- Updated
- 2026-11-02
OSVPYSEC-2020-107 No score
** DISPUTED ** scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if reduce makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner.
- Record
PYSEC-2020-107- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
scikit-learnPyPI |
through 0.23.0 | None known |
scikit-learnDebian:12 |
All versions, plus listed versions 1.2.1+dfsg-11.4.1.post1+dfsg-11.4.2+dfsg-11.4.2+dfsg-21.4.2+dfsg-3 Show 16 moreShow less1.4.2+dfsg-41.4.2+dfsg-51.4.2+dfsg-61.4.2+dfsg-71.4.2+dfsg-81.7.2+dfsg-11.7.2+dfsg-21.7.2+dfsg-31.7.2+dfsg-41.8.0+dfsg-11.8.0+dfsg-21.8.0+dfsg-31.8.0+dfsg-41.8.0+dfsg-51.9.0+dfsg-11.9.0+dfsg-2 |
None known |
scikit-learnDebian:13 |
All versions, plus listed versions 1.4.2+dfsg-81.7.2+dfsg-11.7.2+dfsg-21.7.2+dfsg-31.7.2+dfsg-4 Show 7 moreShow less1.8.0+dfsg-11.8.0+dfsg-21.8.0+dfsg-31.8.0+dfsg-41.8.0+dfsg-51.9.0+dfsg-11.9.0+dfsg-2 |
None known |
scikit-learnDebian:14 |
All versions, plus listed versions 1.4.2+dfsg-81.7.2+dfsg-11.7.2+dfsg-21.7.2+dfsg-31.7.2+dfsg-4 Show 7 moreShow less1.8.0+dfsg-11.8.0+dfsg-21.8.0+dfsg-31.8.0+dfsg-41.8.0+dfsg-51.9.0+dfsg-11.9.0+dfsg-2 |
None known |
scikit-learnPyPI |
through 0.23.0, plus listed versions 0.100.110.120.12.10.13 Show 30 moreShow less0.13.10.140.14.10.15.00.15.10.15.20.16.00.16.10.170.17.10.180.18.10.18.20.19.00.19.10.19.20.20.00.20.10.20.20.20.30.20.40.21.00.21.10.21.20.21.30.220.22.10.22.20.22.2.post10.9 |
None known |
scikit-learnPyPI |
before 0.23.1, plus listed versions 0.100.110.120.12.10.13 Show 43 moreShow less0.13.10.140.14.10.14a10.15.00.15.0b10.15.0b20.15.10.15.20.16.00.16.10.16b10.170.17.10.17b10.180.18.10.18.20.18rc20.19.00.19.10.19.20.19b20.20.00.20.10.20.20.20.30.20.40.20rc10.21.00.21.10.21.20.21.30.21rc20.220.22.10.22.20.22.2.post10.22rc2.post10.22rc30.23.00.23.0rc10.9 |
0.23.1 |
History
| When | Changed | Sources |
|---|---|---|
| 2026-11-03 | aliases | EUVD |
| 2026-11-02 | created | CVE List, GitHub Advisories, NVD, OSV |
References
github.com/0FuzzingQ/vuln/blob/master/sklearn%20unserialize.md
scikit-learn.org/stable/modules/model_persistence.html
nvd.nist.gov/vuln/detail/CVE-2020-13092
github.com/pypa/advisory-database/tree/main/vulns/scikit-learn/PYSEC-2020-107.yaml
github.com/advisories/GHSA-jjw5-xxj6-pcv5
security-tracker.debian.org/tracker/CVE-2020-13092
github.com/scikit-learn/scikit-learn