]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Check if we have really enough data before doing memcpy for FQDN capability
authorDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 13 Jun 2024 05:12:10 +0000 (08:12 +0300)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Mon, 24 Jun 2024 20:42:19 +0000 (20:42 +0000)
We advance data pointer (data++), but we do memcpy() with the length that is 1-byte
over, which is technically heap overflow.

```
==411461==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x50600011da1a at pc 0xc4f45a9786f0 bp 0xffffed1e2740 sp 0xffffed1e1f30
READ of size 4 at 0x50600011da1a thread T0
    0 0xc4f45a9786ec in __asan_memcpy (/home/ubuntu/frr-public/frr_public_private-libfuzzer/bgpd/.libs/bgpd+0x3586ec) (BuildId: e794c5f796eee20c8973d7efb9bf5735e54d44cd)
    1 0xc4f45abf15f8 in bgp_dynamic_capability_fqdn /home/ubuntu/frr-public/frr_public_private-libfuzzer/bgpd/bgp_packet.c:3457:4
    2 0xc4f45abdd408 in bgp_capability_msg_parse /home/ubuntu/frr-public/frr_public_private-libfuzzer/bgpd/bgp_packet.c:3911:4
    3 0xc4f45abdbeb4 in bgp_capability_receive /home/ubuntu/frr-public/frr_public_private-libfuzzer/bgpd/bgp_packet.c:3980:9
    4 0xc4f45abde2cc in bgp_process_packet /home/ubuntu/frr-public/frr_public_private-libfuzzer/bgpd/bgp_packet.c:4109:11
    5 0xc4f45a9b6110 in LLVMFuzzerTestOneInput /home/ubuntu/frr-public/frr_public_private-libfuzzer/bgpd/bgp_main.c:582:3
```

Found by fuzzing.

Reported-by: Iggy Frankovic <iggyfran@amazon.com>
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
(cherry picked from commit b685ab5e1bdec0848502c20e9596b9716b236639)

bgpd/bgp_packet.c

index 1f808eea725aa58e6a13ce27874c00d6391ff898..10c38d0905c898e086106e0ee70039a8c9000537 100644 (file)
@@ -3300,7 +3300,7 @@ static void bgp_dynamic_capability_fqdn(uint8_t *pnt, int action,
                }
 
                len = *data;
-               if (data + len > end) {
+               if (data + len + 1 > end) {
                        zlog_err("%pBP: Received invalid FQDN capability length (host name) %d",
                                 peer, hdr->length);
                        return;
@@ -3331,7 +3331,7 @@ static void bgp_dynamic_capability_fqdn(uint8_t *pnt, int action,
 
                /* domainname */
                len = *data;
-               if (data + len > end) {
+               if (data + len + 1 > end) {
                        zlog_err("%pBP: Received invalid FQDN capability length (domain name) %d",
                                 peer, len);
                        return;