13#include "base/networking.h"
19#include <gnutls/gnutls.h>
20#include <gvm/base/prefs.h>
21#include <gvm/util/mqtt.h>
22#include <gvm/util/uuidutils.h>
23#include <json-glib/json-glib.h>
30#define G_LOG_DOMAIN "lib misc"
67 gchar **package_list = NULL;
69 json_builder_set_member_name (builder,
"package_list");
70 json_builder_begin_array (builder);
72 package_list = g_strsplit (packages,
"\n", 0);
73 if (package_list && package_list[0])
76 for (i = 0; package_list[i]; i++)
77 json_builder_add_string_value (builder, package_list[i]);
80 json_builder_end_array (builder);
81 g_strfreev (package_list);
104 const char *os_release,
105 const char *package_list)
107 JsonBuilder *builder;
113 builder = json_builder_new ();
115 json_builder_begin_object (builder);
117 json_builder_set_member_name (builder,
"message_id");
118 builder = json_builder_add_string_value (builder, gvm_uuid_make ());
120 json_builder_set_member_name (builder,
"group_id");
121 builder = json_builder_add_string_value (builder, gvm_uuid_make ());
123 json_builder_set_member_name (builder,
"message_type");
124 builder = json_builder_add_string_value (builder,
"scan.start");
126 json_builder_set_member_name (builder,
"created");
127 builder = json_builder_add_int_value (builder, time (NULL));
129 json_builder_set_member_name (builder,
"scan_id");
130 builder = json_builder_add_string_value (builder,
scan_id);
132 json_builder_set_member_name (builder,
"host_ip");
133 json_builder_add_string_value (builder, ip_str);
135 json_builder_set_member_name (builder,
"host_name");
136 json_builder_add_string_value (builder,
hostname);
138 json_builder_set_member_name (builder,
"os_release");
139 json_builder_add_string_value (builder, os_release);
143 json_builder_end_object (builder);
145 gen = json_generator_new ();
146 root = json_builder_get_root (builder);
147 json_generator_set_root (gen, root);
148 json_str = json_generator_to_data (gen, NULL);
150 json_node_free (root);
151 g_object_unref (gen);
152 g_object_unref (builder);
154 if (json_str == NULL)
155 g_warning (
"%s: Error while creating JSON.", __func__);
176 const char *host_ip,
const char *json,
180 JsonReader *reader = NULL;
185 parser = json_parser_new ();
186 if (!json_parser_load_from_data (parser, json,
len, &err))
191 reader = json_reader_new (json_parser_get_root (parser));
194 if (!json_reader_read_member (reader,
"scan_id"))
198 if (g_strcmp0 (json_reader_get_string_value (reader),
scan_id))
202 json_reader_end_member (reader);
205 if (!json_reader_read_member (reader,
"host_ip"))
209 if (g_strcmp0 (json_reader_get_string_value (reader), host_ip))
213 json_reader_end_member (reader);
216 if (!json_reader_read_member (reader,
"status"))
220 ret = g_strdup (json_reader_get_string_value (reader));
222 json_reader_end_member (reader);
226 g_object_unref (reader);
227 g_object_unref (parser);
230 g_warning (
"%s: Unable to parse json. Reason: %s", __func__,
264 notusdata = g_malloc0 (
sizeof (
struct notus_info));
280 g_free (notusdata->
server);
281 g_free (notusdata->
schema);
282 g_free (notusdata->
host);
283 g_free (notusdata->
alpn);
297 for (
char *p = s; *p; p++)
314 JsonBuilder *builder;
317 gchar *json_str = NULL;
318 gchar **package_list = NULL;
319 builder = json_builder_new ();
321 json_builder_begin_array (builder);
323 package_list = g_strsplit (packages,
"\n", 0);
324 if (package_list && package_list[0])
327 for (i = 0; package_list[i]; i++)
328 json_builder_add_string_value (builder, package_list[i]);
331 json_builder_end_array (builder);
332 g_strfreev (package_list);
334 gen = json_generator_new ();
335 root = json_builder_get_root (builder);
336 json_generator_set_root (gen, root);
337 json_str = json_generator_to_data (gen, NULL);
339 json_node_free (root);
340 g_object_unref (gen);
341 g_object_unref (builder);
343 if (json_str == NULL)
344 g_warning (
"%s: Error while creating JSON.", __func__);
361 CURLU *h = curl_url ();
369 if (curl_url_set (h, CURLUPART_URL, (*notusdata)->server, 0) > 0)
371 g_warning (
"%s: Error parsing URL %s", __func__, (*notusdata)->server);
375 curl_url_get (h, CURLUPART_SCHEME, &
schema, 0);
376 curl_url_get (h, CURLUPART_HOST, &
host, 0);
377 curl_url_get (h, CURLUPART_PORT, &
port, 0);
381 g_warning (
"%s: Invalid URL %s. It must be in format: "
382 "schema://host:port. E.g. http://localhost:8080",
383 __func__, (*notusdata)->server);
384 curl_url_cleanup (h);
391 (*notusdata)->host = g_strdup (
host);
393 (*notusdata)->port = atoi (
port);
394 else if (g_strcmp0 (
schema,
"https"))
395 (*notusdata)->port = 443;
397 (*notusdata)->port = 80;
400 if (g_strrstr ((*notusdata)->schema,
"https"))
402 (*notusdata)->tls = 1;
403 (*notusdata)->http_version = g_strdup (
"2");
404 (*notusdata)->alpn = g_strdup (
"h2");
406 else if (g_strrstr ((*notusdata)->schema,
"http"))
408 (*notusdata)->tls = 0;
409 (*notusdata)->http_version = g_strdup (
"1.1");
410 (*notusdata)->alpn = g_strdup (
"http/1.1");
414 g_warning (
"%s: Invalid openvasd server schema", (*notusdata)->server);
415 curl_url_cleanup (h);
422 curl_url_cleanup (h);
444 return advisories_list;
461 return advisories_list;
486 advisories_list->
count++;
500 adv->
oid = g_strdup (
oid);
510 adv->
oid = g_strdup (
oid);
511 adv->
message = g_strdup (message);
526 if (adv->
count == 100)
529 "%s: Failed adding new vulnerable package to the notus_advisory %s. "
530 "No more free slots",
619 enum fixed_type type,
char *item1,
char *item2)
626 vuln->
pkg_name = g_strdup (pkg_name);
631 range = g_malloc0 (
sizeof (range_t));
632 range->
start = g_strdup (item1);
633 range->
stop = g_strdup (item2);
639 fixed_ver->
version = g_strdup (item1);
652 char **members = json_reader_list_members (reader);
654 if (!members || !members[0])
659 for (
int i = 0; members[i]; i++)
663 if (!json_reader_read_member (reader, members[i]))
665 g_debug (
"No member oid");
668 if (!json_reader_is_array (reader))
670 g_debug (
"Is not an array");
676 int count_pkgs = json_reader_count_elements (reader);
677 g_debug (
"There are %d packages for notus_advisory %s", count_pkgs,
679 for (
int j = 0; j < count_pkgs; j++)
683 char *installed_version = NULL;
686 char *version = NULL;
687 char *specifier = NULL;
690 json_reader_read_element (reader, j);
691 if (!json_reader_is_object (reader))
693 g_warning (
"%s: Package %d of notus_advisory %s is not an object",
694 __func__, j, members[i]);
699 json_reader_read_member (reader,
"name");
700 name = g_strdup (json_reader_get_string_value (reader));
701 json_reader_end_member (reader);
702 g_debug (
"name: %s",
name);
704 json_reader_read_member (reader,
"installed_version");
705 installed_version = g_strdup (json_reader_get_string_value (reader));
706 json_reader_end_member (reader);
707 g_debug (
"installed_version: %s", installed_version);
709 json_reader_read_member (reader,
"fixed_version");
710 g_debug (
"Fixed_version has %d members",
711 json_reader_count_members (reader));
714 json_reader_read_member (reader,
"start");
715 start = g_strdup (json_reader_get_string_value (reader));
716 json_reader_end_member (reader);
717 json_reader_read_member (reader,
"end");
718 stop = g_strdup (json_reader_get_string_value (reader));
719 json_reader_end_member (reader);
720 g_debug (
"start %s, end: %s", start, stop);
723 json_reader_read_member (reader,
"version");
724 version = g_strdup (json_reader_get_string_value (reader));
725 json_reader_end_member (reader);
726 json_reader_read_member (reader,
"specifier");
727 specifier = g_strdup (json_reader_get_string_value (reader));
728 json_reader_end_member (reader);
729 g_debug (
"version %s, specifier: %s", version, specifier);
732 json_reader_end_member (reader);
735 json_reader_end_element (reader);
737 char *item1 = NULL, *item2 = NULL;
744 else if (version && specifier)
752 g_warning (
"%s: Error parsing json element", __func__);
754 g_free (installed_version);
765 g_free (installed_version);
772 json_reader_end_member (reader);
783 for (
int i = 0; json_reader_read_element (reader, i); i++)
787 char *message = NULL;
789 json_reader_read_member (reader,
"oid");
790 oid = (
char *) json_reader_get_string_value (reader);
791 json_reader_end_member (reader);
793 json_reader_read_member (reader,
"message");
794 message = (
char *) json_reader_get_string_value (reader);
795 json_reader_end_member (reader);
802 json_reader_end_element (reader);
823 JsonParser *parser = NULL;
824 JsonReader *reader = NULL;
829 parser = json_parser_new ();
830 if (!json_parser_load_from_data (parser, resp,
len, &err))
832 g_message (
"Error parsing");
835 reader = json_reader_new (json_parser_get_root (parser));
837 if (json_reader_is_object (reader))
841 else if (json_reader_is_array (reader))
847 g_debug (
"Unknown JSON response format");
851 g_object_unref (reader);
852 g_object_unref (parser);
873 s->
ptr = g_malloc0 (s->
len + 1);
876 g_warning (
"%s: Error allocating memory for response", __func__);
890 struct string *s = struct_string;
891 size_t new_len = s->
len + size * nmemb;
892 char *ptr_aux = g_realloc (s->
ptr, new_len + 1);
896 g_warning (
"%s: Error allocating memory for response", __func__);
899 memcpy (s->
ptr + s->
len,
ptr, size * nmemb);
900 s->
ptr[new_len] =
'\0';
924 struct curl_slist *customheader = NULL;
926 GString *xapikey = NULL;
928 if ((curl = curl_easy_init ()) == NULL)
930 g_warning (
"Not possible to initialize curl library");
934 url = g_string_new (notusdata->
server);
935 g_string_append (url,
"/notus/");
939 for (
size_t i = 0; i < strlen (os_aux); i++)
941 if (os_aux[i] ==
' ')
945 g_string_append (url, os_aux);
948 g_debug (
"%s: URL: %s", __func__, url->str);
950 if (curl_easy_setopt (curl, CURLOPT_URL, g_strdup (url->str)) != CURLE_OK)
952 g_warning (
"Not possible to set the URL");
953 curl_easy_cleanup (curl);
956 g_string_free (url, TRUE);
959 curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L);
960 curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L);
963 if (prefs_get (
"x-apikey"))
965 xapikey = g_string_new (
"X-APIKEY: ");
966 g_string_append (xapikey, prefs_get (
"x-apikey"));
967 customheader = curl_slist_append (customheader, g_strdup (xapikey->str));
968 g_string_free (xapikey, TRUE);
972 curl_slist_append (customheader,
"Content-Type: application/json");
973 curl_easy_setopt (curl, CURLOPT_HTTPHEADER, customheader);
975 curl_easy_setopt (curl, CURLOPT_POSTFIELDS, pkg_list);
976 curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen (pkg_list));
981 curl_easy_setopt (curl, CURLOPT_WRITEDATA, &resp);
984 if ((ret = curl_easy_perform (curl)) != CURLE_OK)
986 g_warning (
"%s: Error sending request: %d", __func__, ret);
987 curl_easy_cleanup (curl);
992 curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
994 curl_easy_cleanup (curl);
995 g_debug (
"Server response %s", resp.
ptr);
996 *response = g_strdup (resp.
ptr);
1014 const char *server = NULL;
1016 char *response = NULL;
1022 server = prefs_get (
"openvasd_server");
1039 ret =
send_request (notusdata, os, json_pkglist, &response);
1041 g_warning (
"%ld: Error sending request to openvasd: %s", ret, response);
1044 g_free (json_pkglist);
1074 g_message (
"%s: Unable to process response", __func__);
1083 GString *result = g_string_new (NULL);
1087 g_message (
"%s: Unable to process response. No notus advisories",
1089 g_string_free (result, TRUE);
1096 GString *res = g_string_new (NULL);
1100 g_string_printf (res,
1102 "Vulnerable package: %s\n"
1103 "Installed version: %s-%s\n"
1104 "Fixed version: < %s-%s\n"
1105 "Fixed version: >=%s-%s\n",
1113 g_string_printf (res,
1115 "Vulnerable package: %s\n"
1116 "Installed version: %s-%s\n"
1117 "Fixed version: %2s%s-%s\n",
1124 g_warning (
"%s: Unknown fixed version type for notus_advisory %s",
1126 g_string_free (result, TRUE);
1130 g_string_append (result, res->str);
1131 g_string_free (res, TRUE);
1135 buffer = g_strdup_printf (
"%s|||%s|||%s|||%s|||%s|||%s|||%s",
"ALARM",
1138 g_string_free (result, TRUE);
1168 const char *
hostname,
const char *package_list,
1169 const char *os_release)
1172 if (!os_release || !package_list)
1175 if (prefs_get (
"openvasd_server"))
1177 g_message (
"Running Notus for %s via openvasd", ip_str);
1187 gchar *status = NULL;
1192 err = mqtt_subscribe (
"scanner/status");
1195 g_warning (
"%s: Error starting lsc. Unable to subscribe", __func__);
1201 os_release, package_list);
1204 if (json_str == NULL)
1207 g_message (
"Running Notus for %s", ip_str);
1208 err = mqtt_publish (
"scanner/package/cmd/notus", json_str);
1211 g_warning (
"%s: Error publishing message for Notus.", __func__);
1221 err = mqtt_retrieve_message (&topic, &topic_len, &
payload,
1222 &payload_len, 60000);
1223 if (err == -1 || err == 1)
1225 g_warning (
"%s: Unable to retrieve status message from notus. %s",
1226 __func__, err == 1 ?
"Timeout after 60 s." :
"");
1239 if (!g_strcmp0 (status,
"running"))
1241 g_debug (
"%s: table driven LSC with scan id %s successfully started "
1248 err = mqtt_retrieve_message (&topic, &topic_len, &
payload,
1249 &payload_len, 60000);
1253 "%s: Unable to retrieve status message from notus.",
1260 "%s: Unable to retrieve message. Timeout after 60s.",
1273 g_warning (
"%s: Unable to start lsc. Got status: %s", __func__,
1279 if (g_strcmp0 (status,
"finished"))
1282 "%s: table driven lsc with scan id %s did not finish successfully "
1283 "for host %s. Last status was %s",
1284 __func__,
scan_id, ip_str, status);
1288 g_debug (
"%s: table driven lsc with scan id %s successfully finished "
kb_t get_main_kb(void)
gets the main_kb. @description returns the previously set main_kb; when asserts are enabled it will a...
Definition kb_cache.c:41
Header file to cache main_kb.
const char * oid
Definition nasl_builtin_find_service.c:51
u_char * payload
Definition nasl_frame_forgery.c:1
const char * name
Definition nasl_init.c:440
uint8_t len
Definition nasl_packet_forgery.c:1
const char * hostname
Definition pluginlaunch.c:68
int kb_item_push_str_with_main_kb_check(kb_t kb, const char *name, const char *value)
Check if the current kb corresponds to the original scanid, if it matches it kb_item_push_str....
Definition plugutils.c:533
Header file for module plugutils.
const char * scan_id
Definition scan_id.c:10
Definition table_driven_lsc.h:90
size_t max_size
Definition table_driven_lsc.h:98
advisory_type_t type
Definition table_driven_lsc.h:96
advisory_t ** advisories
Definition table_driven_lsc.h:93
size_t count
Definition table_driven_lsc.h:97
skiron_advisory_t ** skiron_advisories
Definition table_driven_lsc.h:94
char * specifier
Definition table_driven_lsc.h:39
char * version
Definition table_driven_lsc.h:38
Host information, implemented as doubly linked list.
Definition hosts.c:37
Definition table_driven_lsc.h:71
vuln_pkg_t * pkgs[100]
Definition table_driven_lsc.h:73
char * oid
Definition table_driven_lsc.h:72
size_t count
Definition table_driven_lsc.h:75
Struct to hold necessary information to call and run notus.
Definition table_driven_lsc.c:242
int tls
Definition table_driven_lsc.c:249
int port
Definition table_driven_lsc.c:248
char * host
Definition table_driven_lsc.c:245
char * alpn
Definition table_driven_lsc.c:246
char * schema
Definition table_driven_lsc.c:244
char * server
Definition table_driven_lsc.c:243
char * http_version
Definition table_driven_lsc.c:247
Definition table_driven_lsc.h:80
char * oid
Definition table_driven_lsc.h:81
char * message
Definition table_driven_lsc.h:82
Define a string struct for storing the response.
Definition table_driven_lsc.c:860
size_t len
Definition table_driven_lsc.c:862
char * ptr
Definition table_driven_lsc.c:861
char * stop
Definition table_driven_lsc.h:48
char * start
Definition table_driven_lsc.h:47
fixed_version_t * version
Definition table_driven_lsc.h:62
enum fixed_type type
Definition table_driven_lsc.h:58
version_range_t * range
Definition table_driven_lsc.h:61
char * pkg_name
Definition table_driven_lsc.h:56
char * install_version
Definition table_driven_lsc.h:57
static gchar * make_table_driven_lsc_info_json_str(const char *scan_id, const char *ip_str, const char *hostname, const char *os_release, const char *package_list)
Build a json object with data necessary to start a table drive LSC.
Definition table_driven_lsc.c:102
static void advisory_free(advisory_t *notus_advisory)
Free()'s an notus_advisory.
Definition table_driven_lsc.c:545
static JsonBuilder * add_packages_str_to_list(JsonBuilder *builder, const gchar *packages)
Split the package list string and creates a json array.
Definition table_driven_lsc.c:65
static advisory_t * advisory_new(char *oid)
Initialize a new notus_advisory.
Definition table_driven_lsc.c:496
static notus_info_t init_notus_info(const char *server)
Initialize a notus info struct and stores the server URL.
Definition table_driven_lsc.c:261
static void free_notus_info(notus_info_t notusdata)
Free notus info structure.
Definition table_driven_lsc.c:276
int run_table_driven_lsc(const char *scan_id, const char *ip_str, const char *hostname, const char *package_list, const char *os_release)
Publish the necessary data to start a Table driven LSC scan.
Definition table_driven_lsc.c:1167
static long send_request(notus_info_t notusdata, const char *os, const char *pkg_list, char **response)
Send a request to the server.
Definition table_driven_lsc.c:917
char * lsc_get_response(const char *pkg_list, const char *os)
Sent the installed package list and OS to notus.
Definition table_driven_lsc.c:1012
static int parse_server(notus_info_t *notusdata)
Parse the server URL.
Definition table_driven_lsc.c:359
static advisories_t * advisories_new_notus()
Initialize a new advisories struct with 100 slots.
Definition table_driven_lsc.c:436
static void advisories_add(advisories_t *advisories_list, advisory_t *notus_advisory)
Initialize a new advisories struct with 100 slots.
Definition table_driven_lsc.c:472
static advisories_t * advisories_new_skiron()
Initialize a new advisories struct with 100 slots.
Definition table_driven_lsc.c:453
static gchar * make_package_list_as_json_str(const char *packages)
Build a json array from the package list to start a table drive LSC.
Definition table_driven_lsc.c:312
int lsc_has_run(void)
Get lsc_flag value.
Definition table_driven_lsc.c:48
static gchar * get_status_of_table_driven_lsc_from_json(const char *scan_id, const char *host_ip, const char *json, int len)
Get the status of table driven lsc from json object.
Definition table_driven_lsc.c:175
static size_t response_callback_fn(void *ptr, size_t size, size_t nmemb, void *struct_string)
Call back function to stored the response.
Definition table_driven_lsc.c:888
static vuln_pkg_t * vulnerable_pkg_new(const char *pkg_name, const char *install_version, enum fixed_type type, char *item1, char *item2)
Creates a new Vulnerable packages which belongs to an notus_advisory.
Definition table_driven_lsc.c:618
static int call_rs_notus(const char *ip_str, const char *hostname, const char *pkg_list, const char *os)
Call notus and stores the results.
Definition table_driven_lsc.c:1060
static advisories_t * lsc_process_response_skiron(JsonReader *reader)
Definition table_driven_lsc.c:779
static char * help_tolower(char *s)
helper function to lower case
Definition table_driven_lsc.c:295
struct notus_info * notus_info_t
Definition table_driven_lsc.c:252
static void skiron_advisory_free(skiron_advisory_t *skiron_advisory)
Definition table_driven_lsc.c:573
void set_lsc_flag(void)
Set lsc_flag to 1.
Definition table_driven_lsc.c:40
static skiron_advisory_t * skiron_advisory_new(char *oid, char *message)
Definition table_driven_lsc.c:506
void advisories_free(advisories_t *advisories)
Free()'s an advisories.
Definition table_driven_lsc.c:589
static int lsc_flag
LSC ran or didn't 0 didn't run. 1 ran.
Definition table_driven_lsc.c:35
static void init_string(struct string *s)
Initialize the string struct to hold the response.
Definition table_driven_lsc.c:870
static void advisory_add_vuln_pkg(advisory_t *adv, vuln_pkg_t *vuln)
Add a new vulnerability to the notus_advisory.
Definition table_driven_lsc.c:524
advisories_t * lsc_process_response(const gchar *resp, const size_t len)
Process a json object which contains advisories and vulnerable packages.
Definition table_driven_lsc.c:821
static advisories_t * lsc_process_response_notus(JsonReader *reader)
Definition table_driven_lsc.c:648
struct advisories advisories_t
Definition table_driven_lsc.h:100
fixed_type
Fixed version format.
Definition table_driven_lsc.h:20
@ SINGLE
Definition table_driven_lsc.h:23
@ RANGE
Definition table_driven_lsc.h:22
@ UNKNOWN
Definition table_driven_lsc.h:21
struct notus_advisory advisory_t
Definition table_driven_lsc.h:77
struct fixed_version fixed_version_t
Definition table_driven_lsc.h:41
struct skiron_advisory skiron_advisory_t
Definition table_driven_lsc.h:85
struct vulnerable_pkg vuln_pkg_t
Definition table_driven_lsc.h:66
struct version_range version_range_t
Definition table_driven_lsc.h:50
@ NOTUS
Definition table_driven_lsc.h:28
@ SKIRON
Definition table_driven_lsc.h:29