ホームページ  >  記事  >  運用・保守  >  C言語の汚染されたメモリ割り当て関数の例の分析

C言語の汚染されたメモリ割り当て関数の例の分析

WBOY
WBOY転載
2023-05-15 11:13:05946ブラウズ

1. 汚染されたメモリ割り当て

C 言語のメモリ割り当て関数には、malloc()kmalloc smalloc があります。 ()xmalloc()realloc()calloc()GlobalAlloc() HeapAlloc () など。例として malloc() を取り上げます。malloc() 関数のプロトタイプは次のとおりです。

extern void*malloc ( unsignedintnum_bytes);

malloc() この関数は、num_bytes バイトのメモリを割り当て、このメモリへのポインタを返します。メモリ割り当て長の整数が汚染されている可能性のある信頼できないソースから取得されたものである場合、外部入力データが効果的に判断されないと、メモリ割り当てが非常に大きくなる可能性があります。汚染されている可能性がある信頼できないソースには、コマンド ライン パラメーター、構成ファイル、ネットワーク通信、データベース、環境変数、レジストリ値、およびアプリケーション外部からのその他の入力が含まれます。

2. 汚染されたメモリ割り当ての害

非常に大きな整数値を渡すなど、メモリ割り当て関数の長さパラメータとして汚染されたデータを直接使用します。プログラムはそれに応じて大量のメモリを割り当て、その結果、システムに膨大なメモリ オーバーヘッドが発生し、さらにはサービス妨害攻撃につながることもあります。

CVE には関連する脆弱性情報もいくつかあります。2018 年 1 月から 2019 年 3 月までに、CVE には関連する脆弱性情報が 4 件ありました。脆弱性情報は次のとおりです。

##CVE概要CVE-2018-6869ZZIPlib バージョン 0.13.68 の zzip/zip.c ファイルの「__zzip_parse_root_directory」関数にセキュリティ上の脆弱性があります。リモートの攻撃者がこの脆弱性を悪用し、特別に細工された zip ファイルを使用してサービス妨害 (制御されないメモリ割り当てとクラッシュ) を引き起こす可能性があります。 CVE-2018-5783PoDoFo の Base/PdfVecObjects.h ファイルの「PoDoFo::PdfVecObjects::Reserve」関数にセキュリティ上の脆弱性があります。 0.9.5バージョン。リモートの攻撃者がこの脆弱性を悪用し、特別に細工された PDF ファイルを使用してサービス妨害 (制御されないメモリ割り当て) を引き起こす可能性があります。 CVE-2018-5296PoDoFo バージョン 0.9 の Base/PdfParser.cpp ファイルの「PdfParser::ReadXRefSubsection」関数にセキュリティ上の脆弱性があります。 5. この脆弱性は、プログラムがメモリの割り当てを制御しないという事実に起因します。リモートの攻撃者がこの脆弱性を悪用し、特別に細工された PDF ファイルを使用してサービス妨害を引き起こす可能性があります。


3. サンプル コード

このセクションで使用される例は、CWE-789: Uncontrolled Memory Allocation (http://cwe.mitre.org/data/) を参照しています。 Definitions/789 .html) を参照し、例の GetUntrustedInt() 関数を定義します。

3.1 欠陥コード

C言語の汚染されたメモリ割り当て関数の例の分析

上記のコード例では、9 行目で malloc() が使用されています。この関数は長さ totBytes バイトのメモリ割り当てを実行します。パスをトレースするとわかるように、totBytessize*sizeof(char); によって計算されます。 6 行目 結果が割り当てられます。size の値は、7 行目の scanf() 関数を使用して取得されたユーザー キーボード入力です。これは汚染されたデータ ソースであり、結果として次のようになります。メモリ割り当ての長さ totBytes が汚染されており、「汚染されたメモリ割り当て」問題が発生しています。

360 コード ガードを使用して上記のサンプル コードを検出すると、「汚染されたメモリ割り当て」の欠陥を検出でき、表示レベルが高くなります。図 1 に示すように:


C言語の汚染されたメモリ割り当て関数の例の分析

図 1: 汚染されたメモリ割り当ての検出例

3.2 修復コード

C言語の汚染されたメモリ割り当て関数の例の分析

上記の修復コードでは、totBytes のソースは汚染されたデータですが、10 行目では totBytes が修正されていません。実質的に制限されるため、汚染されたメモリ割り当てが回避されます。

360 Code Guard を使用して修復されたコードを検出すると、「汚染されたメモリ割り当て」欠陥がないことがわかります。図 2 に示すように:


C言語の汚染されたメモリ割り当て関数の例の分析

図 2: 修復後の検出結果

4. 汚染されたメモリ割り当てを回避する方法

(1) 汚染されたデータをメモリ割り当て関数の長さパラメータとして直接使用することを避け、それが避けられない場合は、汚染されたデータを効果的に制限する必要があります。

(2) ソースコードの静的解析ツールを使用すると、このような問題を効果的に発見できます。

以上がC言語の汚染されたメモリ割り当て関数の例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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