Re: Preventing Denial of Service Attack In IPC Serialization
On Jun 11, 10:18 am, jlind...@hotmail.com wrote:
LOL. I am deserializing from a _packet_ ! A packet of fixed length,
completely unlike the socket that you are deserializing from. I am
guaranteed a successful reception or an EOF exception, without ever
reading more than e.g. 1 Mb from the client. The only DOS
vulnerability in sight is if my _application_ is reading an unlimited
number of strings, for reasons of its own. But that has nothing, I
repeat _nothing_, to do with the deserialization code of individual
strings. Do you not see that?
Why are you doing that? I mentioned that I was deserializing from a
socket, not a packet.
Do you really not see the difference between "socket >> s" and "packet
Yes I do. I was referring to deserialization from a socket.
What is it you don't understand about a length-prefixed packet? Why
would you have your receiver automatically read in all the data the
attacker is sending? And what does this have to do with the
deserialization code?
In most serialization frameworks, when a programmer defines the
serialization code for a class, that code is written independently of
the "Archive" class that is being serialized to/from.
No matter what is done with a packet, it is conceivable to serialize a
1MB string object to/from a Socket Archive. There would be contexts
where this is legitimate, and contexts when it is not. In context
where 1MB would be legitimate, where sender is a friend, serialization
is ideal because it frees the user of the serialization code from
tedium of fix-sized arrays. As soon as the sender becomes foe, DoS
becomes a real issue. That same code would not be usable as written.
It would have to be replaced with code that uses fixed-size arrays,
and checks would be made. So the serialization code, which would
normally have been universally applicable, becomes not.
I've lost track of how many times I've repeated the following point to
you:
* You need to decouple deserialization from network reception.
Could you please address it! Please.
I empathize with your frustration. ;)
Let's say I have a class Archive which is a base class to which things
can be serialized to/from
class Archive {} ;
Then I have a class File that derives from Archive:
class File : protected Archive {} ;
I overload operator << for String and Foo
Archive &operator << (Archive &, const String &);
Archive &operator << (Archive &, const Foo &);
Are you implying that if I define a class Socket
class Socket : public Archive {}
....that, in general, I can use the same operator << for File, Archive,
and Socket, without modification?
That is the problem that I brought forth.
-Le Chaud Lapin-
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]