Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
C++RAD Studioアップデートニュース

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

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

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

  • _wgetcurdir、_wsearchstr、および「_t」バリアントの _tgetdcwd と _tgetcwd に影響します。これらのメソッドは、現在の作業ディレクトリを取得するもので、POSIX getcwdに基づく非ISO標準関数、またはワイド文字向けに拡張された、それらを使用して解決できるマクロです。
  • 以下の条件を満たすアプリケーションは該当するRTLの使用により影響を受けます。
  • STLには影響しません
  • Windows 64ビットの新しいモダン C++ツールチェーン(bcc64x)でビルドされたアプリケーションには影響しません
  • C++BuilderやRAD StudioのIDE自体には影響しません

推奨される軽減策

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

  • 事前に割り当てられたバッファをメソッドに渡す
  • Windows APIのGetCurrentDirectoryに置き換える

本件の修正箇所について

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

--- 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を改善したコードが適用されているため、この問題は発生しなくなります。

RAD Studio 13.1 Florence Now Available See What's New in RAD Studio 13.1 Delphi is 31 - Webinar Replay

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.

Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

IN THE ARTICLES