[27719] in bugtraq

home help back first fref pref prev next nref lref last post

When scrubbing secrets in memory doesn't work

daemon@ATHENA.MIT.EDU (Michael Howard)
Tue Nov 5 18:09:43 2002

Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Date: Tue, 5 Nov 2002 14:13:07 -0800
Message-ID: <4B0F3B603558B44B9F4608630B4F641105356B8E@red-msg-06.redmond.corp.microsoft.com>
From: "Michael Howard" <mikehow@microsoft.com>
To: <bugtraq@securityfocus.com>
Content-Transfer-Encoding: 8bit

During the Windows Security Push in Feb/Mar 2002, we noticed an
'interesting' anomaly with code to scrub passwords that looks like this:

bool DoSensitiveStuff() {
	bool fOK = false;
	const size_t cbPwd = 64;
	char szPwd[cbPwd];
	if (GetUserPassword(szPwd,cbPwd-1)) 
		if (DoSomethingWithPassword(szPwd))
			fOK = true;		

	memset(szPwd,0,cbPwd);

	return fOK;	
} 

On the surface, this looks fine, until you look at the ASM output, and
you see the call to memset has been removed by the optimizer because
szPwd is not read once the function completes. Hence, the secret data is
still floating in memory.

This optimization, common in most modern C/C++ compilers is often
referred to as "dead store removal."

A full write-up outlining the issue in more detail, as well as some
remedies is at
http://msdn.microsoft.com/library/en-us/dncode/html/secure10102002.asp.


Cheers, Michael Howard
Secure Windows Initiative
Microsoft Corp.

Writing Secure Code 
http://www.microsoft.com/mspress/books/5612.asp

home help back first fref pref prev next nref lref last post