Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Apakah maksud aliran bawah penampan dalam program C/C++?

Apakah maksud aliran bawah penampan dalam program C/C++?

王林
王林ke hadapan
2023-05-29 12:22:561708semak imbas

1, aliran bawah penimbal

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.

2. Bahaya aliran bawah penampan

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 之前版本在实现上存在缓冲区下溢漏洞,攻击者利用此漏洞可耗尽资源,导致拒绝服务。

3 Kod sampel

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.

3.1 Kod Kecacatan

C/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:

C/C++ 程序中的缓冲区下溢指的是什么

Rajah 1: Contoh pengesanan aliran bawah penampan

3.2 Kod pembaikan

C/C++ 程序中的缓冲区下溢指的是什么

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:

C/C++ 程序中的缓冲区下溢指的是什么

Rajah 2: Hasil pengesanan selepas pembaikan

4. Bagaimana untuk mengelakkan aliran bawah penimbal

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam