From: Ian R. <ia...@re...> - 2006-11-12 20:48:50
|
Mark, Thanks for the bug report. I've checked in a change to make to_length an int, instead of STRLEN. However, before cutting a release, I'd like if possible to understand the core problem. Would you mind editing your copy of RSA.xs to change to_length to an int, and then see what error is getting reported by the call to CHECK_OPEN_SSL(0)? - Ian On Fri, 2006-11-10 at 16:28 +0100, Mark Martinec wrote: > Noticing that selftest on installing Mail::DKIM 0.20 causes perl > to segfault while checking the last signature in multiple_1.txt > (test t/verifier.t), I recompiled RSA.xs with debugging and > checked what is going on: > > Program received signal SIGSEGV, Segmentation fault. > > (gdb) bt > #0 0x2825f78e in memmove () from /lib/libc.so.6 > #1 0x280f53ae in Perl_sv_setpvn () from .../5.8.8/mach/CORE/libperl.so > #2 0x280f7859 in Perl_newSVpv () from .../5.8.8/mach/CORE/libperl.so > #3 0x283964ff in rsa_crypt (p_rsa=0x8561164, p_from=0x849238c, > p_crypt=0x28332a10 <RSA_public_encrypt>) at RSA.xs:203 > #4 0x28397ddb in XS_Crypt__OpenSSL__RSA_encrypt (cv=0x849196c) at RSA.xs:404 > #5 0x280f01c0 in Perl_pp_entersub () from .../5.8.8/mach/CORE/libperl.so > #6 0x280e91a5 in Perl_runops_standard () from .../5.8.8/mach/CORE/libperl.so > #7 0x28098b8a in perl_run () from .../5.8.8/mach/CORE/libperl.so > #8 0x08048fe2 in main () > > (gdb) up > #1 0x280f53ae in Perl_sv_setpvn () from .../5.8.8/mach/CORE/libperl.so > (gdb) up > #2 0x280f7859 in Perl_newSVpv () from .../5.8.8/mach/CORE/libperl.so > (gdb) up > #3 0x283964ff in rsa_crypt (p_rsa=0x8561164, p_from=0x849238c, > p_crypt=0x28332a10 <RSA_public_encrypt>) at RSA.xs:203 > 203 sv = newSVpv(to, to_length); > > (gdb) p to_length > $2 = 4294967295 > > The code in RSA.xs in question is: > > SV* rsa_crypt(rsaData* p_rsa, SV* p_from, > int (*p_crypt)(int, const unsigned char*, unsigned char*, RSA*, int)) > { > STRLEN from_length, to_length; > ... > to_length = p_crypt( > from_length, from, (unsigned char*) to, p_rsa->rsa, p_rsa->padding); > > if (to_length < 0) <-- is false because to_length is unsigned > { > Safefree(to); > CHECK_OPEN_SSL(0); > } > --> crashes here: > sv = newSVpv(to, to_length); > > So the problem is that p_crypt returns -1, which is converted > to unsigned 4294967295, and memmove crashes trying to copy > 4 GB of nonexistent data to some allocated buffer. > > I'd be surprised if there is no security problem, although at the > moment I'm more concerned with keeping Perl application programs stable. > There are other potentially troublesome signed/unsigned conversions > in RSA.xs and typecasting 64-bit pointers to smaller integers, > although I haven't examined them closely. > > Btw, STRLEN boils down to size_t, which is unsigned 32-bit > value. This is on FreeBSD 6.1, Perl 5.8.8 from ports, > security/p5-Crypt-OpenSSL-RSA 0.23 from ports, although this > probably applies to most modern platforms. > > Regards > Mark > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > _______________________________________________ > Perl-openssl-users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-openssl-users |