Selaa lähdekoodia

use limited unpacker for outer key, fixes #2174 (#2790)

* use limited unpacker for outer key, fixes #2174

* fixup: higher inner key data size limit
TW 8 vuotta sitten
vanhempi
sitoutus
9ca666907b
2 muutettua tiedostoa jossa 12 lisäystä ja 2 poistoa
  1. 3 1
      src/borg/crypto/key.py
  2. 9 1
      src/borg/helpers.py

+ 3 - 1
src/borg/crypto/key.py

@@ -597,7 +597,9 @@ class KeyfileKeyBase(AESKeyBase):
         return False
 
     def decrypt_key_file(self, data, passphrase):
-        data = msgpack.unpackb(data)
+        unpacker = get_limited_unpacker('key')
+        unpacker.feed(data)
+        data = unpacker.unpack()
         enc_key = EncryptedKey(internal_dict=data)
         assert enc_key.version == 1
         assert enc_key.algorithm == 'sha256'

+ 9 - 1
src/borg/helpers.py

@@ -169,8 +169,16 @@ def get_limited_unpacker(kind):
                          object_hook=StableDict,
                          unicode_errors='surrogateescape',
                          ))
+    elif kind == 'key':
+        args.update(dict(use_list=True,  # default value
+                         max_array_len=0,  # not used
+                         max_map_len=10,  # EncryptedKey dict
+                         max_str_len=4000,  # inner key data
+                         object_hook=StableDict,
+                         unicode_errors='surrogateescape',
+                         ))
     else:
-        raise ValueError('kind must be "server", "client" or "manifest"')
+        raise ValueError('kind must be "server", "client", "manifest" or "key"')
     return msgpack.Unpacker(**args)