{"schemaVersion":3,"id":"CVE-2021-39160","aliases":["GHSA-mq5p-2mcr-m52j","PYSEC-2021-315"],"status":"published","duplicateOf":null,"title":null,"description":"nbgitpuller is a Jupyter server extension to sync a git repository one-way to a local path. Due to unsanitized input, visiting maliciously crafted links could result in arbitrary code execution in the user environment. This has been resolved in version 0.10.2 and all users are advised to upgrade. No work around exist for users who can not upgrade.","dates":{"published":"2021-08-25T18:10:11.000Z","modified":"2024-08-04T01:58:18.218Z","reserved":null,"kevAdded":[],"kevDue":[]},"cvss":{"headline":{"score":9.6,"severity":"critical","version":"3.1","versionLabel":"v3.1","source":"CVE.org","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H","computed":false,"selection":"backend-summary"},"metrics":[{"version":"3.1","versionLabel":"v3.1","source":"CVE.org","score":9.6,"severity":"critical","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H","exploitability":null,"impact":null,"computed":false},{"version":"4.0","versionLabel":"v4.0","source":"OSV · Pypi","score":8.7,"severity":"high","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","exploitability":null,"impact":null,"computed":true},{"version":"3.1","versionLabel":"v3.1","source":"OSV · Pypi","score":8.8,"severity":"high","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","exploitability":7.2,"impact":9.8,"computed":true},{"version":"3.1","versionLabel":"v3.1","source":"NVD","score":8.8,"severity":"high","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","exploitability":null,"impact":null,"computed":false},{"version":"2.0","versionLabel":"v2.0","source":"NVD","score":6.8,"severity":"medium","vector":"AV:N/AC:M/Au:N/C:P/I:P/A:P","exploitability":null,"impact":null,"computed":false}]},"epss":{"probability":0.0173,"percentile":0.77292,"severity":"low","asOf":"2026-10-20T00:00:00.000Z","change":{"pp":0,"baselineDate":"2026-09-20T00:00:00.000Z","baselineScore":0.0173},"history":[{"date":"2026-09-14T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-15T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-16T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-17T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-18T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-19T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-20T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-21T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-22T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-23T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-24T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-25T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-26T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-27T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-28T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-29T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-30T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-01T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-02T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-03T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-04T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-05T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-06T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-07T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.0173,"percentile":0.77292}],"last30":[{"date":"2026-09-20T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-21T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-22T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-23T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-24T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-25T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-26T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-27T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-28T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-29T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-09-30T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-01T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-02T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-03T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-04T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-05T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-06T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-07T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.0173,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.0173,"percentile":0.77292}]},"kev":{"state":"not-listed","entries":[],"listedCount":0,"totalCatalogs":3,"catalogs":[{"source":"cisa","label":"CISA","listed":false,"entry":null},{"source":"enisa","label":"ENISA","listed":false,"entry":null},{"source":"circl","label":"CIRCL","listed":false,"entry":null}]},"ransomware":{"state":"none-recorded","sources":[]},"exploits":[],"exploitCount":0,"weaknesses":[{"id":"CWE-94","name":"Improper Control of Generation of Code ('Code Injection')","description":"The product constructs all or part of a code segment using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the syntax or behavior of the intended code segment.","type":"weakness","status":"Draft","abstraction":"Base","likelihoodOfExploit":"Medium","url":"https://cwe.mitre.org/data/definitions/94.html"},{"id":"CWE-78","name":"Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')","description":"The product constructs all or part of an OS command using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the intended OS command when it is sent to a downstream component.","type":"weakness","status":"Stable","abstraction":"Base","likelihoodOfExploit":"High","url":"https://cwe.mitre.org/data/definitions/78.html"}],"affected":[{"vendor":"jupyterhub","product":"nbgitpuller","name":"nbgitpuller","label":"nbgitpuller","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"≥ 0.9.0, < 0.10.2","noFixRecorded":false,"fixedIn":null}],"versionsText":"≥ 0.9.0, < 0.10.2","eol":null,"hubHref":"/vendor/jupyterhub/nbgitpuller"},{"vendor":"PyPI","product":"nbgitpuller","name":"nbgitpuller","label":"nbgitpuller","ecosystem":"PyPI","cpePart":null,"purl":"pkg:pypi/nbgitpuller","purlType":"pypi","versions":[{"text":"< 07690644f29a566011dd0d7ba14cae3eb0490481","noFixRecorded":false,"fixedIn":null},{"text":"≥ 0.9.0, < 0.10.2","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 07690644f29a566011dd0d7ba14cae3eb0490481 | ≥ 0.9.0, < 0.10.2","eol":null,"hubHref":null}],"affectedCount":2,"eol":{"hasEol":false,"count":0},"references":[{"url":"https://github.com/jupyterhub/nbgitpuller/security/advisories/GHSA-mq5p-2mcr-m52j","label":"github.com/jupyterhub/nbgitpuller/security/advisories/GHSA-mq5p-2mcr-m52j","hostname":"github.com","tags":["X Refsource CONFIRM","WEB","Advisory","Third Party Advisory"]},{"url":"https://github.com/jupyterhub/nbgitpuller/commit/07690644f29a566011dd0d7ba14cae3eb0490481","label":"github.com/jupyterhub/nbgitpuller/commit/07690644f29a566011dd0d7ba14cae3eb0490481","hostname":"github.com","tags":["X Refsource MISC","WEB","FIX","Patch","Third Party Advisory"]},{"url":"https://github.com/jupyterhub/nbgitpuller/blob/main/CHANGELOG.md#0102---2021-08-25","label":"github.com/jupyterhub/nbgitpuller/blob/main/CHANGELOG.md","hostname":"github.com","tags":["X Refsource MISC","WEB","Release Notes","Third Party Advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2021-39160","label":"nvd.nist.gov/vuln/detail/CVE-2021-39160","hostname":"nvd.nist.gov","tags":["Advisory"]},{"url":"https://github.com/jupyterhub/nbgitpuller","label":"github.com/jupyterhub/nbgitpuller","hostname":"github.com","tags":["PACKAGE"]},{"url":"https://github.com/pypa/advisory-database/tree/main/vulns/nbgitpuller/PYSEC-2021-315.yaml","label":"github.com/pypa/advisory-database/tree/main/vulns/nbgitpuller/PYSEC-2021-315.yaml","hostname":"github.com","tags":["WEB"]}],"lineage":{"upstream":[],"downstream":[],"duplicates":[],"related":[]},"timeline":[{"kind":"published","date":"2021-08-25T18:10:11.000Z","label":"Published","detail":"Vulnerability first disclosed.","source":null},{"kind":"modified","date":"2024-08-04T01:58:18.218Z","label":"Last modified","detail":"Vulnerability information updated.","source":null}],"risk":{"score":70,"level":"high","profile":"Default","thresholds":{"critical":75,"high":50,"medium":25,"low":10}},"meta":{"dataAsOf":"2026-10-21T06:56:45.632Z","stale":false,"partial":false}}