Artikel ini akan menerangkan satu lagi situasi limpahan penimbal, aliran bawah penimbal. Limpahan penampan telah dianalisis dalam topik sebelumnya (lihat Isu 7). Sebab yang sama digunakan untuk aliran bawah penimbal, jadi faktor yang membawa kepada limpahan penimbal tidak akan diulang dalam artikel ini. Secara ringkasnya, aliran bawah penimbal merujuk kepada situasi di mana penimbal peringkat seterusnya ditimpa apabila data pengisian melimpah. Artikel ini menerangkan bahaya aliran bawah penimbal, tanda dalam kod sumbernya dan cara menyelesaikan masalah.
Dalam program C/C++, aliran bawah penampan ialah jenis kerentanan yang serius yang boleh menyebabkan program ranap atau Akibat seperti melaksanakan kod berniat jahat. Dari Januari hingga Oktober 2018, sebanyak 494 maklumat kerentanan CVE telah terlibat. Beberapa kelemahan adalah seperti berikut:
CVE | 漏洞概述 |
---|---|
CVE-2018-1000001 | Libc Realpath 缓冲区下溢漏洞,漏洞的产生是由于 GNU C 库没有正确处理 getcwd() 系统调用返回的相对路径,其他库也很可能受此影响。在受影响的系统中,通过 SUID binary 可以获得 root 权限。 |
CVE-2018-1000637 | zutils 是一款压缩文件处理实用程序包。该程序支持压缩/解压缩、压缩文件比较和压缩文件完整性校验等功能。zcat 是其中的一个解压缩实用程序。zutils 1.8-pre2 之前版本中的 zcat 存在缓冲区溢出漏洞。攻击者可借助特制的压缩文件利用该漏洞造成拒绝服务或执行任意代码。 |
CVE-2018-5388 | strongSwan 5.6.3 之前版本在实现上存在缓冲区下溢漏洞,攻击者利用此漏洞可耗尽资源,导致拒绝服务。 |
Sampel datang daripada Samate Juliet Test Suite untuk C/C++ v1.3 (https. ://samate. nist.gov/SARD/testsuite.php), nama fail sumber: CWE121_Stack_Based_Buffer_Overflow__CWE193_char_alloca_cpy_01.c.
Dalam kod contoh di atas, penunjuk data
diberikan nilai dalam baris 36. Melalui penetapan Ia boleh dilihat daripada operasi bahawa penunjuk data
menghala ke dataBadBuffer
Apabila menggunakan strcpy()
untuk salinan memori dalam baris 41, panjang penimbal sumber adalah lebih besar daripada panjang penimbal destinasi, mengakibatkan. limpahan. Bahagian limpahan melebihi sempadan bawah dataBadBuffer
Menyebabkan masalah aliran bawah penampan.
Gunakan 360 Code Guard untuk mengesan kod sampel di atas Anda boleh mengesan kecacatan "buffer underflow" dan tahap paparan adalah tinggi. Seperti yang ditunjukkan dalam Rajah 1:
Rajah 1: Contoh pengesanan aliran bawah penampan
Dalam kod pembaikan di atas, kaedah pembaikan yang diberikan oleh Samate ialah: tetapkan penunjuk data
dalam baris 37, dan arahkan data
ke dataGoodBuffer
Pada masa ini Panjang daripada data
adalah konsisten dengan source
Apabila baris 42 menggunakan strcpy()
untuk melakukan operasi penyalinan, penimbal sumber dan penimbal destinasi mempunyai panjang yang sama, sekali gus mengelakkan masalah aliran bawah penimbal. Masalah ini juga boleh dielakkan dengan kaedah lain seperti semakan sempadan.
Gunakan 360 Code Guard untuk mengesan kod yang telah dibaiki, dan anda dapat melihat bahawa kecacatan "penimbal bawah aliran" tidak lagi wujud. Seperti yang ditunjukkan dalam Rajah 2:
Rajah 2: Hasil pengesanan selepas pembaikan
Untuk mengelakkan aliran bawah penimbal, anda perlu memberi perhatian kepada perkara berikut:
(1) Cuba elakkan menggunakan fungsi operasi memori yang tidak selamat.
(2) Untuk fungsi pengendalian memori yang mempunyai petunjuk jelas tentang nilai pulangan, nilai pulangan fungsi harus dinilai dengan berkesan untuk menentukan sama ada operasi itu berjaya.
(3) Semakan sempadan mesti dilakukan apabila mengisi data ke dalam penimbal.
Atas ialah kandungan terperinci Apakah maksud aliran bawah penampan dalam program C/C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!