Download raw body.
isakmpd(8): Validate proposal and transform sizes
Check
- that a proposal payload fits within the outer SA payload,
- that the provided SPI and the following transform header fit
within the proposal, and
- transforms fit within the outer proposal payload.
It's already ensured that we never read outside the message. However,
within the message the mentioned payloads might be misinterpreted
due to malformed size values.
ok?
Take care,
HJ.
------------------------------------------------------------------------------
diff --git a/sbin/isakmpd/message.c b/sbin/isakmpd/message.c
index ee0df3a4282..c49a14d67b7 100644
--- a/sbin/isakmpd/message.c
+++ b/sbin/isakmpd/message.c
@@ -335,7 +335,7 @@ next_payload:
* Parse a proposal payload found in message MSG. PAYLOAD is always
* ISAKMP_PAYLOAD_PROPOSAL and ignored in here. It's needed as the API for
* message_parse_payloads requires it. BUF points to the proposal's
- * generic payload header.
+ * generic payload header. P is the outer SA payload.
*/
static int
message_parse_proposal(struct message *msg, struct payload *p,
@@ -343,6 +343,19 @@ message_parse_proposal(struct message *msg, struct payload *p,
{
set payload_set;
+ /* Proposal must lie within outer SA payload. */
+ if (buf + GET_ISAKMP_GEN_LENGTH(buf) >
+ p->p + GET_ISAKMP_GEN_LENGTH(p->p)) {
+ message_drop(msg, ISAKMP_NOTIFY_PAYLOAD_MALFORMED, 0, 1, 1);
+ return -1;
+ }
+
+ if ((ISAKMP_PROP_SPI_OFF + GET_ISAKMP_PROP_SPI_SZ(buf) +
+ ISAKMP_GEN_SZ) > GET_ISAKMP_GEN_LENGTH(buf)) {
+ message_drop(msg, ISAKMP_NOTIFY_PAYLOAD_MALFORMED, 0, 1, 1);
+ return -1;
+ }
+
/* Put the proposal into the proposal bucket. */
if (message_index_payload(msg, p, payload, buf) == -1)
return -1;
@@ -363,6 +376,13 @@ static int
message_parse_transform(struct message *msg, struct payload *p,
u_int8_t payload, u_int8_t *buf)
{
+ /* Transform must lie within outer proposal payload. */
+ if (buf + GET_ISAKMP_GEN_LENGTH(buf) >
+ p->p + GET_ISAKMP_GEN_LENGTH(p->p)) {
+ message_drop(msg, ISAKMP_NOTIFY_PAYLOAD_MALFORMED, 0, 1, 1);
+ return -1;
+ }
+
/* Put the transform into the transform bucket. */
if (message_index_payload(msg, p, payload, buf) == -1)
return -1;
isakmpd(8): Validate proposal and transform sizes