58 #include <openvas/base/openvas_string.h> 59 #include <openvas/misc/nvt_categories.h> 65 #define G_LOG_DOMAIN "md otp" 82 category_number (
const char *category)
84 static const char *categories[] = { ACT_STRING_LIST_ALL };
86 for (index = ACT_FIRST; index <= ACT_END; index++)
87 if (strcmp (category, categories[index]) == 0)
97 blank_control_chars (
char *
string)
99 for (; *string;
string++)
100 if (iscntrl (*
string) && *
string !=
'\n') *
string =
' ';
109 static message_t* current_message = NULL;
114 static gchar* current_host = NULL;
116 static char *plugins_feed_version = NULL;
126 make_message (
const char* host)
132 message->
host = g_strdup (host);
150 if (message->
host) free (message->
host);
152 if (message->
oid) free (message->
oid);
165 set_message_port_number (
message_t* message,
int number)
178 set_message_port_protocol (
message_t* message,
const char* protocol)
180 if (strcasecmp (
"udp", protocol) == 0)
182 else if (strcasecmp (
"tcp", protocol) == 0)
195 set_message_port_string (
message_t* message,
char*
string)
209 set_message_description (
message_t* message,
char* description)
223 set_message_oid (
message_t* message,
char* oid)
225 if (message->
oid) free (message->
oid);
258 write_message (task, message,
"Error Message");
270 write_message (task, message,
"Alarm");
285 && (strcmp (message->
port.
string,
"general/Host_Details") == 0))
298 g_warning (
"%s: Failed to add report detail for host '%s': %s\n",
304 write_message (task, message,
"Log Message");
313 static char* current_scanner_preference = NULL;
321 static nvti_t* current_plugin = NULL;
344 plugins_feed_version = NULL;
404 scanner_state = state;
405 g_debug (
" scanner state set: %i\n", scanner_state);
473 g_debug (
" scanner start caught end\n");
479 g_warning (
"From scanner buffer treshold.");
491 from_scanner_start = 0;
509 parse_scanner_done (
char** messages)
512 while (*messages < end && ((*messages)[0] ==
' ' || (*messages)[0] ==
'\n'))
513 { (*messages)++; from_scanner_start++; }
514 if ((
int) (end - *messages) < 6)
518 if (strncasecmp (
"SERVER", *messages, 6))
520 g_debug (
" scanner fail: expected final \"SERVER\"\n");
524 from_scanner_start += 6;
537 parse_scanner_bad_login (
char** messages)
541 while (*messages < end && ((*messages)[0] ==
' '))
542 { (*messages)++; from_scanner_start++; }
543 if ((match = memchr (*messages,
548 if (strncasecmp (
"Bad login attempt !", *messages, 19) == 0)
550 g_debug (
"match bad login\n");
551 from_scanner_start += match + 1 - *messages;
552 *messages = match + 1;
569 parse_scanner_preference_value (
char** messages,
void (*
progress) ())
571 char *value, *end, *match;
573 while (*messages < end && ((*messages)[0] ==
' '))
574 { (*messages)++; from_scanner_start++; }
575 if ((match = memchr (*messages,
580 if (current_scanner_preference)
584 value = g_strdup (*messages);
585 blank_control_chars (value);
589 preference->
name = g_strdup (current_scanner_preference);
590 preference->
value = value;
597 from_scanner_start += match + 1 - *messages;
598 *messages = match + 1;
612 parse_scanner_plugin_list_tags (
char** messages)
614 char *value, *end, *match;
615 assert (current_plugin != NULL);
617 while (*messages < end && ((*messages)[0] ==
' '))
618 { (*messages)++; from_scanner_start++; }
619 if ((match = memchr (*messages,
624 value = g_strdup (*messages);
625 blank_control_chars (value);
638 gchar *tags, *cvss_base;
640 nvti_set_tag (current_plugin, tags);
641 nvti_set_cvss_base (current_plugin, cvss_base);
649 current_plugin = NULL;
652 from_scanner_start += match + 1 - *messages;
653 *messages = match + 1;
670 parse_scanner_server (
char** messages)
674 while (*messages < end && ((*messages)[0] ==
' '))
675 { (*messages)++; from_scanner_start++; }
676 if ((match = memchr (*messages,
685 while (*messages < end && ((*messages)[0] ==
' '))
686 { (*messages)++; from_scanner_start++; }
695 while (from_start < from_end
696 && ((match = memchr (input,
698 from_end - from_start))
701 assert (match >= input);
702 if ((((match - input) + from_start + 1) < from_end)
704 && (match[2] ==
'>'))
712 from_start += match + 1 - input;
722 scanner_is_loading (
char *messages)
724 if (!strncasecmp (
"SCANNER_LOADING ", messages, strlen (
"SCANNER_LOADING ")))
734 parse_scanner_loading (
char *messages)
738 str = strstr (messages,
" <|> ");
746 str = strstr (str,
" <|> ");
751 str = strchr (str,
'\n');
786 const char *ver_str =
"< OTP/2.0 >\n";
787 size_t ver_len = strlen (ver_str);
811 && (messages[0] ==
' ' || messages[0] ==
'\n'))
812 from_scanner_start++, messages++;
814 if (scanner_is_loading (messages))
816 parse_scanner_loading (messages);
819 "Waiting for scanner to load NVTs: %d / %d.\n",
823 "Waiting for scanner to load: No information provided. (Message: %s)\n", messages);
834 if (sync_buffer ())
return -1;
837 if (strncasecmp (ver_str, messages, ver_len))
839 g_debug (
" scanner fail: expected \"%s\"" 840 " got \"%.12s\"\n\n", ver_str, messages);
843 from_scanner_start += ver_len;
863 switch (parse_scanner_bad_login (&messages))
869 switch (parse_scanner_done (&messages))
874 if (sync_buffer ())
return -1;
878 switch (parse_scanner_plugin_list_tags (&messages))
882 if (sync_buffer ())
return -1;
887 switch (parse_scanner_preference_value (&messages,
progress))
891 if (sync_buffer ())
return -1;
894 g_free (current_scanner_preference);
895 current_scanner_preference = NULL;
899 switch (parse_scanner_server (&messages))
905 if (sync_buffer ())
return -1;
918 while (from_start < from_end
919 && ((match = memchr (input,
921 from_end - from_start))
924 assert (match >= input);
933 if ((((match - input) + from_start + 1) < from_end)
935 && (match[2] ==
'>'))
942 from_scanner_start += match + 3 - messages;
944 messages = match + 3;
948 field = openvas_strip_space (message, match);
949 blank_control_chars (field);
951 g_debug (
" scanner old state %i\n", scanner_state);
952 g_debug (
" scanner field: %s\n", field);
953 switch (scanner_state)
956 if (strcasecmp (
"BYE", field))
961 switch (parse_scanner_done (&messages))
964 if (sync_buffer ())
goto return_error;
967 case -1:
goto return_error;
970 if (sync_buffer ())
goto return_error;
971 goto return_need_more;
979 char* description = g_strdup (field);
980 set_message_description (current_message, description);
987 assert (current_message == NULL);
988 current_message = make_message (field);
996 char *protocol, *formatted;
998 assert (current_message);
1000 protocol = g_newa (
char, strlen (field));
1002 if (sscanf (field,
"%i/%s",
1006 number = atoi (field);
1009 g_debug (
" scanner got debug port, number: %i, protocol: %s\n",
1012 set_message_port_number (current_message, number);
1013 set_message_port_protocol (current_message, protocol);
1016 if (formatted == NULL)
1017 formatted = g_strdup (field);
1018 set_message_port_string (current_message, formatted);
1025 if (current_message != NULL
1028 char* oid = g_strdup (field);
1029 set_message_oid (current_message, oid);
1032 free_message (current_message);
1033 current_message = NULL;
1036 switch (parse_scanner_done (&messages))
1038 case -1:
goto return_error;
1041 if (sync_buffer ())
goto return_error;
1042 goto return_need_more;
1048 if (current_message)
1051 char* description = g_strdup (field);
1052 set_message_description (current_message, description);
1059 assert (current_message == NULL);
1060 current_message = make_message (field);
1068 char *protocol, *formatted;
1070 assert (current_message);
1072 protocol = g_newa (
char, strlen (field));
1074 if (sscanf (field,
"%i/%s",
1078 number = atoi (field);
1081 g_debug (
" scanner got alarm port, number: %i, protocol: %s\n",
1084 set_message_port_number (current_message, number);
1085 set_message_port_protocol (current_message, protocol);
1088 if (formatted == NULL)
1089 formatted = g_strdup (field);
1090 set_message_port_string (current_message, formatted);
1097 if (current_message != NULL
1100 char* oid = g_strdup (field);
1101 set_message_oid (current_message, oid);
1104 free_message (current_message);
1105 current_message = NULL;
1108 switch (parse_scanner_done (&messages))
1110 case -1:
goto return_error;
1113 if (sync_buffer ())
goto return_error;
1114 goto return_need_more;
1120 if (current_message)
1123 char* description = g_strdup (field);
1124 set_message_description (current_message, description);
1131 assert (current_message == NULL);
1132 current_message = make_message (field);
1140 char *protocol, *formatted;
1142 assert (current_message);
1144 protocol = g_newa (
char, strlen (field));
1146 if (sscanf (field,
"%i/%s",
1150 number = atoi (field);
1153 g_debug (
" scanner got log port, number: %i, protocol: %s\n",
1156 set_message_port_number (current_message, number);
1157 set_message_port_protocol (current_message, protocol);
1160 if (formatted == NULL)
1161 formatted = g_strdup (field);
1162 set_message_port_string (current_message, formatted);
1169 if (current_message != NULL
1172 char* oid = g_strdup (field);
1173 set_message_oid (current_message, oid);
1176 free_message (current_message);
1177 current_message = NULL;
1180 switch (parse_scanner_done (&messages))
1182 case -1:
goto return_error;
1185 if (sync_buffer ())
goto return_error;
1186 goto return_need_more;
1193 if (strlen (field) == 0 && match[1] ==
'|')
1196 switch (parse_scanner_done (&messages))
1208 case -1:
goto return_error;
1211 if (sync_buffer ())
goto return_error;
1212 goto return_need_more;
1216 assert (current_plugin == NULL);
1217 current_plugin = nvti_new ();
1220 if (current_plugin == NULL) abort ();
1221 nvti_set_oid (current_plugin, field);
1227 nvti_set_name (current_plugin, field);
1233 nvti_set_category (current_plugin, category_number (field));
1239 nvti_set_copyright (current_plugin, field);
1245 nvti_set_family (current_plugin, field);
1251 nvti_set_version (current_plugin, field);
1257 nvti_set_cve (current_plugin, field);
1263 nvti_set_bid (current_plugin, field);
1269 nvti_set_xref (current_plugin, field);
1271 switch (parse_scanner_plugin_list_tags (&messages))
1275 if (sync_buffer ())
goto return_error;
1276 goto return_need_more;
1282 char* feed_version = g_strdup (field);
1283 g_debug (
" scanner got nvti_info: %s\n", feed_version);
1284 if (plugins_feed_version)
1285 g_free (plugins_feed_version);
1286 plugins_feed_version = feed_version;
1288 switch (parse_scanner_done (&messages))
1296 case -1:
goto return_error;
1299 if (sync_buffer ())
goto return_error;
1300 goto return_need_more;
1307 if (strlen (field) == 0 && match[1] ==
'|')
1310 switch (parse_scanner_done (&messages))
1312 case -1:
goto return_error;
1315 if (sync_buffer ())
goto return_error;
1316 goto return_need_more;
1337 int value_start = -1, value_end = -1, count;
1340 count = sscanf (field,
"%20[^[][%*[^]]]:%n%*[ -~]%n",
1341 name, &value_start, &value_end);
1342 if (count == 1 && value_start > 0 && value_end > 0
1343 && ((strcmp (name,
"SSH Authorization") == 0)
1344 || (strcmp (name,
"SMB Authorization") == 0)))
1345 current_scanner_preference = NULL;
1347 current_scanner_preference = g_strdup (field);
1349 switch (parse_scanner_preference_value (&messages,
1354 if (sync_buffer ())
goto return_error;
1355 goto return_need_more;
1357 g_free (current_scanner_preference);
1358 current_scanner_preference = NULL;
1363 if (strcasecmp (
"BYE", field) == 0)
1365 else if (strcasecmp (
"ERRMSG", field) == 0)
1367 else if (strcasecmp (
"FILE_ACCEPTED", field) == 0)
1370 switch (parse_scanner_done (&messages))
1372 case -1:
goto return_error;
1375 if (sync_buffer ())
goto return_error;
1376 goto return_need_more;
1379 else if (strcasecmp (
"ALARM", field) == 0)
1381 else if (strcasecmp (
"LOG", field) == 0)
1383 else if (strcasecmp (
"NVT_INFO", field) == 0)
1385 else if (strcasecmp (
"PLUGIN_LIST", field) == 0)
1389 else if (strcasecmp (
"PREFERENCES", field) == 0)
1391 assert (current_scanner_preference == NULL);
1394 else if (strcasecmp (
"TIME", field) == 0)
1398 else if (strcasecmp (
"STATUS", field) == 0)
1404 g_debug (
"New scanner command to implement: %s\n",
1411 assert (current_host == NULL);
1412 current_host = g_strdup (field);
1422 unsigned int current, max;
1423 g_debug (
" scanner got ports: %s\n", field);
1424 if (sscanf (field,
"%u/%u", ¤t, &max) == 2)
1432 g_free (current_host);
1433 current_host = NULL;
1436 switch (parse_scanner_done (&messages))
1438 case -1:
goto return_error;
1441 if (sync_buffer ())
goto return_error;
1442 goto return_need_more;
1448 if (strcasecmp (
"HOST_START", field) == 0)
1450 else if (strcasecmp (
"HOST_END", field) == 0)
1452 else if (strcasecmp (
"SCAN_START", field) == 0)
1454 else if (strcasecmp (
"SCAN_END", field) == 0)
1463 assert (current_host == NULL);
1464 current_host = g_strdup (field);
1472 assert (current_host);
1478 g_free (current_host);
1479 current_host = NULL;
1482 switch (parse_scanner_done (&messages))
1484 case -1:
goto return_error;
1487 if (sync_buffer ())
goto return_error;
1488 goto return_need_more;
1494 assert (current_host == NULL);
1495 current_host = g_strdup (field);
1501 assert (current_host);
1509 "Report Host", uuid, 1, 0);
1515 assert (current_host);
1519 g_free (current_host);
1520 current_host = NULL;
1523 switch (parse_scanner_done (&messages))
1525 case -1:
goto return_error;
1528 if (sync_buffer ())
goto return_error;
1529 goto return_need_more;
1553 switch (parse_scanner_done (&messages))
1555 case -1:
goto return_error;
1558 if (sync_buffer ())
goto return_error;
1559 goto return_need_more;
1612 switch (parse_scanner_done (&messages))
1614 case -1:
goto return_error;
1617 if (sync_buffer ())
goto return_error;
1618 goto return_need_more;
1624 g_debug (
" switch t\n");
1625 g_debug (
" cmp %i\n", strcasecmp (
"SERVER", field));
1626 if (strcasecmp (
"SERVER", field))
1630 switch (parse_scanner_server (&messages))
1633 case -1:
goto return_error;
1636 if (sync_buffer ())
goto return_error;
1637 goto return_need_more;
1644 g_debug (
" scanner new state: %i\n", scanner_state);
1659 from_start += match + 1 - input;
1664 if (sync_buffer ())
return -1;
int report_host_noticeable(report_t, const gchar *)
Check if a report host is alive and has at least one result.
void report_add_result(report_t, result_t)
Add a result to a report.
char * string
Original string describing port.
void set_scan_host_start_time_otp(report_t, const char *, const char *)
Set the start time of a scanned host.
char * name
Name of preference.
int scanner_total_loading
Scanner total number of plugins to be loaded, when still loading.
void manage_complete_nvt_cache_update(GList *, GList *, int)
Complete an update of the NVT cache.
void parse_tags(const char *scanner_tags, gchar **tags, gchar **cvss_base)
Split up the tags received from the scanner.
port_protocol_t protocol
Port protocol (TCP, UDP, ...).
scanner_init_state_t scanner_init_state
The initialisation state of the scanner.
void reset_scanner_states()
Set the scanner initialisation state, scanner_init_state.
GList * scanner_plugins_list
The full plugins list, during reading of scanner plugin list.
scanner_state_t
Possible states of the scanner.
void set_task_run_status(task_t, task_status_t)
Set the run state of a task.
int scan_start_time_epoch(report_t)
Get the start time of a scan, in seconds since the epoch.
host_t host_notice(const char *, const char *, const char *, const char *, const char *, int, int)
Notice a host.
task_t current_scanner_task
The task currently running on the scanner.
void hosts_set_max_severity(report_t, int *, int *)
Set the maximum severity of each host in a scan.
char * description
Description of the message.
int openvas_scanner_full()
Check whether the buffer for data from Scanner is full.
task_status_t task_run_status(task_t)
Return the run state of a task.
void set_scan_start_time_otp(report_t, const char *)
Set the start time of a scan.
buffer_size_t from_scanner_start
The start of the data in the from_scanner buffer.
void set_scan_host_end_time_otp(report_t, const char *, const char *)
Set the end time of a scanned host.
void(* progress)()
Function to mark progress.
char * value
Value of preference.
int openvas_scanner_realloc()
Reallocates the from_scanner buffer to a higher size.
void clear_duration_schedules(task_t)
Clear once-off schedules from tasks where the duration has passed.
scanner_init_state_t
Possible initialisation states of the scanner.
void hosts_set_identifiers()
Setup hosts and their identifiers after a scan, from host details.
result_t make_result(task_t, const char *, const char *, const char *, const char *, const char *)
Make a result.
void set_scan_ports(report_t, const char *, unsigned int, unsigned int)
Set the ports for a particular host in a scan.
void hosts_set_details(report_t report)
Store certain host details in the assets after a scan.
void init_otp_data()
Initialise OTP library data.
#define G_LOG_DOMAIN
GLib log domain.
void set_task_start_time_otp(task_t, char *)
Set the start time of a task.
buffer_size_t from_scanner_end
The end of the data in the from_scanner buffer.
void set_scanner_init_state(scanner_init_state_t state)
Set the scanner initialisation state, scanner_init_state.
void update_duration_schedule_periods(task_t)
Update tasks with limited run schedules which have durations.
int scanner_init_offset
Offset into initialisation string being sent to scanner.
report_t current_report
The report of the current task.
char * oid
NVT identifier.
int manage_check_current_task()
Handle state changes to current task made by other processes.
void set_scan_end_time_otp(report_t, const char *)
Set the end time of a scan.
char * host
Host message describes.
unsigned int number
Port number.
void set_task_end_time(task_t task, char *time)
Set the end time of a task.
char * report_uuid(report_t)
Return the UUID of a report.
void manage_transaction_stop(gboolean)
Commit the current transaction, if any.
int acknowledge_bye()
Acknowledge a scanner BYE.
void set_nvts_feed_version(const char *)
Set the feed version of the plugins in the plugin cache.
char * port_name_formatted(const char *)
Returns formatted port number, protocol and iana name from.
buffer_size_t from_buffer_size
Size of from_client data buffer, in bytes.
void manage_nvt_preferences_enable()
Enable the NVT preferences.
int manage_report_host_detail(report_t, const char *, const char *)
Add a host detail to a report host.
#define BUFFER_SIZE_T_FORMAT
GList * scanner_preferences_list
The full preferences list, during reading of scanner plugin list.
void manage_transaction_start()
Start a new IMMEDIATE transaction.
int process_otp_scanner_input(void(*progress)())
Process any lines available in from_scanner.
int acknowledge_feed_version_info()
Acknowledge scanner PLUGINS_FEED_VERSION message,.
unsigned int buffer_size_t
char * from_scanner
Buffer of input from the scanner.
int scanner_current_loading
Scanner current number of loaded plugins, when still loading.
int delete_task_lock(task_t, int)
Complete deletion of a task.