最近、C/C++ ランタイム ライブラリ (RTL) に潜在的なバッファオーバーフローがあることが判明しました。この問題は1997年に実装されたコードに起因しており、実装されてから現在に至るまで悪用された事例はありませんが、安全性と公開性を確保するため、このブログでは慎重に問題箇所の開示とその修正方法をご案内いたします。
バッファオーバーフローの問題に関する情報:
- _wgetcurdir、_wsearchstr、および「_t」バリアントの _tgetdcwd と _tgetcwd に影響します。これらのメソッドは、現在の作業ディレクトリを取得するもので、POSIX getcwdに基づく非ISO標準関数、またはワイド文字向けに拡張された、それらを使用して解決できるマクロです。
- Unicodeのビルドに影響
- これらのメソッドがバッファとして null が渡されたときにのみ発生します。この状況では、このメソッドはバッファ自体を割り当てますが、Unicodeでは必要な領域の半分しか割り当てません。つまり、現在の作業ディレクトリ名の一部がバッファの境界を超えて書き込まれる可能性があります。
- 以下の条件を満たすアプリケーションは該当するRTLの使用により影響を受けます。
- (a)上述したメソッドやマクロを使用している
- (b)Windows向けのクラシックWin32 Clang(bcc32c)、および古いWin64 Clang (Clang v5)ツールチェーン(bcc64)でC++プロジェクトをビルドしている
- STLには影響しません。
- Windows 64ビットの新しいモダン C++ツールチェーン(bcc64x)でビルドされたアプリケーションには影響しません。
- C++BuilderやRAD StudioのIDE自体には影響しません。
推奨される軽減策
お客様のソースコード内で問題となるメソッドやマクロが使用されているかどうかを確認し、もし当該のメソッドやマクロを使用している箇所があり、C++Builder 12.1 よりも前のバージョンを利用されている場合は、お客様のC++プロジェクトのコードを以下のいずれかの方法で修正してください。
- 事前に割り当てられたバッファをメソッドに渡す
- Windows APIのGetCurrentDirectoryに置き換える
本件の修正箇所について
本件で修正されたコード箇所は、以下の通りです。実際の修正箇所は、黄色のハイライトの-部分のコード箇所を削除し、+部分のコード箇所に置き換えています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--- 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; |
C++Builder 12.1 向けに上記の修正が行われたC/C++ RTLバイナリを提供しております。
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を改善したコードが適用されているため、この問題は発生しなくなります。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition