3 ms·
right, and it should not be left to the serialization layer for that.
by signa11 3y ago
right, and it should not be left to the serialization layer for that.
- afiori 3y agoit depends on what type of safety. The schema language might for example allow you to specify that an input string/blob should be smaller than 10MB and refuse to deserialize it if it is longer, same for array/list/vector length.
- seangrogg 3y agoIt feels like a check against an input size of 10MB is something you would do well before deserialization, no?
- baq 3y agoYou would, but others might not. Defense in depth.
- afiori 3y agonot if it is a message you receive from a third party. A concrete example might be a batching third party client: the app sends N messages in a single batch and each message has its own size limit.
- tom_ 3y agoThe limit might apply to some specific part of the message, rather than the whole. You can't check this without actually deserialising, or at least doing most of the same work.
- signa11 3y ago> ... allow you to specify that an input string/blob should be smaller than 10MB and refuse to deserialize it if it is longer ... why ? are there no cases where serializing even larger file is valid ?
- afiori 3y agosure, a lot of cases, I suspect that S3 upload limits are different from imgur.
- signa11 3y agoand feel free to do that in _your_ application. don’t shackle others with the limitations of your domain. mechanism vs policy and all that.
- afiori 3y agoI believe I have already justified why it might be useful at the protocol/schema level in ways that cannot be replicated at the application level: to eagerly fail on expensive (eg memory) deserialization.
- jiggawatts 3y agoSecurity is a concern for every layer. It's not magic pixie dust that' can be sprinkled on top of software to renders it secure! A while ago I read a great article about how the Adobe PDF serialization format is nearly impossible to secure because it allows inherently unsafe constructs. For example, it allows cross-references that are basically just arbitrary unaligned pointers. It uses many different alignment and padding algorithms. It has length-prefixed and not-length prefixed sections. Etc, etc... Apparently it was a serious research exercise to make a safe PDF parser, and they only covered a fraction of the full spec! To put things in perspective: Originally, PDF allowed arbitrary code execution as a core feature, allowing the output of shell commands to be used as document content. Most people like the Chromium and Firefox teams have just given up and now parse PDF using a sandboxed JavaScript VM because it's too hard to do it safely with C++. They parse HTML and JavaScript with C++, but not PDF. Think about that. A similar issue caused Log4j, where a "format string parser" contained a vulnerability because it was too flexible and allowed network requests to be triggered by user-controlled data. Even trivial, "surely it must be safe" formats like XML and JSON are riddled with security issues, such as different layers in a microservice architecture having different handling semantics for duplicate keys, null values, etc... This can result in exploits such as authentication and authorization tokens being interpreted by a system one way, but a different way by a different system. For real-world attacks along these lines, search for "request smuggling". Serialization and parsing are security minefields and it is dangerously naive to just hand-wave that away. See: https://seriot.ch/projects/parsing_json.html https://seriot.ch/projects/parsing_json.html
- signa11 3y ago> Serialization and parsing are security minefields and it is dangerously naive to just hand-wave that away. well, i am not hand-waving them away, i am not sure what can the serialization framework possibly _do_ to make things secure during the serialization ? when execution of user-supplied code is allowed (in the examples that you have outlined above), surely, the layer _executing_ the code cannot really do anything about it ! perhaps you actually did intend to `rm -rf /` ? policy checking, enforcement etc. has to happen at a higher / different layer. i am not sure why mechanism and policy are being conflated here. in the same way, you gave the serialization layer a 10mb or whatever sized input to serialize, sure...you get an valid serialized output etc. maybe there is a genuine usecase for that in some context or another f.e. when serializing say image files, or something else etc. etc. [edit] : minor comment.
- formerly_proven 3y agoDisregard for safety and security in serialization is one of the most common, if not the most common, cause for security vulnerabilities.