Download raw body.
isakmpd(8): Validate proposal and transform sizes
Hi,
anyone?
On Wed, Apr 22, 2026 at 03:01:20PM +0200, hshoexer wrote:
> 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