Memory management problems in SFL 2.3

"John Stark" <[email protected]> Wed, 24 Mar 2004 16:41:02 -0000
Newsgroups gmane.ietf.sfl
Message-ID <001701c411be$cbb9daf0$0200a8c0@slug2>
This is a multi-part message in MIME format.

------=_NextPart_000_0014_01C411BE.CB42AF20
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

I have been testing an application that I have ported from SFL 2.1 to SFL
2.3.  As part of this process I have been running it with the "mpatrol"
heap checking library.  The following is a summary of the problems I have
encountered.  Some of these, together with the 3DES and RC2 performance
issue that I reported a while ago, are serious enough to prevent us being
able to deploy SFL 2.3 in place of SFL 2.1.  Others also affected SFL
2.1 but we hoped that a newer release would eliminate them.

These tests were done using GCC 3.3.2 on a Linux system, but nothing
about them suggests platform-dependence.

We would be interested in knowing when a new release is likely to be
available that remedies these deficiencies, plus the others that I
have reported over the last two weeks.

1. Memory leaks

Both signing and signature verification appear to have significant
memory leaks.  The signing memory leak does not occur in the most
trivial case, but does occur in either of the following circumstances:

a. I have set the flag to include the signer's certificates.
b. I have attached a signed attribute (signing time)

The verify leaks occur when processing the messages that exhibited
a leak during signing.  These leaks are reported in:

a. SNACC::AsnRvsBuf::AsnRvsBuf(SNACC::AsnBuf const&)
   - 8 occurrences per verify operation, 24 per sign operation
b. SNACC::AsnBuf::insert(SNACC::AsnBuf const&)
   - 16 occurrences per verify operation, 48 per sign operation

when using a 50kB message content.  Encryption and decryption do
not appear to suffer from leaks in the same way.  The attached
zip file contains some standalone test programs.  The leaks can be
observed by setting the #define REPEATS to a large value (say 1000)
and watching the process grow using "top".

There is also a leak occurring when reading the PKCS#12 file, in:

   CERT::CSM_Free3::ComputePkcs12MAC(CTIL::CSM_Buffer&,
     SNACC::AsnOid const&, char const*, CTIL::CSM_Buffer const&,
     int)

2. Memory overrun

There is a memory overrun in the code in sm_free3:

   CERT::CSM_Free3::Setup(SNACC::AsnOid)

that calls:

   CryptoPP::X917RNG::X917RNG(CryptoPP::BlockTransformation*,
     unsigned char const*, unsigned long)+160

This code expects to be passed a buffer with at least 8 bytes
whereas sm_free3 is allocating 5 bytes.  This bug also existed
in SFL 2.1.

3. Mismatched library calls

I have encountered three of these.  They are benign with GCC,
but might matter on some platforms.

a. SNACC::AsnFileSeg::AsnFileSeg(char const*) allocates member
   m_filename using strdup() (and hence malloc()) but frees it
   using delete.
b. CM_FreeErrInfo() uses free() to free memory allocated using
   new in CML::ErrorInfo::operator errorInfo_List*() const
c. SNACC::ConsStringDeck::~ConsStringDeck() uses delete rather
   than delete [] to free memory allocated using new[] in
   SNACC::AsnBuf::GetSeg(long).

4. Lack of thread safety

One of my tests attempts a series of encrypt, decrypt, sign and verify
operations in 8 threads at once.  This produces failures with SFL 2.3.
One of my colleagues managed, with some effort, to track down use of
a global variable in SFL 2.1, but the code in SFL 2.3 has changed
significantly.  The exceptions thrown in one run of the test included
the following:

SNACC::SnaccException:
  m_errorCode   6003
  what()   Tag [-335544320] is invalid for type SafeContents
  getCallStack()->function AsnSeqOf<T>:BDec()
  getCallStack()->file  ... SMPDist/include/esnacc/c++/asn-list.h

SNACC::SnaccException:
  m_errorCode   1017
  what()   encapsulated content digest != message digest attribute
  getCallStack()->function
Verify(pCSMIME,pOriginalEncapContent,encapContentInfo,pCerts,pSignedAttrs)
  getCallStack()->file  sm_MsgSignerInfo.cpp

std::exception thrown by crypto++ and not caught within SFL:
  what()   BER decode error

5. Lack of handling of std::exception exceptions thrown by crypto++

crypto++ 5.1 can throw std::exception in a variety of circumstances,
especially when presented with messages with faulty encoding.  The
CSM_Free3 CTIL does not catch these, hence if one occurs it will not
perform cleanup.  This problem also existed in SFL 2.1.

6. Less robust than SFL 2.1

I have been testing with a collection of CMS messages containing
malformed ASN.1, which are designed to test the vulnerability of systems
to denial-of-service attacks.  SFL 2.3 seems somewhat less robust
than SFL 2.1 in this respect, particularly its decryption code.  The
number of failures recorded were as follows:

   SFL 2.1  SFL 2.3
Total number of tests: 1345101  1345101
Assertion failure: 231  3
Segmentation fault: 4363  7073
Infinite loop:  128  214

There may have been more assertion failures with SFL 2.1 because part
of SFL 2.1 was built with debug options.

7. Memory usage processing large messages

If I supply input to the sign, verify, encrypt or decrypt operations
in a CSM_Buffer that is held in a file rather than in RAM, the operations
still allocate further RAM-based buffers rather than file-based ones
during processing.  Memory usage can peak at around 6x the size of the
content.  I haven't come across a way of making SFL allocate file-based
buffers to allow large messages to be processed without consuming lots of
RAM.  This was the same in SFL 2.1.


John Stark
Tel: +44 1223 566732
Mobile: +44 7968 110628
E-mail: [email protected]
Web: http://www.metanate.com

------=_NextPart_000_0014_01C411BE.CB42AF20
Content-Type: application/x-zip-compressed;
	name="files.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="files.zip"

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
AA==

------=_NextPart_000_0014_01C411BE.CB42AF20--