ホームページ  >  記事  >  運用・保守  >  C/C++ プログラムにおけるバッファ アンダーフローとは何を意味しますか?

C/C++ プログラムにおけるバッファ アンダーフローとは何を意味しますか?

王林
王林転載
2023-05-29 12:22:561675ブラウズ

1、バッファ アンダーフロー

この記事では、別のバッファ オーバーフロー状況、つまりバッファ アンダーフローについて説明します。バッファ オーバーフローについては、前のトピックで分析しました (問題 7 を参照)。同じ理由がバッファ アンダーフローにも当てはまるため、この記事ではバッファ オーバーフローを引き起こす要因については繰り返しません。簡単に言うと、バッファ アンダーフローとは、充填データがオーバーフローしたときに次のレベルのバッファが上書きされる状況を指します。この記事では、バッファ アンダーフローの危険性、ソース コードにおけるその兆候、および問題の解決方法について説明します。

2. バッファ アンダーフローの危険性

C/C プログラムにおいて、バッファ アンダーフローはプログラムのクラッシュや実行などの結果を引き起こす可能性がある深刻な脆弱性です。悪質なコード。 2018 年 1 月から 10 月までに、合計 494 件の CVE 脆弱性情報が関係していました。脆弱性の一部は次のとおりです。

#CVE脆弱性の概要CVE-2018-1000001Libc Realpath バッファ アンダーフローの脆弱性 この脆弱性は、GNU C ライブラリが getcwd() システム コールによって返される相対パスを正しく処理しないために発生します。 . その他の図書館 こちらも影響を受ける可能性があります。影響を受けるシステムでは、SUID バイナリを介して root 権限を取得できます。 CVE-2018-1000637 zutils は、圧縮ファイル処理ユーティリティ パッケージです。このプログラムは、圧縮/解凍、圧縮ファイルの比較、圧縮ファイルの整合性検証をサポートします。 zcat は解凍ユーティリティの 1 つです。 zutils 1.8-pre2 より前のバージョンの zcat にはバッファ オーバーフローの脆弱性が存在します。攻撃者はこの脆弱性を悪用してサービス妨害を引き起こしたり、特別に細工した圧縮ファイルを使用して任意のコードを実行したりする可能性があります。 CVE-2018-5388strongSwan 5.6.3 より前のバージョンには、実装にバッファ アンダーフローの脆弱性があり、攻撃者はこの脆弱性を悪用してリソースを使い果たす可能性があり、その結果、サービス拒否で。

3. サンプル コード

この例は、Samate Juliet Test Suite for C/C v1.3 (https:/) からのものです。 /samate.nist.gov/SARD/testsuite.php)、ソースファイル名: CWE121_Stack_Based_Buffer_Overflow__CWE193_char_alloca_cpy_01.c。

3.1 欠陥コード

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

#上記のコード例では、ポインタ

data がオンラインで実行されます。 36 代入、代入操作により、ポインタ datadataBadBuffer を指していることがわかります。41 行目でメモリコピーに strcpy() を使用すると、 、ソース バッファ長が宛先バッファ長より大きいため、バッファ長がオーバーフローし、オーバーフロー部分が dataBadBuffer の下限を超えて、バッファ アンダーフローの問題が発生します。

360 コード ガードを使用して上記のサンプル コードを検出すると、「バッファ アンダーフロー」の欠陥を検出でき、表示レベルが高くなります。図 1 に示すように:

C/C++ 程序中的缓冲区下溢指的是什么#図 1: バッファ アンダーフロー検出の例


3.2 修復コード

#上記の修復コードで、Samate が指定した修復方法は次のとおりです。 37 行目のポインタ C/C++ 程序中的缓冲区下溢指的是什么data

に値を代入し、

data## を置き換えます。 #dataGoodBuffer を指します。このとき、data の長さは source と一致します。コピーに strcpy() を使用した場合行 42 の操作。ソース バッファは宛先バッファと同じ長さであるため、バッファ アンダーフローの問題が回避されます。この問題は、境界チェックなどの他の方法でも回避できます。 360 コード ガードを使用して修復されたコードを検出すると、「バッファ アンダーフロー」欠陥が存在しないことがわかります。図 2 に示すように:

図 2: 修復後の検出結果

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

4. バッファ アンダーフローを回避する方法

バッファアンダーフローを回避するには、次の点に注意する必要があります。

(1) 安全でないメモリ操作関数の使用は避けるようにしてください。

(2) 戻り値が明確に示されているメモリ操作関数の場合、関数の戻り値を効果的に判断して、操作が成功したかどうかを判断する必要があります。


(3) バッファにデータを埋めるときに境界チェックを実行する必要があります。

以上がC/C++ プログラムにおけるバッファ アンダーフローとは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。