about summary refs log tree commit diff
path: root/users/Profpatsch/netencode/README.md
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2022-07-01T12·16+0200
committerProfpatsch <mail@profpatsch.de>2022-07-01T12·37+0000
commit46f908c3c1d6049c3aa944e2a1086fea252f3b8e (patch)
treec483020fcf6fa2546e489105d5233fb6ddf807cf /users/Profpatsch/netencode/README.md
parentaea54af52e0b80fd79c9cfa432512c0d895e865f (diff)
docs(users/Profpatsch/netencode): Parser security considerations r/4270
Netencode parsers should probably set an upper length limit.

Change-Id: Ibe65f2b59058106b720867a83435bf45660f1adf
Reviewed-on: https://cl.tvl.fyi/c/depot/+/5908
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
Diffstat (limited to 'users/Profpatsch/netencode/README.md')
-rw-r--r--users/Profpatsch/netencode/README.md18
1 files changed, 18 insertions, 0 deletions
diff --git a/users/Profpatsch/netencode/README.md b/users/Profpatsch/netencode/README.md
index 8dc39f6337..840ffaedd0 100644
--- a/users/Profpatsch/netencode/README.md
+++ b/users/Profpatsch/netencode/README.md
@@ -102,6 +102,24 @@ Similar to records, lists start with the length of their whole encoded content.
 * The list with text `foo` followed by i3 `-42`: `[14:t3:foo,i3:-42,]`
 * The list with `Some` and `None` tags: `[33:<4:Some|t3:foo,<4None|u,<4None|u,]`
 
+## parser security considerations
+
+The length field is a decimal number that is not length-restricted,
+meaning an attacker could give an infinitely long length (or extremely long)
+thus overflowing your parser if you are not careful.
+
+You should thus put a practical length limit to the length of length fields,
+which implicitely enforces a length limit on how long the value itself can be.
+
+Start by defining a max value length in bytes.
+Then count the number of decimals in that number.
+
+So if your max length is 1024 bytes, your length field can be a maximum `count_digits(1024) == 4` bytes long.
+
+Thus, if you restrict your parser to a length field of 4 bytes,
+it should also never parse anything longer than 1024 bytes for the value
+(plus 1 byte for the type tag, 4 bytes for the length, and 2 bytes for the separator & ending character).
+
 ## motivation
 
 TODO