Wireshark-dev: Re: [Wireshark-dev] Failure to dissect long SASL wrapped LDAP response
From: Kaul <[email protected]>
Date: Sun, 22 Jun 2008 22:14:21 +0300
Please find attached patch against SVN 25526 to fix the problem. My >64K capture is working fine with it. The fix:
1. Defines LDAP_SASL_MAX_BUF to 4*64*1024 - in packet-ldap.h
2. Uses it - in packet-ldap.c instead of the hard-coded 65535 value below.
3. Documents this in the comments.

It's obviously incomplete, in the sense that SASL buffers probably may be bigger than my above 4*64K, but it fixes my issue and leaves room for fixing it in a general manner.

Comments are welcome,
Y.

On Thu, Jun 12, 2008 at 11:53 PM, Kaul <[email protected]> wrote:
Oh, that may explain it (from packet-ldap.c) marked with bold/italic/underline:
/* check for a SASL header, i.e. assume it is SASL if 
* 1, first four bytes (SASL length) is an integer
* with a value that must be <64k and >2
* (>2 to fight false positives, 0x00000000 is a common
* "random" tcp payload)
* (no SASL ldap PDUs are ever going to be >64k in size?)
*
* 2, we must have a conversation and the auth type must
* be LDAP_AUTH_SASL
*/

sasl_len=tvb_get_ntohl(tvb, 0);

if( sasl_len<2 ){
goto this_was_not_sasl;
}

if( sasl_len>65535 ){
goto this_was_not_sasl;
}

Apparently, the above assumption is wrong.

Y.




On Thu, Jun 12, 2008 at 11:40 PM, Kaul <[email protected]> wrote:
Wireshark 1.0.0, win32, fails to de-segment (TCP level?) and properly dissect a pretty long (229959 bytes entire conversation) SASL wrapped LDAP response. Regretfully, I cannot share the capture, but the first packet that is not desgemented or dissected in any way (just shows as TCP payload) is (partial):
0000   00 1a 4a 16 45 5b 00 e0 81 58 df d2 08 00 45 00  ..J.E[...X....E.
0010   05 dc 0a 32 40 00 7f 06 b6 5f ac 12 00 0a ac 12  [email protected]_......
0020   dd 5b 01 85 04 6f 45 8d a8 34 af 22 1e e4 50 10  .[...oE..4."..P.
0030   fc 6b f5 dc 00 00 00 03 6c c9 60 83 03 6c c4 06  .k......l.`..l..
0040   09 2a 86 48 86 f7 12 01 02 02 02 01 11 00 ff ff  .*.H............
0050   ff ff 08 ae f4 9e f4 35 2f ce dc d3 82 f1 55 e9  .......5/.....U.
0060   31 69 c4 2b 93 b2 85 fc 80 14 30 84 00 03 6c 7c  1i.+......0...l|
0070   02 01 31 64 84 00 03 6c 73 04 40 43 4e 3d 41 67  [email protected]=Ag
0080   67 72 65 67 61 74 65 2c 43 4e 3d 53 63 68 65 6d  gregate,CN=Schem
...
Notice from offeset 0x36 (after the TCP header) - the size of the SASL buffer is 00 03 6c c9 (224457 bytes), then the usual LDAP ASN.1: 0x60, then 0x83, (3 bytes of length which is now 0x36cc4 -> correctly 5 bytes less than the SASL buffer, followed by the Kerberos 5 OID, and so on.
Please note that previos LDAP request and responses were nicely dissected. It's just this long response that doesn't play nice. The unbind request at the end of all this also looks nice.

I'd be happy to work with someone on testing a fix for it. I could test a Windows binary or a source patch in Linux.

Thanks in advance,
Yaniv.


Attachment: packet-ldap.h.diff
Description: Binary data

Attachment: packet-ldap.c.diff
Description: Binary data