Mass Assignment: kas tai ir kaip apsisaugoti?
Autorius: Domeny.ForSale redakcija Paskelbta
Trumpai: Mass Assignment – tai automatinis HTTP užklausos duomenų priskyrimas vidinio objekto ar duomenų bazės modelio laukams. Tai tampa saugumo spraga, kai programa taip leidžia keisti ir laukus, kurių naudotojas neturėtų valdyti, pavyzdžiui, suteikti sau administratoriaus vaidmenį. Pagrindinės apsaugos priemonės – aiškiai nurodyti leidžiamus laukus ir tikrinti teises serveryje.
Kaip veikia automatinis laukų priskyrimas
Žiniatinklio programa gauna naršyklės siunčiamus duomenis, pavyzdžiui, kai išsaugomas profilis. HTTP užklausoje, t. y. serveriui siunčiamame pranešime, gali būti naudotojo vardas, el. pašto adresas ir kitos reikšmės. Serveris turi jas priskirti atitinkamiems laukams savo kode.
Mass Assignment leidžia tai atlikti vienu kartu, nepriskiriant kiekvienos reikšmės atskirai. Šis mechanizmas susieja gautų laukų pavadinimus su objekto savybėmis. Jei duomenyse yra laukas vardas, jo reikšmė gali būti priskirta naudotojo objekto savybei vardas.
Toks susiejimas dar vadinamas autobinding. Kalbant apie šį pažeidžiamumą, pasitaiko ir terminas object injection, nors kituose saugumo kontekstuose jis gali reikšti kitokius mechanizmus. Pats automatinis susiejimas nėra klaida: problema atsiranda tada, kai serveris priima daugiau laukų, nei turėtų.
Paprastas pavyzdys: profilio redagavimas ir vaidmens keitimas
Tarkime, profilio redagavimo formoje galima pakeisti tik rodomą vardą ir el. pašto adresą. Tinkami serveriui siunčiami duomenys atrodo taip:
{
"vardas": "Jonas Jonaitis",
"email": "jonas (at) example.com"
}
Tačiau duomenų bazėje paskyra turi daugiau savybių. Be vardo ir adreso, joje saugomas ir laukas vaidmuo, nustatantis naudotojo teises. Formoje jo nėra, nes paprastas naudotojas neturėtų galėti jo keisti.
Vis dėlto užpuolikas neprivalo naudotis forma. Jis gali pakeisti siunčiamą užklausą ir pridėti papildomą lauką:
{
"vardas": "Jonas Jonaitis",
"email": "jonas (at) example.com",
"vaidmuo": "administratorius"
}
Jei serveris be apribojimų nukopijuoja visas gautas savybes į paskyrą, jis gali išsaugoti ir naują vaidmenį. Jei teisių sistema remiasi šiuo lauku, taip galima gauti administratoriaus prieigą.
Tai, kad lauko nėra formoje, neapsaugo nuo jo pakeitimo. Ką galima keisti, turi nustatyti serveris, o ne puslapio išvaizda ar naršyklėje veikiantis JavaScript kodas.
Kokiems duomenims kyla didžiausia rizika
Mass Assignment susijęs ne vien su naudotojų paskyromis. Rizika kyla visur, kur iš išorės gauti duomenys automatiškai priskiriami objektams, turintiems ir vidinių savybių.
Ypač atidžiai reikia kontroliuoti, pavyzdžiui, šiuos laukus:
savininko_id– gali nurodyti, kam priklauso dokumentas ar užsakymas;kaina– gali turėti įtakos už pirkinį apskaičiuojamai sumai;mokejimo_busena– gali nurodyti, ar užsakymas apmokėtas;email_patvirtintas– gali lemti, ar bus praleistas adreso patvirtinimas.
Pavyzdžiui, parduotuvės klientas turėtų atsiųsti produkto identifikatorių ir pasirinktą vienetų skaičių. Kainą serveris turėtų nustatyti pagal parduotuvės pasiūlymą, o ne besąlygiškai priimti užklausoje pateiktą reikšmę.
Ne kiekvienas papildomas laukas leis įvykdyti ataką. Jis turi būti priimtas, priskirtas ir panaudotas taip, kad paveiktų programos veikimą. Todėl analizuojant reikia patikrinti visą duomenų kelią, o ne tik formos turinį.
Kaip veiksmingai apriboti Mass Assignment
Pagrindinė apsaugos priemonė – leidžiamų laukų sąrašas: konkrečiai operacijai serveris priima tik programuotojo nurodytas savybes. Įprastai redaguojant profilį tai gali būti vardas ir email, bet ne vaidmuo.
Veiksmų seka gali atrodyti taip:
leidziami_laukai = ["vardas", "email"]
profilio_duomenys = pasirink_laukus(uzklausos_duomenys, leidziami_laukai)
atnaujink_profili(prisijunges_naudotojas, profilio_duomenys)
Tai principą iliustruojantis pseudokodas, o ne parengtas naudoti sprendimas. Priklausomai nuo naudojamo programavimo karkaso, apribojimus galima nustatyti susiejimo mechanizme, tikrinimo priemonėje arba atskirame įvesties objekte, dažnai vadinamame DTO. Toks objektas aprašo konkrečiai operacijai leidžiamus duomenis, o ne atkartoja visą duomenų bazės įrašą.
Vien formato tikrinimo nepakanka. Reikšmė administratorius gali būti tinkamas vaidmens pavadinimas, tačiau paprastas naudotojas vis tiek neturi teisės jos nustatyti. Todėl reikalingas ir teisių patikrinimas, nustatantis, ar konkretus asmuo gali atlikti norimą pakeitimą.
Naudojant draudžiamų laukų sąrašą lengviau ką nors praleisti: pridėjus naują modelio savybę, reikia nepamiršti jos užblokuoti. Leidžiamų laukų sąrašas naujų savybių automatiškai neatveria. Tikslų naudojamo programavimo karkaso veikimą ir numatytąsias apsaugos priemones reikia pasitikrinti oficialioje jo dokumentacijoje.
Kaip patikrinti savo programą
Testuokite tik savo sistemą arba aplinką, kurią turite leidimą testuoti. Paruoškite profilio redagavimo užklausą su tinkamais duomenimis, tada pridėkite lauką, kurio naudotojas neturėtų keisti.
Patikrinkite ne tik serverio atsakymą, bet ir išsaugotus duomenis bei faktines paskyros teises. Saugiai įgyvendinta programa turėtų atmesti neleistiną pakeitimą arba ignoruoti papildomą lauką, nepakeisdama saugomos reikšmės.
Pirmiausia peržiūrėkite vietas, kuriose visi užklausos duomenys tiesiogiai perduodami įrašus kuriantiems ar atnaujinantiems metodams. Kiekvienu atveju užrašykite leidžiamus laukus ir pridėkite testą, patvirtinantį, kad kitų laukų pakeisti negalima.
Taip pat skaitykite: Kas yra Path Traversal
