diff options
author | Tobias Brunner <tobias@strongswan.org> | 2014-09-16 15:51:21 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2014-10-10 09:32:42 +0200 |
commit | 8dbe128c8c896763e13e1719bfc705aae783e4b1 (patch) | |
tree | a5a852e549287882a59ae48a3267b300b66de3a8 /src/libcharon/encoding | |
parent | f00a9c171592c05cc6e77030b791e80525dd839b (diff) | |
download | strongswan-8dbe128c8c896763e13e1719bfc705aae783e4b1.tar.bz2 strongswan-8dbe128c8c896763e13e1719bfc705aae783e4b1.tar.xz |
message: Limit maximum number of IKEv2 fragments
The maximum for IKEv1 is already 255 due to the 8-bit fragment number.
With an overhead of 17 bytes (x64) per fragment and a default maximum
of 10000 bytes per packet the maximum memory required is 14 kB
for a fragmented message.
Diffstat (limited to 'src/libcharon/encoding')
-rw-r--r-- | src/libcharon/encoding/message.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/libcharon/encoding/message.c b/src/libcharon/encoding/message.c index 5e5647dd6..cb6c97f25 100644 --- a/src/libcharon/encoding/message.c +++ b/src/libcharon/encoding/message.c @@ -931,6 +931,11 @@ struct private_message_t { }; /** + * Maximum number of fragments we will handle + */ +#define MAX_FRAGMENTS 255 + +/** * A single fragment within a fragmented message */ typedef struct { @@ -2779,7 +2784,12 @@ METHOD(message_t, add_fragment_v2, status_t, } encrypted_fragment = (encrypted_fragment_payload_t*)payload; total = encrypted_fragment->get_total_fragments(encrypted_fragment); - + if (total > MAX_FRAGMENTS) + { + DBG1(DBG_IKE, "maximum fragment count exceeded"); + reset_defrag(this); + return FAILED; + } if (!this->fragments || total > this->frag->last) { reset_defrag(this); |