この記事では、別のバッファ オーバーフロー状況、つまりバッファ アンダーフローについて説明します。バッファ オーバーフローについては、前のトピックで分析しました (問題 7 を参照)。同じ理由がバッファ アンダーフローにも当てはまるため、この記事ではバッファ オーバーフローを引き起こす要因については繰り返しません。簡単に言うと、バッファ アンダーフローとは、充填データがオーバーフローしたときに次のレベルのバッファが上書きされる状況を指します。この記事では、バッファ アンダーフローの危険性、ソース コードにおけるその兆候、および問題の解決方法について説明します。
C/C プログラムにおいて、バッファ アンダーフローはプログラムのクラッシュや実行などの結果を引き起こす可能性がある深刻な脆弱性です。悪質なコード。 2018 年 1 月から 10 月までに、合計 494 件の CVE 脆弱性情報が関係していました。脆弱性の一部は次のとおりです。
脆弱性の概要 | |
---|---|
Libc Realpath バッファ アンダーフローの脆弱性 この脆弱性は、GNU C ライブラリが getcwd() システム コールによって返される相対パスを正しく処理しないために発生します。 . その他の図書館 こちらも影響を受ける可能性があります。影響を受けるシステムでは、SUID バイナリを介して root 権限を取得できます。 | |
zutils は、圧縮ファイル処理ユーティリティ パッケージです。このプログラムは、圧縮/解凍、圧縮ファイルの比較、圧縮ファイルの整合性検証をサポートします。 zcat は解凍ユーティリティの 1 つです。 zutils 1.8-pre2 より前のバージョンの zcat にはバッファ オーバーフローの脆弱性が存在します。攻撃者はこの脆弱性を悪用してサービス妨害を引き起こしたり、特別に細工した圧縮ファイルを使用して任意のコードを実行したりする可能性があります。 | |
strongSwan 5.6.3 より前のバージョンには、実装にバッファ アンダーフローの脆弱性があり、攻撃者はこの脆弱性を悪用してリソースを使い果たす可能性があり、その結果、サービス拒否で。 |
data がオンラインで実行されます。 36 代入、代入操作により、ポインタ
data が
dataBadBuffer を指していることがわかります。41 行目でメモリコピーに
strcpy() を使用すると、 、ソース バッファ長が宛先バッファ長より大きいため、バッファ長がオーバーフローし、オーバーフロー部分が
dataBadBuffer の下限を超えて、バッファ アンダーフローの問題が発生します。
#図 1: バッファ アンダーフロー検出の例
#上記の修復コードで、Samate が指定した修復方法は次のとおりです。 37 行目のポインタ data
に値を代入し、data## を置き換えます。 #dataGoodBuffer
を指します。このとき、data
の長さは source
と一致します。コピーに strcpy()
を使用した場合行 42 の操作。ソース バッファは宛先バッファと同じ長さであるため、バッファ アンダーフローの問題が回避されます。この問題は、境界チェックなどの他の方法でも回避できます。 360 コード ガードを使用して修復されたコードを検出すると、「バッファ アンダーフロー」欠陥が存在しないことがわかります。図 2 に示すように:
(2) 戻り値が明確に示されているメモリ操作関数の場合、関数の戻り値を効果的に判断して、操作が成功したかどうかを判断する必要があります。
(3) バッファにデータを埋めるときに境界チェックを実行する必要があります。
以上がC/C++ プログラムにおけるバッファ アンダーフローとは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。