Site icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

C/C++のRTLにおけるバッファオーバーフロー

最近、C/C++ ランタイム ライブラリ (RTL) に潜在的なバッファオーバーフローがあることが判明しました。この問題は1997年に実装されたコードに起因しており、実装されてから現在に至るまで悪用された事例はありませんが、安全性と公開性を確保するため、このブログでは慎重に問題箇所の開示とその修正方法をご案内いたします。

バッファオーバーフローの問題に関する情報:

推奨される軽減策

お客様のソースコード内で問題となるメソッドやマクロが使用されているかどうかを確認し、もし当該のメソッドやマクロを使用している箇所があり、C++Builder 12.1 よりも前のバージョンを利用されている場合は、お客様のC++プロジェクトのコードを以下のいずれかの方法で修正してください。

本件の修正箇所について

本件で修正されたコード箇所は、以下の通りです。実際の修正箇所は、黄色のハイライトの-部分のコード箇所を削除し、+部分のコード箇所に置き換えています。

--- a/source/io/getdcwd.c
+++ b/source/io/getdcwd.c
@@ -37,7 +37,7 @@ Description 	_getdcwd gets the full path name of the working directory
             	error occurs.  The drive is 0 for the default drive, 1=A,
             	2=B, etc.

-            	If buf is NULL, a buffer n bytes long will be allocated
+            	If buf is NULL, a buffer n characters long will be allocated
             	for you with malloc. You can later free the allocated buffer
             	by passing the _getdcwd return value to the function free.

@@ -117,7 +117,7 @@ _TCHAR * _RTLENTRY _EXPFUNC _tgetdcwd(int drive, _TCHAR *bufP, int bufL)
  	*/
 	if (bufP == NULL)
 	{
-    	if ((bufP = malloc(bufL)) == NULL)
+    	if ((bufP = malloc(bufL * sizeof(_TCHAR))) == NULL)
     	{
         	errno = ENOMEM;
         	return  NULL;

my.embarcadero.com のサイトから「C++Builder and RAD Studio 12.1 C++ RTL Replacement」という名前の RTL のビルド済みバージョンをダウンロードできます。もし問題がある場合は、エンバカデロのサポートセンターへご連絡ください。

影響を受けるバージョン

この問題は、C++Builder Community Editionおよび無償版のC++ Compiler、そしてC++Builder 12.1を含む過去バージョンに影響します。なお、C++Builder および RAD Studio の将来のバージョンでは、予めRTLを改善したコードが適用されているため、この問題は発生しなくなります。

Exit mobile version