NetShareEnum: disable sanity check for better compatibility with Windows

Giovanni Bajo rasky at develer.com
Sun Dec 6 06:31:13 MST 2009


Il giorno dom, 29/11/2009 alle 14.46 +0100, Volker Lendecke ha scritto:
> On Sun, Nov 29, 2009 at 02:15:18PM +0100, Giovanni Bajo wrote:
> > the attached patches increase Samba compatibility with Windows by
> > disabling a sanity check which prevents Samba from issuing an answer to
> > a NetShareEnum request in case of a corrupted (invalid) packet.
> > 
> > Long version. I have recently bought a Samsung BD-P3600 bluray player.
> > This unit has wired/wifi connection and a primitive/buggy support for
> > streaming files off Windows shares. It works well if the shares are on a
> > Windows PC, but it fails to detect shares on Linux and Mac OSX. I
> > investigated the problem and it turns out that the bluray player sends
> > an invalid packet:
> > 
> > 0000  00 1b fc 91 80 08 00 12  fb 2a d9 7c 08 00 45 00   ........ .*.|..E.
> > 0010  00 9e b8 2e 40 00 40 06  fe c2 c0 a8 01 17 c0 a8   .... at .@. ........
> > 0020  01 01 cc 54 00 8b 46 cc  34 d6 de 00 9f ae 80 18   ...T..F. 4.......
> > 0030  0b 68 01 e3 00 00 01 01  08 0a 00 00 99 c7 00 64   .h...... .......d
> > 0040  41 2d 00 00 00 66 ff 53  4d 42 25 00 00 00 00 08   A-...f.S MB%.....
> > 0050  01 00 00 00 00 00 00 00  00 00 00 00 00 00 01 00   ........ ........
> > 0060  3b 00 00 00 9f 00 0e 1a  00 00 00 63 00 ff ff 00   ;....... ...c....
> > 0070  00 00 00 00 00 00 00 00  00 1a 00 4c 00 00 00 66   ........ ...L...f
> > 0080  00 00 00 27 00 5c 50 49  50 45 5c 4c 41 4e 4d 41   ...'.\PI PE\LANMA
> > 0090  4e 00 00 00 57 72 4c 65  68 00 42 31 33 42 57 7a   N...WrLe h.B13BWz
> > 00a0  57 57 57 7a 42 39 42 00  01 00 ff ff               WWWzB9B. ....
> > 
> > Microsoft Windows Lanman Remote API Protocol
> >   Function Code: NetShareEnum (0)
> >   Parameter Descriptor: WrLeh
> >   Return Descriptor: B13BWzWWWzB9B
> >   Detail Level: 1
> >   Receive Buffer Length: 65535
> > 
> > This packet is malformed because, for level 1 query, the correct return
> > descriptor would be "B13BWz". I've attached the full wireshark dump, in
> > case it matters.
> > 
> > What happens is that Samba refuses to answer to this query because it
> > fails an internal sanity check; instead, Windows happily answers and the
> > conversation goes on.
> > 
> > I verified my fix against a samba2 server (this is what I'm running on
> > my DDWRT-based router), and forward-ported the same patch on samba3 and
> > samba4 trees by visual inspection.
> > 
> > This is my first contribution to Samba, so I'm looking for some guidance
> > for this patch to be accepted.
> 
> It seems that the descriptor they send is actually a level2
> descriptor. Can you get us a trace against a Windows box? I
> would be interested to see what they return in this case. Do
> they decide based upon the level or the descriptor?

Hi Volker,

sorry for the late reply. This is the packet returned by a Windows box
when queried with the malformed LANMAN request quoted above:

0000  00 12 fb 2a d9 7c 00 21  63 fe 8e 85 08 00 45 00   ...*.|.! c.....E.
0010  01 19 18 e5 40 00 80 06  5c b6 c0 a8 01 dc c0 a8   .... at ... \.......
0020  01 17 00 8b d9 da a3 31  12 99 e1 d2 01 fa 80 18   .......1 ........
0030  8d f8 d0 62 00 00 01 01  08 0a 00 01 bf b5 00 04   ...b.... ........
0040  86 ff 00 00 00 e1 ff 53  4d 42 25 00 00 00 00 88   .......S MB%.....
0050  01 00 00 00 00 00 00 00  00 00 00 00 00 00 01 08   ........ ........
0060  3b 00 02 08 9f 00 0a 08  00 a1 00 00 00 08 00 38   ;....... .......8
0070  00 00 00 a1 00 40 00 00  00 00 00 aa 00 00 00 00   ..... at .. ........
0080  5e ff 05 00 05 00 49 50  43 24 00 00 00 00 00 00   ^.....IP C$......
0090  00 00 00 00 03 00 f4 ff  00 00 44 4f 57 4e 00 00   ........ ..DOWN..
00a0  00 00 00 00 00 00 00 00  00 00 f3 ff 00 00 44 6f   ........ ......Do
00b0  77 6e 6c 6f 61 64 00 00  00 00 00 00 00 00 f2 ff   wnload.. ........
00c0  00 00 41 44 4d 49 4e 24  00 00 00 00 00 00 00 00   ..ADMIN$ ........
00d0  00 00 db ff 00 00 43 24  00 00 00 00 00 00 00 00   ......C$ ........
00e0  00 00 00 00 00 00 c2 ff  00 00 43 6f 6e 64 69 76   ........ ..Condiv
00f0  69 73 69 6f 6e 65 20 70  72 65 64 65 66 69 6e 69   isione p redefini
0100  74 61 00 41 6d 6d 69 6e  69 73 74 72 61 7a 69 6f   ta.Ammin istrazio
0110  6e 65 20 72 65 6d 6f 74  61 00 00 00 49 50 43 20   ne remot a...IPC 
0120  72 65 6d 6f 74 6f 00                               remoto. 

Wireshark decodes it as "NetShareEnum Response[malformed packet]". It
obviously is a level-1 answer (you can see that there are exactly 18
bytes between "IPC$" and "DOWN"). Wireshark tries to decoded it at
level-2 and fails.

So what happens is that Windows ignores the descriptor and trusts the
level. On the other hand, Wireshark seems to trust the descriptor more
and thus fails to decode the packet. In fact, it does not even mark the
query packet as malformed, though it obviously doesn't match the
specifications.

> And, would it be possible not to completely drop the check
> but to also allow the level2 descriptor for level1?

Sure, see the attached patch. I would say that my experiment proves that
the descriptor is ignored by Windows (at least for the NetShareEnum
query) and thus it is better to drop the check altogether, but anyway.

BTW, compared to last week, I have now also verified the fix against a
patched Samba3 server (previously, I had tested it on Samba2 only).

Thanks!
-- 
Giovanni Bajo
Develer S.r.l.
http://www.develer.com

-------------- next part --------------
A non-text attachment was scrubbed...
Name: netshareenum.2.patch
Type: text/x-patch
Size: 1019 bytes
Desc: not available
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20091206/85078a2e/attachment.bin>


More information about the samba-technical mailing list