Add a definition of the security model to the documentation.
This commit is contained in:
79
docs/security.rst
Normal file
79
docs/security.rst
Normal file
@@ -0,0 +1,79 @@
|
||||
======================
|
||||
Nanopb: Security model
|
||||
======================
|
||||
|
||||
.. include :: menu.rst
|
||||
|
||||
.. contents ::
|
||||
|
||||
|
||||
|
||||
Importance of security in a Protocol Buffers library
|
||||
====================================================
|
||||
In the context of protocol buffers, security comes into play when decoding
|
||||
untrusted data. Naturally, if the attacker can modify the contents of a
|
||||
protocol buffers message, he can feed the application any values possible.
|
||||
Therefore the application itself must be prepared to receive untrusted values.
|
||||
|
||||
Where nanopb plays a part is preventing the attacker from running arbitrary
|
||||
code on the target system. Mostly this means that there must not be any
|
||||
possibility to cause buffer overruns, memory corruption or invalid pointers
|
||||
by the means of crafting a malicious message.
|
||||
|
||||
Division of trusted and untrusted data
|
||||
======================================
|
||||
The following data is regarded as **trusted**. It must be under the control of
|
||||
the application writer. Malicious data in these structures could cause
|
||||
security issues, such as execution of arbitrary code:
|
||||
|
||||
1. Callback and extension fields in message structures given to pb_encode()
|
||||
and pb_decode(). These fields are memory pointers, and are generated
|
||||
depending on the .proto file.
|
||||
2. The automatically generated field definitions, i.e. *pb_field_t* lists.
|
||||
3. Contents of the *pb_istream_t* and *pb_ostream_t* structures (this does not
|
||||
mean the contents of the stream itself, just the stream definition).
|
||||
|
||||
The following data is regarded as **untrusted**. Invalid/malicious data in
|
||||
these will cause "garbage in, garbage out" behaviour. It will not cause
|
||||
buffer overflows, information disclosure or other security problems:
|
||||
|
||||
1. All data read from *pb_istream_t*.
|
||||
2. All fields in message structures, except callbacks and extensions.
|
||||
(Beginning with nanopb-0.2.4, in earlier versions the field sizes are partially unchecked.)
|
||||
|
||||
Invariants
|
||||
==========
|
||||
The following invariants are maintained during operation, even if the
|
||||
untrusted data has been maliciously crafted:
|
||||
|
||||
1. Nanopb will never read more than *bytes_left* bytes from *pb_istream_t*.
|
||||
2. Nanopb will never write more than *max_size* bytes to *pb_ostream_t*.
|
||||
3. Nanopb will never access memory out of bounds of the message structure.
|
||||
4. After pb_decode() returns successfully, the message structure will be
|
||||
internally consistent:
|
||||
|
||||
- The *count* fields of arrays will not exceed the array size.
|
||||
- The *size* field of bytes will not exceed the allocated size.
|
||||
- All string fields will have null terminator.
|
||||
|
||||
5. After pb_encode() returns successfully, the resulting message is a valid
|
||||
protocol buffers message. (Except if user-defined callbacks write incorrect
|
||||
data.)
|
||||
|
||||
Further considerations
|
||||
======================
|
||||
Even if the nanopb library is free of any security issues, there are still
|
||||
several possible attack vectors that the application author must consider.
|
||||
The following list is not comprehensive:
|
||||
|
||||
1. Stack usage may depend on the contents of the message. The message
|
||||
definition places an upper bound on how much stack will be used. Tests
|
||||
should be run with all fields present, to record the maximum possible
|
||||
stack usage.
|
||||
2. Callbacks can do anything. The code for the callbacks must be carefully
|
||||
checked if they are used with untrusted data.
|
||||
3. If using stream input, a maximum size should be set in *pb_istream_t* to
|
||||
stop a denial of service attack from using an infinite message.
|
||||
4. If using network sockets as streams, a timeout should be set to stop
|
||||
denial of service attacks.
|
||||
|
||||
Reference in New Issue
Block a user