summaryrefslogtreecommitdiffstats
path: root/src/fluent-bit/tests/internal/fuzzers/signv4_fuzzer.c
blob: 4393d1594d1d729cef230b4cae0bab19af5efafd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <fluent-bit/flb_info.h>
#include <fluent-bit/flb_mem.h>
#include <fluent-bit/flb_http_client.h>
#include <fluent-bit/flb_upstream.h>
#include <fluent-bit/flb_signv4.h>
#include <fluent-bit/flb_aws_credentials.h>
#include <monkey/mk_core.h>
#include <unistd.h>
#include <fluent-bit/flb_sds.h>
#include "flb_fuzz_header.h"

#define AWS_ACCESS_KEY_ID              "AWS_ACCESS_KEY_ID"
#define AWS_SECRET_ACCESS_KEY          "AWS_SECRET_ACCESS_KEY"
#define AWS_SESSION_TOKEN              "AWS_SESSION_TOKEN"

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
    if (size < 59) {
        return 0;
    }

    /* Set flb_malloc_mod to be fuzzer-data dependent */
    flb_malloc_p = 0;
    flb_malloc_mod = *(int*)data;
    data += 4;
    size -= 4;

    /* Avoid division by zero for modulo operations */
    if (flb_malloc_mod == 0) {
        flb_malloc_mod = 1;
    }

    char s3_mode = data[0];
    MOVE_INPUT(1)
    int method = (int)data[0];

    /* Prepare a general null-terminated string */
    char *uri             = get_null_terminated(50, &data, &size);
    char *null_terminated = get_null_terminated(size, &data, &size);

    /* Now begin the core work of the fuzzer */
    struct flb_config *config;
    struct mk_list *tests;
    struct flb_aws_provider *provider;
    config = flb_calloc(1, sizeof(struct flb_config));
    if (!config) {
        flb_free(uri);
        flb_free(null_terminated);
        return 0;
    }
    mk_list_init(&config->upstreams);
    provider = flb_aws_env_provider_create();

    /* Create the necessary http context */
    struct flb_upstream *http_u;
    struct flb_connection *http_u_conn = NULL;
    struct flb_http_client *http_c;
    struct flb_config *http_config;

    http_config = flb_config_init();
    if (http_config == NULL) {
        flb_aws_provider_destroy(provider);
        flb_free(uri);
        flb_free(null_terminated);
        flb_free(config);
        return 0;
    }

    http_u = flb_upstream_create(http_config, "127.0.0.1", 8001, 0, NULL);
    if (http_u != NULL) {
        http_u_conn = flb_calloc(1, sizeof(struct flb_connection));
        if (http_u_conn != NULL) {
            http_u_conn->upstream = http_u;

            http_c = flb_http_client(http_u_conn, method, uri,
                         null_terminated, size, "127.0.0.1", 8001, NULL, 0);
            if (http_c) {
                /* Call into the main target flb_signv4_do*/
                time_t t = 1440938160;
                char *region = "us-east-1";
                char *access_key = "AKIDEXAMPLE";
                char *service = "service";
                char *secret_key = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";
                int ret = setenv(AWS_ACCESS_KEY_ID, access_key, 1);
                if (ret >= 0) {
                    ret = setenv(AWS_SECRET_ACCESS_KEY, secret_key, 1);
                    if (ret >= 0) {
                        flb_sds_t signature = flb_signv4_do(http_c, FLB_TRUE, FLB_FALSE,
                                    t, region, service, s3_mode, NULL, provider);
                        if (signature) {
                          flb_sds_destroy(signature);
                        }
                    }
                }
                flb_http_client_destroy(http_c);
            }
        }
        flb_upstream_destroy(http_u);
    }

    /* Cleanup */
    flb_config_exit(http_config);
    flb_aws_provider_destroy(provider);
    flb_free(config);

    flb_free(null_terminated);
    flb_free(http_u_conn);
    flb_free(uri);

    return 0;
}