最近、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;
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を改善したコードが適用されているため、この問題は発生しなくなります。
Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Free Delphi Community Edition Free C++Builder Community Edition







