void
B::foo(char *str);
16
sinf
Tegishli :: Greeter {... }; 17
void
Related::sayHi(char *str); 18 19 Greeter *o =
new
Greeter(); 20 o->sayHi(char *str);
100
3
int
bar1(int b,
int
c,
int
d);
7
bekor
satr3(char *str);
Listing 6.6: Turli CFI siyosatlari uchun aniq o'zaro kelishuvlar misoli.
11 -
sinf
Salomchi :: Baza {... }; 12
void
Baza::bar5(char *str);
14
void
Greeter::sayHi(char *str);
Yuqoridagi misolda, keling , oxirgi qatordagi sayHi chaqiruviga
qaraylik . Yaroqli funktsiya siyosati kod maydoniga ishora qiluvchi
0xf000b400 xom manzilidan tashqari barcha funktsiyalarga ruxsat
beradi (lekin joriy funktsiyaga emas). Arity siyosati bar2, bar3, foo,
Base::bar5, Greater::sayHi, Related::sayHi toÿplamiga ruxsat beradi.
Funktsiya prototipi
5
int
bar2(char *str);
6 Mudofaa strategiyasi
6
10
1 0xf000b400
2
4
8
13
15
Machine Translated by Google
CFI - bu nazorat oqimini o'g'irlash hujumlarini to'xtatish uchun samarali
yumshatish, ammo panacea emas. CFI asosiy xatoni ishga tushirishga
imkon beradi va xotira buzilishi tajovuzkor tomonidan nazorat qilinishi
mumkin. Himoya faqat haqiqatdan keyin, ya'ni dasturda buzilgan ko'rsatgich
ishlatilganda og'ishni aniqlaydi. Hujumchilar o'zboshimchalik bilan
ma'lumotlarni o'zgartirishi mumkin va boshqaruv oqimini o'g'irlamasdan
o'zboshimchalik bilan hisoblashni amalga oshirish uchun murakkab
dasturlardan foydalanishi mumkin. Shu bilan bir qatorda, tahlildagi noaniqlik
tajovuzkorlarga har bir nazorat oqimi joyi uchun tegishli maqsadlar
to'plamidan o'zboshimchalik bilan nishonlarni tanlash imkonini beradi.
Turli xil CFI tahlil sxemalari xavfsizlik (aniqlik) va muvofiqlik o'rtasidagi
muvozanatni ta'minlaydi. Noaniq (xavfsiz) berilgan
siyosat oldingi toÿplamdan bar2 ni olib tashlaydi, natijada bar3, foo,
Base::bar5, Greater::sayHi, Related::sayHi.
E'tibor bering, C uchun bu prototipga asoslangan eng aniq
tahlil. Sinf ierarxiyasini tahlil qilish uchun faqat ikkita
Greater::sayHi , Related::sayHi funksiyalari to'plamda bo'lib ,
eng kichik maqsadlar to'plamini hosil qiladi.
Shu sababli, Microsoft CFI siyosatini Control-Flow Guard amalga
oshirish uchun joriy funksiya siyosatidan foydalanadi, Google
esa LLVM-CFI ilovasida C funksiyasi prototipidan va C++ kodi
uchun sinf ierarxiyasi tahlilidan foydalanadi.
Bu tuzatilishi kerak bo'lgan haqiqiy xato bo'lsa-da, ba'zi odamlar
yumshatish hech qachon yaxshi kodni taqiqlamasligi kerak deb ta'kidlashadi.
C kodi, prototipga asoslangan tekshirish yaxshi kod uchun muvaffaqiyatsiz bo'lishi mumkin.
6 Mudofaa strategiyasi
101
Machine Translated by Google
Do'stlaringiz bilan baham: |