Bufera pārpildes ievainojamība

Satura rādītājs

Šajā apmācībā mēs runāsim par bufera pārpildi (Bufera pārplūde), kļūme, kas pastāv jau ilgu laiku, rodas, ja atmiņas apgabalā kopētie (iepriekš rezervētie) dati netiek pareizi pārbaudīti, iespējams, lietojumprogramma darbojas pareizi, ja lietotājs ievieto datus ar atbilstošs izmērs, bet, ja mēs rezervēsim atmiņu 15 rakstzīmēm un lietotājs ievietos 20, tas ietekmēs citu atmiņas apgabalu, kas var būt vai nevar tikt rezervēts.

Tas var aizkavēt mūsu programmas darbību, taču var būt arī daudz sliktāk, lietotājs ar ļauniem nodomiem var izmantot šīs kļūdas priekšrocības un ietekmēt lietojumprogrammas darbību vai izpildīt patvaļīgu kodu datorā (parasti šis kods atvērs komandu tulku ). Arī tad, ja programma darbojas ar paaugstinātām privilēģijām, mums ir nopietns drošības trūkums. Vēl viens uzbrukums, kas var mainīt lietojumprogrammas darbību vai ievadīt kodu, ir XSS.

PiezīmeIzpildījumi, kurus redzēsit šajā apmācībā, tika veikti 32 bitu Ubuntu 16.04 operētājsistēmā.

Apskatīsim a Vienkāršs C koda piemērs, kas ir neaizsargāts pret šo uzbrukumu, palaižot programmu, mums jānodod parametrs, lietojumprogramma gaidīs virkni, kas nav garāka par 15 rakstzīmēm, ja tā ir gaidītā virkne, tā būs veiksmīga piekļuve, ja nē, tā tiks "liegta". Kods ir šāds:

 #include #include #define password "Test" void test (char * str) {char buffer [15]; int n = 0; strcpy (buferis, str); ja (strcmp (buferis, parole) == 0) {n = 1; } ja (n) {printf ("Panākumi \ n"); izeja (0); } else {printf ("Piekļuve liegta \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Lietotnei ir nepieciešams parametrs \ n"); izeja (-1); } tests (argv [1]); }
Programma nosaukta pēc pārplūdes.c, un apkopošanai tika izmantots:
 gcc overflow.c -o pārplūde -fno -steck -aizsargs
Pēdējā daļa: -fno-stack-aizsargs To izmanto, lai kompilators neaizsargātu un mēs varētu parādīt piemēru. Ja lietotājs ievada pareizus datus, kas ir ne vairāk kā 15 rakstzīmju virkne, programma darbojas labi, ja mēs ievadām nepareizu "paroli", tā mums parādīs Pieeja noliegtaun, ja mēs ieliekam "Pārbaude"Ieliks mūs Panākumi. Apskatīsim, kā programma tiek izpildīta 2 reizes, vienu reizi ar nepareizu piekļuvi un otru ar pareizu virkni:

Mēs redzam, ka viss darbojas pareizi. Bet ko darīt, ja mēs ievietojam augšējo virkni, redzēsim, kas notiek:

Mēs esam uzsākuši programmu ar 20 burtiem A, un parāda mums Panākumi. Šajā lietojumprogrammā mums nav nekā, mēs vienkārši izejam no lietojumprogrammas, bet esam piekļuvuši liegtajai zonai, nezinot paroli. Ja mēs aizstājam šādu funkciju:

 strcpy (buferis, str);
Šādi:
 strncpy (buferis, str, 15);
Y mēs izpildām kodu ar 20 burtiem A, mums ir šāda izeja:

Jūs varat arī redzēt, ka mēs to izmantojam strcmp, tā vietā mums vajadzētu izmantot strncmp, tāpēc mēs arī kontrolējam izmēru. Mēs esam kontrolējuši, ka var kopēt ne vairāk kā 15 rakstzīmes, tāpēc tas neietekmē mūsu programmu, ja tās ievieto vairāk. Ja pēc ziņojuma parādīšanas Panākumi mēs izpildām sistēmas komandu (šajā gadījumā kas es esmu), mēs iegūstam šādu informāciju:

Iepriekš mēs neesam sakne, bet, izpildot to ar sudo, mēs iegūstam sekojošo:

Vienīgais, ko esam pievienojuši, ir rinda kodā, ko redzējām iepriekš, zem koda rindas:

 printf ("Panākumi \ n");
Mēs esam ielikuši:
 sistēma ("whoami");
Lai mazliet saprastu, kas noticis, es modificēšu programmu, lai parādītu 2 mūsu mainīgos lielumus (buferšķīdums Y n) neatkarīgi no tā, vai tas ir pareizi vai nē, un zemāk ir izvade, vispirms mēs ievietojam virkni, kas tiks uzskatīta par pareizu ("Pārbaude”), Tad nepareizs, kas nepārsniedz garumu, un visbeidzot 20 burti A.:

Mēs redzam, ka pirmajā izpildē tas ir tā vērts 1 Mainīgais n, jo ķēde ir pagājusi pareizi, otrajā tā ir tā vērta 0, jo tas ir nepareizi, bet pēdējā tas ir tā vērts 1094795585, kas liek izlaist mūsu izvirzīto nosacījumu ja (n), tā būs taisnība, kamēr n ir atšķirīgs no 0. Tas nav labs stāvoklis, lai gan tam nebūtu jāgāžas, ja pārējais kods būtu pareizs. Ja mēs ieliekam 16 burti A. kā parametru mēs redzēsim, ka mainīgā vērtība n tas ir 65:

Ja paskatāmies uz ASCII kodu, skaitlis 65 atbilst burtam TO, mēs esam redzējuši, ka mēs nejauši esam pieskārušies mainīgā n atmiņai, ka papildu burts, ko esam nodevuši kā parametru, ir nonācis mainīgajā n. Mums būtu šāda atmiņa:

Ja mēs pārsniedzam rakstzīmes, var gadīties, ka tas mums nosūta segmenta pārkāpuma ziņojumu (ja mēs noņemam izeja (0) kas mums ir ja (n)), mēs to varam redzēt šādā attēlā:

Šis brīdinājums ir saistīts ar mēģinājumu piekļūt atmiņas zonai, kas ir ārpus tās, kuru operētājsistēma ir piešķīrusi lietojumprogrammai. Ja mēs apkopotu piemēru šādi:

 gcc overflow.c -o pārplūde -fstack -aizsargs
Vai vienkārši noņemot -fno-stack-aizsargs No apkopojuma, ko redzējām pirmo reizi, un izpildām kodu ar pārpildi, mēs iegūstam šādu rezultātu:

Papildu aizsardzība, ko mums nodrošina gcc.

PiezīmeJa mēs gribētu izpildīt kodu (čaulas kods) mums būtu jāpārraksta atgriešanās adrese ar mūsu čaulas kodu, tā ir nedaudz sarežģītāka nekā apmācībā redzamais piemērs, un tāpēc tai ir nepieciešams vairāk darba.

Ja kādam izdodas izmantot šo ievainojamību, tas var jums nodarīt lielu kaitējumu. Izvairieties no šāda veida kļūmēm un ļaunprātīgs lietotājs to var izmantot, ir ļoti vienkārši, pareizi jāprogrammē, jums ir labi jāzina izmantotā programmēšanas valoda, jāzina, kādas funkcijas izmantot un kuras neizmantot, jāpārbauda lietojumprogramma labi, ne tikai ar pareiziem datiem, tam ir arī pareizi jādarbojas, kad mēs risinām neparedzētus datus.

Citi uzbrukumi, kurus varat pārskatīt un apzināties, lai tie neietekmētu jūs vai līdz minimumam samazinātu to risku, ir: DoS un Brute Force. Un neaizmirstiet pārbaudīt CVE lapu par ievainojamībām.

Vai jums patika šī apmācība un palīdzējāt tai?Jūs varat apbalvot autoru, nospiežot šo pogu, lai sniegtu viņam pozitīvu punktu
wave wave wave wave wave