Here is another test harness for fuzzing Openflow packet parsing on
trunk. Feedback welcome!

===== target-ofp.c =====

#include "flow.h"
#include "dp-packet.h"
#include "pcap-file.h"
#include "odp-util.h"

static bool
is_openflow_port(ovs_be16 port_)
{
    uint16_t port = ntohs(port_);
    return port == OFP_PORT || port == OFP_OLD_PORT;
}

int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
    struct dp_packet packet;
    struct flow flow;
    struct tcp_reader *reader;
    dp_packet_use_const(&packet, data, size);

    pkt_metadata_init(&packet.md, ODPP_NONE);
    flow_extract(&packet, &flow);
    if (flow.dl_type == htons(ETH_TYPE_IP)
        && flow.nw_proto == IPPROTO_TCP
        && (is_openflow_port(flow.tp_src) ||
            is_openflow_port(flow.tp_dst))) {
            struct dp_packet *payload = tcp_reader_run(reader, &flow,
&packet);
            if (payload) {
                while (dp_packet_size(payload) >= sizeof(struct
ofp_header)) {
                    const struct ofp_header *oh;
                    void *pdata = dp_packet_data(payload);
                    int length;

                    /* Align OpenFlow on 8-byte boundary for safe access. */
                    dp_packet_shift(payload, -((intptr_t) pdata & 7));

                    oh = dp_packet_data(payload);
                    length = ntohs(oh->length);
                    if (dp_packet_size(payload) < length) {
                        break;
                    }

                   ofp_print(stdout, dp_packet_data(payload), length, 4);
                   dp_packet_pull(payload, length);
                }
            }
            tcp_reader_close(reader);
        }
    return 0;
}

===== target-ofp.c =====

P.S. Fuzzing for ~10h didn't result in anything. Test coverage saturates
early but that's possibly because this isn't doing any deep processing.

Regards,
Bhargava

On 08/31/2017 11:18 PM, Kostya Serebryany wrote:
> For the version Bhargava is testing I guess this reads as
> int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
> {
>   struct ofpbuf packet;       
>   ofpbuf_use_const(&packet, data, size);                                
>                                        
>   struct flow flow;                                                    
>                                         
>   flow_extract(&packet, NULL, &flow);                                  
>                                         
>   return 0;
> }
> 
> Looks great, and runs fast. 
> 
> 
> On Thu, Aug 31, 2017 at 2:05 PM, Bhargava Shastry
> <[email protected]
> <mailto:[email protected]>> wrote:
> 
>     Hi,
> 
>     > I didn't look at the actual code before, but now that I have, I don't
>     > understand at all why it was doing file I/O just to write a packet to
>     > disk and then read it back.
> 
>     Sorry, this was due to my ignorance. I was not aware of something like
>     dp_packet_use_const(). This should speed things up. I am working on it.
> 
>     >
>     > Here is a more natural way to do this:
>     >
>     > int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
>     > {
>     >     struct dp_packet packet;
>     >     dp_packet_use_const(&packet, data, size);
>     >
>     >     struct flow flow;
>     >     flow_extract(&packet, &flow);
>     >
>     >     return 0;
>     > }
>     >
> 
>     --
>     Bhargava Shastry <[email protected]
>     <mailto:[email protected]>>
>     Security in Telecommunications
>     TU Berlin / Telekom Innovation Laboratories
>     Ernst-Reuter-Platz 7, Sekr TEL 17 / D - 10587 Berlin, Germany
>     phone: +49 30 8353 58235 <tel:%2B49%2030%208353%2058235>
>     Keybase: https://keybase.io/bshastry
> 
> 

-- 
Bhargava Shastry <[email protected]>
Security in Telecommunications
TU Berlin / Telekom Innovation Laboratories
Ernst-Reuter-Platz 7, Sekr TEL 17 / D - 10587 Berlin, Germany
phone: +49 30 8353 58235
Keybase: https://keybase.io/bshastry
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to