Kas yra Path Traversal ir kuo tai pavojinga
Autorius: Domeny.ForSale redakcija Paskelbta
Trumpai: Path Traversal – tai saugumo spraga, dėl kurios programa leidžia pasiekti failus už katalogo, skirto konkrečiai užklausai apdoroti, ribų. Dažniausiai ji siejama su svetimų failų skaitymu, tačiau failų įrašymo ar šalinimo funkcijose ji gali leisti juos ir pakeisti arba ištrinti. Problema kyla, kai programa naudotojo pateiktus duomenis naudoja kaip failo kelio dalį ir tinkamai netikrina, kur tas kelias veda.
Ką reiškia išeiti už katalogo ribų
Kelias – tai failo adresas failų sistemoje, pavyzdžiui, /srv/programa/dokumentai/instrukcija.pdf. Dokumentus teikianti programa turėtų leisti atsisiųsti tik failus iš nustatytos vietos, o ne bet kuriuos serveryje pasiekiamus failus.
Path Traversal, dar vadinamas directory traversal arba dot-dot-slash, reiškia šios ribos peržengimą. Pavadinimas dot-dot-slash (liet. „taškas, taškas, pasvirasis brūkšnys“) nurodo seką ../: du taškai žymi pirminį katalogą, o pasvirasis brūkšnys atskiria kelio dalis. Tinkamai panaudota seka gali nukreipti operaciją už leidžiamo katalogo ribų.
Tai galima palyginti su dokumentų išdavimo langeliu. Klientas turėtų pateikti dokumento numerį, o darbuotojas – paimti dokumentą iš reikiamos spintos. Klaida atsiranda tada, kai darbuotojas vietoj numerio priima nurodymą: „išeik iš šios spintos, nueik į gretimą kambarį ir paimk nurodytą failą“.
Pavyzdys: dokumento atsisiuntimas pagal pavadinimą
Tarkime, programa viešus dokumentus saugo kataloge /srv/programa/dokumentai/. Naudotojas pasirenka failą, o naršyklė siunčia užklausą:
/atsisiusti?failas=instrukcija.pdf
Jei programa nepatikrinusi prijungia parametro failas reikšmę prie dokumentų katalogo kelio, gaunamas kelias /srv/programa/dokumentai/instrukcija.pdf. Kai pateikiamas įprastas failo pavadinimas, viskas atrodo teisingai. Problema išryškėja pateikus reikšmę, kurioje yra perėjimas į pirminį katalogą:
/atsisiusti?failas=../konfiguracja.env
Sudarytas kelias /srv/programa/dokumentai/../konfiguracja.env nurodo /srv/programa/konfiguracja.env – failą už dokumentų katalogo ribų. Jei programa gali jį perskaityti ir grąžina jo turinį, atskleidžiami duomenys.
Tai veikimo principo pavyzdys, o ne sėkmingos atakos garantija. Failas turi egzistuoti, programos procesas turi turėti prieigą prie jo, o užklausos apdorojimo būdas turi leisti panaudoti pateiktą kelią. Tokį veikimą tikrinkite tik savo aplinkoje arba gavę aiškų leidimą atlikti bandymus.
Kokią žalą gali padaryti Path Traversal
Pasekmės pirmiausia priklauso nuo to, kokią operaciją atlieka pažeidžiama funkcija ir kokias teises programa turi operacinėje sistemoje.
- Failų skaitymas: atsisiuntimo funkcija gali atskleisti konfigūraciją, naudotojų duomenis, atsargines kopijas arba prisijungimo duomenis.
- Įrašymas ir perrašymas: pažeidžiamas įrašymo mechanizmas gali įrašyti failą už numatyto katalogo ribų arba pakeisti esamą failą.
- Šalinimas: failų šalinimo funkcija gali ištrinti išteklius, kurių naudotojas neturėtų galėti nurodyti.
Tam tikromis aplinkybėmis perrašius konfigūraciją arba įkėlus serverio vykdomą failą gali būti perimtas programos valdymas. Tačiau Path Traversal savaime nereiškia galimybės vykdyti kodą ar gauti visišką prieigą prie serverio. Galimybes riboja, be kita ko, proceso teisės ir prieinamos programos funkcijos.
Spraga susijusi ne vien su naršyklėje matomais adresais. Kelią lemiantys duomenys taip pat gali būti gaunami iš formos, API užklausos, įkeliamo failo pavadinimo arba išskleidžiamo archyvo įrašo.
Kaip veiksmingai sumažinti riziką
Saugiausia vengti situacijų, kai kelią nurodo naudotojas. Užuot priėmusi failo pavadinimą ar vietą, programa gali priimti dokumento identifikatorių, pavyzdžiui, 482, ir pati surasti jam priskirtą failą. Kartu ji turi patikrinti, ar konkretus naudotojas turi teisę jį atsisiųsti – pats identifikatorius apsaugos neužtikrina.
Jei būtina priimti kelius, apsauga turėtų apimti kelis elementus:
- Griežtai apibrėžti įvesties apribojimai. Jei funkcijai reikia tik failo pavadinimo, ji neturėtų priimti viso kelio. Leidžiamus pavadinimus ir plėtinius reikia apriboti pagal tikruosius poreikius.
- Galutinės vietos tikrinimas. Atsižvelgusi į failų sistemos taisykles, programa turėtų patvirtinti, kad nurodytas objektas vis dar yra leidžiamame kataloge. Tam reikia naudoti tinkamas darbo su keliais funkcijas, o ne tiesiog lyginti teksto pradžią.
- Atsižvelgimas į simbolines nuorodas. Simbolinė nuoroda nukreipia į kitą failų sistemos vietą. Iš pažiūros leidžiamame kataloge esantis failas per tokią nuorodą gali nukreipti už jo ribų.
- Minimalios teisės. Dokumentus teikiantis procesas neturėtų turėti prieigos prie nereikalingų duomenų ar teisės įrašyti ten, kur pakanka skaityti.
Vien sekos ../ pašalinimas nėra pakankama apsauga. Dėl skirtingų skirtukų, kodavimo ir duomenų apdorojimo tvarkos filtras ir failų sistema tą pačią reikšmę gali interpretuoti skirtingai. Tikrinimas turi atitikti tai, kaip programa iš tikrųjų atveria failą.
Nuo ko pradėti programos tikrinimą
Peržiūrėkite failų atsisiuntimo, įkėlimo, šalinimo ir archyvų išskleidimo funkcijas. Kiekvienai nustatykite, ar naudotojas gali paveikti kelią, koks katalogas leidžiamas ir ar programa tikrina galutinį operacijos objektą. Bandymai turėtų apimti ir mėginimus išeiti už katalogo ribų, ir įprastas, tinkamas užklausas.
Jei įtariate, kad spraga buvo pasinaudota, vien pataisyti kodą gali nepakakti. Reikia įvertinti, kokie failai buvo pasiekiami, patikrinti žurnalus ir, jei galėjo nutekėti prisijungimo duomenys, pakeisti atitinkamus slaptažodžius ar raktus. Pirmas praktinis žingsnis – nustatyti konkrečią vietą, kurioje naudotojo duomenys tampa failo keliu.
