]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd: protect vs. VU#229804 (malformed Router-LSA)
authorDavid Lamparter <equinox@diac24.net>
Fri, 2 Aug 2013 07:27:53 +0000 (07:27 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Tue, 6 Aug 2013 10:41:46 +0000 (12:41 +0200)
VU#229804 reports that, by injecting Router LSAs with the Advertising
Router ID different from the Link State ID, OSPF implementations can be
tricked into retaining and using invalid information.

Quagga is not vulnerable to this because it looks up Router LSAs by
(Router-ID, LS-ID) pair.  The relevant code is in ospf_lsa.c l.3140.
Note the double "id" parameter at the end.

Still, we can provide an improvement here by discarding such malformed
LSAs and providing a warning to the administrator.  While we cannot
prevent such malformed LSAs from entering the OSPF domain, we can
certainly try to limit their distribution.

cf. http://www.kb.cert.org/vuls/id/229804 for the vulnerability report.
This issue is a specification issue in the OSPF protocol that was
discovered by Dr. Gabi Nakibly.

Reported-by: CERT Coordination Center <cert@cert.org>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
ospfd/ospf_packet.c

index 37223fbb7b8582cac824a6d8a0d4c52520d5528b..ab68bf0b7c3825598348a5221d1c400409523663 100644 (file)
@@ -1823,6 +1823,27 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh,
            DISCARD_LSA (lsa,2);
          }
 
+      /* VU229804: Router-LSA Adv-ID must be equal to LS-ID */
+      if (lsa->data->type == OSPF_ROUTER_LSA)
+       if (!IPV4_ADDR_SAME(&lsa->data->id, &lsa->data->adv_router))
+         {
+           char buf1[INET_ADDRSTRLEN];
+           char buf2[INET_ADDRSTRLEN];
+           char buf3[INET_ADDRSTRLEN];
+
+           zlog_err("Incoming Router-LSA from %s with "
+                     "Adv-ID[%s] != LS-ID[%s]",
+                     inet_ntop (AF_INET, &ospfh->router_id,
+                                buf1, INET_ADDRSTRLEN),
+                     inet_ntop (AF_INET, &lsa->data->id,
+                                buf2, INET_ADDRSTRLEN),
+                     inet_ntop (AF_INET, &lsa->data->adv_router,
+                                buf3, INET_ADDRSTRLEN));
+           zlog_err("OSPF domain compromised by attack or corruption. "
+                    "Verify correct operation of -ALL- OSPF routers.");
+           DISCARD_LSA (lsa, 0);
+         }
+
       /* Find the LSA in the current database. */
 
       current = ospf_lsa_lookup_by_header (oi->area, lsa->data);