Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Кіріспе
"Libc-ке қайта оралу" шабуылы – бұл компьютерлік қауіпсіздік шабуылы, көбінесе буферлік ағымнан басталады, онда шақыру стегіндегі кіші бағдарламаның қайтару мекенжайы процестің орындалатын жадысында бар кіші бағдарламаның мекенжайымен алмастырылады. Бұл орындау битінің белгісін (болған жағдайда) айналып өтеді және шабуылшыны өз кодын енгізу қажеттілігінен босатады. Бұл шабуылдың алғашқы мысалын 1997 жылы Александр Песляк Bugtraq пошталық тізімінде жариялады. POSIX стандартымен үйлесімді операциялық жүйелерде C стандартты кітапханасы ("libc") C бағдарламалау тілінде жазылған бағдарламалар үшін стандартты орындалу ортасын қамтамасыз ету үшін жиі қолданылады. Шабуылшы кодты кез келген жерге қайтаруға мүмкіндігі болғанымен, libc ең мүмкін нысана болып табылады, себебі ол дерлік әрқашан бағдарламаға байланысты болады және шабуылшы үшін пайдалы функцияларды ұсынады (мысалы, қабық командаларын орындау үшін қолданылатын жүйе функциясы).
A "return to libc" attack is a computer security attack usually starting with a buffer overflow in which a subroutine return address on a call stack is replaced by an address of a subroutine that is already present in the process executable memory, bypassing the no execute bit feature (if present) and ridding the attacker of the need to inject their own code. The first example of this attack in the wild was contributed by Alexander Peslyak on the Bugtraq mailing list in 1997. On POSIX compliant operating systems the C standard library ("libc") is commonly used to provide a standard runtime environment for programs written in the C programming language. Although the attacker could make the code return anywhere, libc is the most likely target, as it is almost always linked to the program, and it provides useful calls for an attacker (such as the system function used to execute shell commands).
Либералдық шабуылдарға қарсы қорғаныс
Орындалмайтын стек кейбір буферлік асығу шабуылдарының пайдаланылуын болдырмауы мүмкін, бірақ ол 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 бит қолданылады және оларды бірнеше минут ішінде күшпен жеңуге болады.
A non executable stack can prevent some buffer overflow exploitation, however it cannot prevent a return to libc attack because in the return to libc attack only existing executable code is used. On the other hand, these attacks can only call preexisting functions. Stack smashing protection can prevent or obstruct exploitation as it may detect the corruption of the stack and possibly flush out the compromised segment. "ASCII armoring" is a technique that can be used to obstruct this kind of attack. With ASCII armoring, all the system libraries (e. g., libc) addresses contain a NULL byte (0x00). This is commonly done by placing them in the first 0x01010101 bytes of memory (a few pages more than 16 MB, dubbed the "ASCII armor region"), as every address up to (but not including) this value contains at least one NULL byte. This makes it impossible to emplace code containing those addresses using string manipulation functions such as strcpy However, this technique does not work if the attacker has a way to overflow NULL bytes into the stack. If the program is too large to fit in the first 16 MB, protection may be incomplete. This technique is similar to another attack known as return to plt where, instead of returning to libc, the attacker uses the Procedure Linkage Table (PLT) functions loaded in the position independent code (e. g., system@plt, execve@plt, sprintf@plt, strcpy@plt). Address space layout randomization (ASLR) makes this type of attack extremely unlikely to succeed on 64 bit machines as the memory locations of functions are random. For 32 bit systems, however, ASLR provides little benefit since there are only 16 bits available for randomization, and they can be defeated by brute force in a matter of minutes.