Zraniteľnosť knižnice Python libarchive umožňuje Directory Traversal

Bezpečnostní analytici CSIRT.SK objavili zraniteľnosť v Python knižnici libarchive, ktorá umožňuje vykonávať útoky typu directory traversal.

Zraniteľné systémy:

  • libarchive – 4.2.1

Vyššie uvedená verzia bola otestovaná. Nemôžeme vylúčiť, že zraniteľné sú aj staršie verzie.

Opis činnosti:

CVE-2024-55587

Zraniteľnosť sa nachádza v najnovšej verzii knižnice libarchive (4.2.1) a súvisí s absenciou ošetrovania názvov súborov nachádzajúcich sa v poskytnutom súbore ZIP. Táto zraniteľnosť sa nachádza v triede ZipFile v metódach extractextractall. V prípade, že názvy súborov v nahranom súbore ZIP obsahujú relatívnu cestu (../) alebo aj absolútnu cestu (/tmp/test.txt) je možné danú zraniteľnosť zneužiť nasledovným spôsobom.

Keď napríklad vytvoríme súbor ZIP pomocou nasledovného Python kódu:

import pyzipper
import time
with pyzipper.ZipFile("exploit.zip", 'w', compression=pyzipper.ZIP_LZMA) as zf:
    current_time = time.localtime(time.time())[:6]
    zip_info = zf.zipinfo_cls(filename="/tmp/vulnerable.txt",  date_time=current_time)
    zf.writestr(zip_info, "vulnerable")

Vytvorí sa nám súbor ZIP s názvom exploit.zip obsahujúci jediný súbor s názvom /tmp/vulnerable.txt.

Keď následne tento súbor extrahujeme za pomoci zraniteľnej metódy extractall:

from libarchive.zip import ZipFile

with ZipFile("exploit.zip",  mode="r") as archive:
    archive.extractall(path="./")

V adresári /tmp sa nám vytvorí súbor s názvom vulnerable.txt, ktorý bude obsahovať text „vulnerable“.

Táto zraniteľnosť sa nachádza v súbore libarchive/zip.py na riadku 107:

return self.readpath(name, os.path.join(path, name))

kde premenná name nie je ošetrovaná. Vzhľadom na správanie metódy join v module path knižnice os teda novou cestou bude posledná zadaná absolútna cesta, t.j. nami zadaný názov súboru /tmp/vulnerable.txt.
Zneužitím danej zraniteľnosti môže dôjsť napríklad ku získaniu prístupu na server prepísaním súboru authorized_keys, nachádzajúceho sa v podpriečinku .ssh domovského priečinku používateľa.

Zraniteľnosť bola overovaná s použitím nasledujúcich verzií knižníc:

  • libarchive – 4.2.1

Možné škody:

  • Prepísanie citlivých súborov

Odporúčania:

Pokiaľ pri vývoji webovej aplikácie v Python využívate knižnicu libarchive a používate metódu extract alebo extractall s použitím súboru ZIP, ktorý poskytol požívateľ, odporúčame zvážiť zmenu používanej knižnice na modernejšie alternatívy ako napríklad pyzipper.

Odkazy: