misc: binary api fuzz test fixes 02/26802/5
authorDave Barach <dave@barachs.net>
Wed, 29 Apr 2020 21:04:10 +0000 (17:04 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Mon, 4 May 2020 14:03:21 +0000 (14:03 +0000)
commit7784140f2bd2d5ae44f2be1507ac25f102006155
tree4ac12e04f5177bffab6f3c05d6bf837567a65988
parentd88fc0fcedb402e3dc82cb44280d4567a6a13266
misc: binary api fuzz test fixes

Add a hook to src/vlibapi/api_shared.c to fuzz (screw up) binary API
messages, e.g. by xoring random data into them before processing. We
specifically exempt client connection messages, and inband debug CLI
messages. We step over msg_id, client index, client context, and
sw_if_index. Otherwise, "make test" vectors fail too rapidly to learn
anything.

The goal is to reduce the number of crashes caused to zero. We're
fairly close with this patch.

Add vl_msg_api_max_length(void *mp), which returns the maximum
plausible length for a binary API message.

Use it to hardern vl_api_from_api_to_new_vec(...) which takes an
additional argument - message pointer - so it can verify that
astr->length is sane. If it's not sane, return a u8 *vector of the
form "insane astr->length nnnn\0".

Verify array lengths in vl_api_dhcp6_send_client_message_t_handler(...)
and vl_api_dhcp6_pd_send_client_message_t_handler(...).

Add a fairly effective binary API fuzz hook to the unittest plugin,
and modify the "make test" framework.py to pass "api-fuzz { on|off }"
to enable API fuzzing: "make API_FUZZ=on TEST=xxx test-debug" or similar

Type: improvement

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: I0157267652a163c01553d5267620f719cc6c3bde
19 files changed:
src/plugins/dhcp/dhcp_api.c
src/plugins/ioam/lib-pot/pot_api.c
src/plugins/unittest/CMakeLists.txt
src/plugins/unittest/api_fuzz_test.c [new file with mode: 0644]
src/vat/api_format.c
src/vlibapi/api.h
src/vlibapi/api_shared.c
src/vlibapi/api_types.h
src/vnet/devices/tap/tapv2_api.c
src/vnet/interface_api.c
src/vnet/ip/ip_api.c
src/vnet/ip/punt_api.c
src/vnet/lldp/lldp_api.c
src/vnet/pg/pg_api.c
src/vnet/session/session_api.c
src/vpp/api/api.c
src/vpp/api/custom_dump.c
test/ext/vapi_c_test.c
test/framework.py