mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 01:28:20 +00:00
Merge commit 'ad054d0dcf
' into topic/policy-scripts-new
* commit 'ad054d0dcf
':
New software.bro API function for constructing an Info record from a raw version string.
This commit is contained in:
commit
da244f83b2
1 changed files with 41 additions and 7 deletions
|
@ -19,13 +19,14 @@ redef enum Notice::Type += {
|
||||||
|
|
||||||
export {
|
export {
|
||||||
type Version: record {
|
type Version: record {
|
||||||
major: count; ##< Major version number
|
major: count &default=0; ##< Major version number
|
||||||
minor: count; ##< Minor version number
|
minor: count &default=0; ##< Minor version number
|
||||||
minor2: count; ##< Minor subversion number
|
minor2: count &default=0; ##< Minor subversion number
|
||||||
addl: string; ##< Additional version string (e.g. "beta42")
|
addl: string &default=""; ##< Additional version string (e.g. "beta42")
|
||||||
};
|
};
|
||||||
|
|
||||||
type Type: enum {
|
type Type: enum {
|
||||||
|
UNKNOWN_SOFTWARE,
|
||||||
WEB_SERVER,
|
WEB_SERVER,
|
||||||
WEB_BROWSER,
|
WEB_BROWSER,
|
||||||
MAIL_SERVER,
|
MAIL_SERVER,
|
||||||
|
@ -44,9 +45,9 @@ export {
|
||||||
## The time at which the software was first detected.
|
## The time at which the software was first detected.
|
||||||
ts: time;
|
ts: time;
|
||||||
## The IP address detected running the software.
|
## The IP address detected running the software.
|
||||||
host: addr;
|
host: addr &default=0.0.0.0;
|
||||||
## The type of software detected (e.g. WEB_SERVER)
|
## The type of software detected (e.g. WEB_SERVER)
|
||||||
software_type: Type;
|
software_type: Type &default=UNKNOWN_SOFTWARE;
|
||||||
## Name of the software (e.g. Apache)
|
## Name of the software (e.g. Apache)
|
||||||
name: string;
|
name: string;
|
||||||
## Version of the software
|
## Version of the software
|
||||||
|
@ -72,10 +73,16 @@ export {
|
||||||
} &redef;
|
} &redef;
|
||||||
|
|
||||||
## Other scripts should call this function when they detect software.
|
## Other scripts should call this function when they detect software.
|
||||||
## @param unparsed_version: This is the full string from which the Software::Info was extracted.
|
## @param unparsed_version: This is the full string from which the
|
||||||
|
## Software::Info was extracted.
|
||||||
## @return: T if the software was logged, F otherwise.
|
## @return: T if the software was logged, F otherwise.
|
||||||
global found: function(c: connection, info: Software::Info): bool;
|
global found: function(c: connection, info: Software::Info): bool;
|
||||||
|
|
||||||
|
## This function can take many software version strings and parse them into
|
||||||
|
## a sensible Software::Version record. There are still many cases where
|
||||||
|
## scripts may have to have their own specific version parsing though.
|
||||||
|
global default_software_parsing: function(unparsed_version: string): Info;
|
||||||
|
|
||||||
## Index is the name of the software.
|
## Index is the name of the software.
|
||||||
type SoftwareSet: table[string] of Info;
|
type SoftwareSet: table[string] of Info;
|
||||||
# The set of software associated with an address.
|
# The set of software associated with an address.
|
||||||
|
@ -88,6 +95,33 @@ event bro_init()
|
||||||
Log::add_default_filter("SOFTWARE");
|
Log::add_default_filter("SOFTWARE");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function default_software_parsing(unparsed_version: string): Info
|
||||||
|
{
|
||||||
|
local software_name = "";
|
||||||
|
local v: Version;
|
||||||
|
|
||||||
|
# The regular expression should match the complete version number
|
||||||
|
# TODO: this needs tests written!
|
||||||
|
local version_parts = split_all(unparsed_version, /[0-9\-\._]{2,}/);
|
||||||
|
if ( |version_parts| >= 2 )
|
||||||
|
{
|
||||||
|
# Remove the name/version separator
|
||||||
|
software_name = sub(version_parts[1], /.$/, "");
|
||||||
|
local version_numbers = split_n(version_parts[2], /[\-\._[:blank:]]/, F, 4);
|
||||||
|
if ( |version_numbers| >= 4 )
|
||||||
|
v$addl = version_numbers[4];
|
||||||
|
if ( |version_numbers| >= 3 )
|
||||||
|
v$minor2 = to_count(version_numbers[3]);
|
||||||
|
if ( |version_numbers| >= 2 )
|
||||||
|
v$minor = to_count(version_numbers[2]);
|
||||||
|
if ( |version_numbers| >= 1 )
|
||||||
|
v$major = to_count(version_numbers[1]);
|
||||||
|
}
|
||||||
|
return [$ts=network_time(), $host=0.0.0.0, $name=software_name,
|
||||||
|
$version=v, $unparsed_version=unparsed_version];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Compare two versions.
|
# Compare two versions.
|
||||||
# Returns -1 for v1 < v2, 0 for v1 == v2, 1 for v1 > v2.
|
# Returns -1 for v1 < v2, 0 for v1 == v2, 1 for v1 > v2.
|
||||||
# If the numerical version numbers match, the addl string
|
# If the numerical version numbers match, the addl string
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue