Bufera pārpilde

Vikipēdijas lapa
Pārlēkt uz: navigācija, meklēt

Bufera pārpilde jeb bufera pārtēriņš[1] datoru drošībā un programmēšanā ir anomālija, kur datorprogramma, rakstot datus datu buferī pārraksta pāri bufera robežai, un izmaina buferim blakus esošās atmiņas datus. Bufera pārpilde ir viens no atmiņas integritātes (angļu: memory safety) pārkāpumiem.

Bufera pārpildi var izprovocēt lietotājs ar ievadoperāciju, kas rezultē kļūdainā programmas izpildē, kļūdainos izpildes rezultātos, ar sistēmas sabrukumu vai sistēmas drošības mehānismu apiešanu.

Programmēšanas valodas, kas visbiežāk tiek asociētas ar bufera pārpildi ir C un C++, kurās nav iebūvētu robežpārbaudes (angļu: Bounds checking) mehānismu, kas nepieļautu mainīgajam vai programmai nepiešķirto atmiņas apgabalu izmainīšanu. Papildu robežpārbaude novērš šo trūkumu.

Tehniskais apraksts[labot šo sadaļu | labot pirmkodu]

Bufera pārpilde iestājas tad, kad dati, kas tiek rakstīti buferī, pārraksta arī datus blakus atmiņas apgabalā. Tas var notikt gadījumā, ja pirms datu rakstīšanas netiek pārbaudīts, vai bufera izmērs ir pietiekošs datu izmēram.

Piemērs[labot šo sadaļu | labot pirmkodu]

Sekojošajā piemērā programmai ir divi, atmiņā viens otram sekojoši, datu elementi: 8 baitu teksta buferis un 2 baitu vesels skaitlis.

char           A[8] = {};
unsigned short B = 1979;

Sākumā A ir tukšs un tā garums ir 0 baitu, bet B ir vienāds ar vērtību 1979.

Mainīgais A B
vērtība [null string] 1979
hex vērtība 00 00 00 00 00 00 00 00 07 BB

Nākamajā solī programma mēģina mainīgajā A saglabāt tekstu "excessive". Jāņem vērā, ka programmēšanas valodā C teksta mainīgie tiek izbeigti ar papildu nulles baitu.

strcpy(A, "excessive");

Teksts "excessive" ir 9 baitu garš, un kopā ar beigu nulles baitu aizņem 10 baitus atmiņā. Mainīgajam A ir atvēlēti tikai 8 baiti. Nepārbaudot teksta garumu, teksta kopēšanas operācija pārraksta arī mainīgā B vērtību:

Mainīgais A B
vērtība 'e' 'x' 'c' 'e' 's' 's' 'i' 'v' 25856
hex vērtība 65 78 63 65 73 73 69 76 65 00

B atmiņas laukos ir ierakstītas ASCII vērtības 65 un 00, un veselā skaitļa vērtība ir izmainīta uz 25856.

Dažreiz bufera pārpildi atklāj operētājsistēma, kas segmentācijas kļūdas (angļu: segmentation fault) gadījumos pārtrauc programmas izpildi.

Ļaunprātīga izmantošana[labot šo sadaļu | labot pirmkodu]

Ļaunprātīgas izmantošanas metodes variē atkarībā no izmantojamā datoraprīkojuma, operētājsistēmas un atmiņas apgabala. Piemēram, izmantošanas metodes kaudzes (dinamiskas datu struktūras) bufera pārpildei ir pavisam savādākas, kā izmantošanas metodes izsaukuma steka bufera pārpildei.

Steka bufera pārpilde[labot šo sadaļu | labot pirmkodu]

Lietotājs var izmantot bufera pārpildi lai manipulētu programmas izpildi, un panāktu tam labvēlīgus efektus:

  • Pārrakstot lokālus mainīgos, kas atrodas bufera atmiņas apgabala tuvumā.
  • Pārrakstot atgriešanās adresi steka kadrā (stack frame). Pēc funkcijas izpildes, programma turpinātu darbu uzbrucēja norādītajā adresē.
  • Pārrakstot rādītāju uz funkciju vai kļūdas apstrādes procedūru.
  • Pārrakstot parametrus citā steka kadrā.

Steka bufera pārpildi nedrīkst jaukt ar steka pārpildi.

Kaudzes pārpilde[labot šo sadaļu | labot pirmkodu]

Kaudzes datu apgabala bufera pārpilde tiek saukta par kaudzes pārpildi un var tikt izmantota savādāk, nekā steka bufera pārpilde. Atmiņa kaudzei tiek piešķirta dinamiski programmatūras darba laikā un parasti glabā programmas datus. Tas tiek izmantots, lai pārrakstītu programmas datu struktūras, tai skaitā rādītājus un izmanto to, lai pārrakstītu programmas funkciju rādītāju.

Atsauces[labot šo sadaļu | labot pirmkodu]