XÜSUSİ DÖVLƏT MÜHAFİZƏ XİDMƏTİ
XÜSUSİ RABİTƏ VƏ İNFORMASİYA
TƏHLÜKƏSİZLİYİ DÖVLƏT AGENTLİYİ

KOMPÜTER İNSİDENTLƏRİNƏ QARŞI MÜBARİZƏ
MƏRKƏZİ

İnsident bildir

Xəbərlər > Yaddaşın daşması (Buffer overflow) - hücum texnikasının özəllikləri

23 Avg 2013

 Kompüter proqramı tərəfindən verilənlərin bufer yaddaşındakı seçilmişlərdən kənarda yazılması fenomeni – yaddaşın dolması (Buffer Overflow) adlanır.

Yaddaşın dolması adətən kənardan alınmış verilənlərlə, həmçinin əməliyyat sistemləri və proqramlaşdırmanın alt sistemi (komplyator və ya intepretator) tərəfindən sərt müdafiə olunmadığı və yaddaşla düzgün işləmədiyi halda baş verir. Dolma nəticəsində yaddaşın ardınca (və ya onun önündə) yerləşən məlumatlar zədələnə bilər.
Yaddaşın dolması kompüter sistemlərinin sındırılmasının ən məşhur üsullarındandır, çünki yüksək səviyyəli dillərin əksəriyyətində taya çərçivəsi (stack frame) texnologiyasından istifadə edirlər – bu zaman proqram məlumatları idarəçi məlumatları ilə qarışdırılaraq (o cümlədən taya çərçivəsinin başlanğıc və icra funksiyasından qayıdış ünvanları), verilənlər taya prosesində (stack frame) yerləşdirilir.
Yaddaşın dolması, xidmətin imtinasına (denial of service, DoS), proqramın qəza çıxışına və ya donmasına səbəb ola bilər. Doldurmanın ayrı-ayrı növləri, məsələn taya çərçivəsində (stack frame) dolması, təcavüzkara (ziyankara) proqram adından və istifadəçinin hesab (akkaunt) hüquqları ilə və onun adından yerinə yetirilən ixtiyari maşın kodunu yükləmək və icra etmək imkanını verir.
Yaddaşın dolmasını sistem proqramları tərəfindən mövcud proqram və ya proqram-aparat vasitələrindəki məhdudiyyətlərindən keçmək məqsədilə qəsdən istifadəsi halları məlumdur. Məsələn, iS-DOS əməliyyat sistemi (ZX Spectrum kompüterləri üçün), maşın kodlarında yerləşdirilmiş yükləyicisinin işə salınması üçün yaddaşın TR-DOS-la dolması (TR-DOS-dakı daimi vasitələrlə bunu etmək mümkün deyil) imkanını istifadə etmişdir.


Təhlükəsizlik

Başqa proqramın müdafiəsinin dağıdılması üçün boşluqdan istifadə edən avtomatlaşdırılmış skript - eksploit (istismar edən) adlanır. Ən böyük təhlükəni, superistifadəçi səviyyəsinə çıxışın əldə edilməsini, başqa sözlə imtiyazların yüksəldilməsini nəzərdə tutan eksployitlər yaradır. Eksployit, yaddaşın dolmasını, xüsusi hazırlanmış giriş verilənlərinin daxil edilməsi yolu ilə nail olur. Bu cür verilənlər seçilmiş yaddaşı dolduraraq, yaddaşdakı həmin yaddaşın ardınca olan verilənləri dəyişir.
Məsələn, istifadəçilərin parollarını dəyişdirən, superistifadəçi imtiyazlarını icra edən bir sistem inzibatçılığının hipotetik proqramını təsəvvür edək.
Əgər proqram, daxil edilmiş yeni parolun uzunluğunu yoxlamadıqda, onların ölçüsü, saxlanması üçün seçilmiş yaddaşdan çox olduqda, istənilən məlumat, sadəcə yaddaşdan sonra yerləşənlərin üzərindən yazılacaq. Təcavüzkar, yaddaşın göstərilən sahəsinə, istifadəçilərin hesablarının əlavə edilməsi və ləğv edilməsi, parolların dəyişdirilməsi, faylların dəyişdirilməsi və ya ləğv edilməsi və s. bu kimi superistifadəçi imtiyazları ilə istənilən fəaliyyəti yerinə yetirən, maşın dilində olan (şell-kod) göstərişlərini daxil edə bilər. Əgər proqram, sonradan idarəetməni yaddaşın bu sahəsinə təhvil verərsə, sistem orada yerləşən təcavüzkarın maşın kodunu icra edəcək.

Düzgün yazılmış proqramlar daxil edilən verilənlərin uzunluğunu, onların həqiqətən adi seçilmiş yaddaş verilənləri olduğunu təsdiq etmək üçün yoxlamalıdır. Lakin proqramçılar bunu çox vaxt unudurlar. Yaddaş xanada (stack) yerləşdikdə və ya “aşağı böyüdükdə” (misal üçün x86 arxitekturasında), yaddaşın dolması köməkliyi ilə icra edilən funksiyanın qayıdış ünvanını dəyişdirmək olar, qayıdış ünvanı, icra edilən funksiya ilə seçilmiş yaddaşdan sonra yerləşir. Bununla prosesin ünvan məkanında maşın kodunun ixtiyari sahəsinin yerinə yetirilməsi imkanı var. Əgər taya (stack) “yuxarı böyüdükdə” (bu halda qayıdış ünvanı adətən yaddaşın önündə yerləşir) yaddaşın dolmasından istifadə edərək qayıdış ünvanını təhrif etmək nadir hallarda mümkün ola bilər.

Hətta təcrübəli proqramçılar üçün yaddaşın bu və ya digər dolmasını boşluqla müəyyən etmək çətin olur. Bu kompüterin quruluşu (arxitekturası) və məqsədli proqram haqqında dərin biliklər tələb edir. (.....kim?......) tərəfindən göstərilmişdir ki, hətta bir baytın yaddaşdan kənar yazılması, boşluqlar törədə bilər.
Yaddaşın dolması, proqramçıdan ayrılmış yaddaşın ölçülərini sərbəst idarə edilməsi tələb edən, nisbətən aşağı səviyyəli, assembler dili, Ci və C++ kimi, yazılmış proqramlarda geniş yayılmışdır. Yaddaşın dolması səhvlərini aradan qaldırılması hal hazıradək zəif inkişaf etmiş avtomatlaşdırılmış prosesdir.

           

Proqramların formal yoxlama (verifikasiya) sistemləri, müasir proqramlaşdırma dilləri fonunda səmərəsizdilər.

Məsələn, Java və Lisp kimi proqramlaşdırma dilləri, yaddaşın ayrılmasını avtomatik qaydada idarə edirlər, statik analiz kombinasiyasından istifadə edirlər və proqramın icra edilməsi zamanı fəaliyyətinin düzgün olmasını yoxlayırlar. Bu da yaddaşın dolması ilə bağlı səhvlərin baş verməsini az güman olduğunu və ya mümkün olmadığını göstərir. Perl proqram dili, yaddaşın dolmasının qarşısını almaq üçün massivlərin ölçülərini avtomatik olaraq dəyişdirilməsini təmin edir. Lakin, icra edilmə sistemləri və bu dillər üçün kitabxanalar, həmin yoxlama sistemlərinin həyata keçirilərkən mümkün daxili səhvlər üzündən, yenə də yaddaşın dolmasına məruz qala bilərlər.
Windows-da, kodun, dolmuş yaddaşın kənar icrasının qarşısını alan, əgər bu cür dolma həyata keçirilibsə, bəzi proqram yenilikləri mümkündür. Bu yeniliklərin arasında – Windows XP SP2-dakı DEP, ASLR, Ossurance və Anti-Execute qeyd etmək olar.