Кіріспе

"Libc-ке қайта оралу" шабуылы – бұл компьютерлік қауіпсіздік шабуылы, көбінесе буферлік ағымнан басталады, онда шақыру стегіндегі кіші бағдарламаның қайтару мекенжайы процестің орындалатын жадысында бар кіші бағдарламаның мекенжайымен алмастырылады. Бұл орындау битінің белгісін (болған жағдайда) айналып өтеді және шабуылшыны өз кодын енгізу қажеттілігінен босатады. Бұл шабуылдың алғашқы мысалын 1997 жылы Александр Песляк Bugtraq пошталық тізімінде жариялады. POSIX стандартымен үйлесімді операциялық жүйелерде C стандартты кітапханасы ("libc") C бағдарламалау тілінде жазылған бағдарламалар үшін стандартты орындалу ортасын қамтамасыз ету үшін жиі қолданылады. Шабуылшы кодты кез келген жерге қайтаруға мүмкіндігі болғанымен, libc ең мүмкін нысана болып табылады, себебі ол дерлік әрқашан бағдарламаға байланысты болады және шабуылшы үшін пайдалы функцияларды ұсынады (мысалы, қабық командаларын орындау үшін қолданылатын жүйе функциясы).

Либералдық шабуылдарға қарсы қорғаныс

Орындалмайтын стек кейбір буферлік асығу шабуылдарының пайдаланылуын болдырмауы мүмкін, бірақ ол libc-ге қайта оралу шабуылынан қорғай алмайды, себебі libc-ге қайта оралу шабуылында тек қолданыстағы орындалатын код қолданылады. Басқа жағынан, бұл шабуылдар тек бұрыннан бар функцияларды ғана шақыра алады. Стекті бұзудан қорғау пайдалануды болдырмауы немесе қиындатуы мүмкін, себебі ол стектегі зақымдануды анықтап, мүмкін, зақымдалған сегментті жоюы мүмкін. "ASCII броньдау" – бұл осы сияқты шабуылдарды болдырмауға қолданылатын тәсіл. ASCII броньдауымен, барлық жүйелік кітапханалардың (мысалы, libc) мекенжайларында NULL байт (0x00) болады. Бұл әдетте оларды жадтың алғашқы 0x01010101 байтына (ASCII бронь аймағы деп аталатын 16 МБ-тан сәл астам бірнеше беттерге) орналастыру арқылы жасалады, себебі осы мәнге дейінгі (бірақ оны қоспағанда) әрбір мекенжайда кем дегенде бір NULL байт болады. Бұл strcpy сияқты жолдарды өңдеу функцияларын пайдаланып, осы мекенжайларды қамтитын кодты орналастыруды мүмкін емес етеді. Дегенмен, егер шабуылшы NULL байттарды стекке ағызудың жолын тапса, бұл тәсіл жұмыс істемейді. Егер бағдарлама алғашқы 16 МБ-қа сыймаса, қорғау толық болмауы мүмкін. Бұл тәсіл тағы бір шабуылға ұқсас, ол return to plt деп аталады, онда libc-ге қайта оралудың орнына шабуылшы позицияға тәуелсіз кодқа (мысалы, system@plt, execve@plt, sprintf@plt, strcpy@plt) жүктелген Процедуралық байланыс кестесінің (PLT) функцияларын пайдаланады. Адрес кеңістігінің ретсіз орналасуы (ASLR) бұл типтегі шабуылдың 64 биттік машиналарда сәтті болу ықтималдығын өте төмендетеді, себебі функциялардың жадтағы орналасуы ретсіз болады. Бірақ 32 биттік жүйелер үшін ASLR аз пайда береді, себебі ретсіздік үшін барлық 16 бит қолданылады және оларды бірнеше минут ішінде күшпен жеңуге болады.