mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-06 12:09:22 +00:00
ospfd: Solved crash in RI parsing with OSPF TE
Iggy Frankovic discovered another ospfd crash when performing fuzzing of OSPF LSA packets. The crash occurs in ospf_te_parse_ri() function when attemping to read Segment Routing subTLVs. The original code doesn't check if the size of the SR subTLVs have the correct length. In presence of erronous LSA, this will cause a buffer overflow and ospfd crash. This patch introduces new verification of the subTLVs size for Router Information TLV. Co-authored-by: Iggy Frankovic <iggyfran@amazon.com> Signed-off-by: Olivier Dugeon <olivier.dugeon@orange.com>
This commit is contained in:
parent
e08495a4a8
commit
f69d1313b1
@ -2456,6 +2456,9 @@ static int ospf_te_parse_ri(struct ls_ted *ted, struct ospf_lsa *lsa)
|
||||
|
||||
switch (ntohs(tlvh->type)) {
|
||||
case RI_SR_TLV_SR_ALGORITHM:
|
||||
if (TLV_BODY_SIZE(tlvh) < 1 ||
|
||||
TLV_BODY_SIZE(tlvh) > ALGORITHM_COUNT)
|
||||
break;
|
||||
algo = (struct ri_sr_tlv_sr_algorithm *)tlvh;
|
||||
|
||||
for (int i = 0; i < ntohs(algo->header.length); i++) {
|
||||
@ -2480,6 +2483,8 @@ static int ospf_te_parse_ri(struct ls_ted *ted, struct ospf_lsa *lsa)
|
||||
break;
|
||||
|
||||
case RI_SR_TLV_SRGB_LABEL_RANGE:
|
||||
if (TLV_BODY_SIZE(tlvh) != RI_SR_TLV_LABEL_RANGE_SIZE)
|
||||
break;
|
||||
range = (struct ri_sr_tlv_sid_label_range *)tlvh;
|
||||
size = GET_RANGE_SIZE(ntohl(range->size));
|
||||
lower = GET_LABEL(ntohl(range->lower.value));
|
||||
@ -2497,6 +2502,8 @@ static int ospf_te_parse_ri(struct ls_ted *ted, struct ospf_lsa *lsa)
|
||||
break;
|
||||
|
||||
case RI_SR_TLV_SRLB_LABEL_RANGE:
|
||||
if (TLV_BODY_SIZE(tlvh) != RI_SR_TLV_LABEL_RANGE_SIZE)
|
||||
break;
|
||||
range = (struct ri_sr_tlv_sid_label_range *)tlvh;
|
||||
size = GET_RANGE_SIZE(ntohl(range->size));
|
||||
lower = GET_LABEL(ntohl(range->lower.value));
|
||||
@ -2514,6 +2521,8 @@ static int ospf_te_parse_ri(struct ls_ted *ted, struct ospf_lsa *lsa)
|
||||
break;
|
||||
|
||||
case RI_SR_TLV_NODE_MSD:
|
||||
if (TLV_BODY_SIZE(tlvh) < RI_SR_TLV_NODE_MSD_SIZE)
|
||||
break;
|
||||
msd = (struct ri_sr_tlv_node_msd *)tlvh;
|
||||
if ((CHECK_FLAG(node->flags, LS_NODE_MSD))
|
||||
&& (node->msd == msd->value))
|
||||
|
Loading…
Reference in New Issue
Block a user