diff options
author | Sam James <sam@gentoo.org> | 2021-01-11 22:17:59 +0000 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2021-01-11 22:17:59 +0000 |
commit | 7f85f1179fe8b92cc9c1eed6e363f8fde4b7bde7 (patch) | |
tree | 5ea990a47b3489a4728eca6095280f02404b5b10 /net-analyzer/cacti | |
parent | app-misc/geneweb: version bump to 7.0.0 (diff) | |
download | gentoo-7f85f1179fe8b92cc9c1eed6e363f8fde4b7bde7.tar.gz gentoo-7f85f1179fe8b92cc9c1eed6e363f8fde4b7bde7.tar.bz2 gentoo-7f85f1179fe8b92cc9c1eed6e363f8fde4b7bde7.zip |
net-analyzer/cacti: patch CVE-2020-35701
Bug: https://bugs.gentoo.org/765019
Package-Manager: Portage-3.0.12, Repoman-3.0.2
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'net-analyzer/cacti')
-rw-r--r-- | net-analyzer/cacti/cacti-1.2.16-r1.ebuild | 54 | ||||
-rw-r--r-- | net-analyzer/cacti/files/cacti-1.2.16-CVE-2020-35701.patch | 29 | ||||
-rw-r--r-- | net-analyzer/cacti/files/cacti-1.2.16-XSS-issue-4019.patch | 360 |
3 files changed, 443 insertions, 0 deletions
diff --git a/net-analyzer/cacti/cacti-1.2.16-r1.ebuild b/net-analyzer/cacti/cacti-1.2.16-r1.ebuild new file mode 100644 index 000000000000..d210806302f2 --- /dev/null +++ b/net-analyzer/cacti/cacti-1.2.16-r1.ebuild @@ -0,0 +1,54 @@ +# Copyright 1999-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +inherit edos2unix webapp + +# Support for _p* in version. +MY_P=${P/_p*/} + +DESCRIPTION="Cacti is a complete frontend to rrdtool" +HOMEPAGE="https://www.cacti.net/" +SRC_URI="https://www.cacti.net/downloads/${MY_P}.tar.gz" + +LICENSE="GPL-2" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ppc ~ppc64 ~sparc ~x86" +IUSE="snmp doc" + +need_httpd + +RDEPEND=" + dev-lang/php[cli,mysql,pdo,session,sockets,xml] + dev-php/adodb + net-analyzer/rrdtool[graph] + virtual/cron + snmp? ( >=net-analyzer/net-snmp-5.2.0 ) +" + +PATCHES=( + "${FILESDIR}/${P}-CVE-2020-35701.patch" + "${FILESDIR}/${P}-XSS-issue-4019.patch" +) + +src_compile() { :; } + +src_install() { + dodoc CHANGELOG + dodoc -r docs + mv docs .. || die + + webapp_src_preinst + + edos2unix `find -type f -name '*.php'` + + dodir ${MY_HTDOCSDIR} + cp -r . "${ED}"${MY_HTDOCSDIR} + + webapp_serverowned ${MY_HTDOCSDIR}/rra + webapp_serverowned ${MY_HTDOCSDIR}/log + webapp_configfile ${MY_HTDOCSDIR}/include/config.php + webapp_postinst_txt en "${FILESDIR}"/postinstall-en.txt + + webapp_src_install +} diff --git a/net-analyzer/cacti/files/cacti-1.2.16-CVE-2020-35701.patch b/net-analyzer/cacti/files/cacti-1.2.16-CVE-2020-35701.patch new file mode 100644 index 000000000000..f55b7b0a40df --- /dev/null +++ b/net-analyzer/cacti/files/cacti-1.2.16-CVE-2020-35701.patch @@ -0,0 +1,29 @@ +https://bugs.gentoo.org/765019 +https://github.com/Cacti/cacti/commit/565e0604a53f4988dc5b544d01f4a631eaa80d82 + +From 565e0604a53f4988dc5b544d01f4a631eaa80d82 Mon Sep 17 00:00:00 2001 +From: TheWitness <thewitness@cacti.net> +Date: Thu, 24 Dec 2020 10:39:50 -0500 +Subject: [PATCH] Fixing Issue #4022 + +SQL Injection in data_debug.php +--- a/data_debug.php ++++ b/data_debug.php +@@ -35,6 +35,8 @@ + + set_default_action(); + ++validate_request_vars(); ++ + switch (get_request_var('action')) { + case 'actions': + form_actions(); +@@ -123,8 +125,6 @@ + + break; + default: +- validate_request_vars(); +- + $refresh = array( + 'seconds' => get_request_var('refresh'), + 'page' => 'data_debug.php?header=false', diff --git a/net-analyzer/cacti/files/cacti-1.2.16-XSS-issue-4019.patch b/net-analyzer/cacti/files/cacti-1.2.16-XSS-issue-4019.patch new file mode 100644 index 000000000000..1f09e572c860 --- /dev/null +++ b/net-analyzer/cacti/files/cacti-1.2.16-XSS-issue-4019.patch @@ -0,0 +1,360 @@ +https://github.com/Cacti/cacti/issues/4019 + +From ef10fe1c340ed932dc18b6a566b21f9dd15933c2 Mon Sep 17 00:00:00 2001 +From: TheWitness <thewitness@cacti.net> +Date: Wed, 23 Dec 2020 16:33:27 -0500 +Subject: [PATCH] Fixing Issue #4019 + +* In a recent audit of core Cacti code, there were a few stored XSS issues that can be exposed +* Also removed a few spurious title_trims, that should no longer be a problem. +--- a/automation_devices.php ++++ b/automation_devices.php +@@ -485,7 +485,7 @@ function draw_filter() { + <?php + if (cacti_sizeof($networks)) { + foreach ($networks as $key => $name) { +- print "<option value='" . $key . "'"; if (get_request_var('network') == $key) { print ' selected'; } print '>' . $name . "</option>"; ++ print "<option value='" . html_escape($key) . "'"; if (get_request_var('network') == $key) { print ' selected'; } print '>' . html_escape($name) . "</option>"; + } + } + ?> +@@ -515,7 +515,7 @@ function draw_filter() { + <?php + if (cacti_sizeof($status_arr)) { + foreach ($status_arr as $st) { +- print "<option value='" . $st . "'"; if (get_request_var('status') == $st) { print ' selected'; } print '>' . $st . "</option>"; ++ print "<option value='" . html_escape($st) . "'"; if (get_request_var('status') == $st) { print ' selected'; } print '>' . html_escape($st) . "</option>"; + } + } + ?> +@@ -530,7 +530,7 @@ function draw_filter() { + <?php + if (cacti_sizeof($os_arr)) { + foreach ($os_arr as $st) { +- print "<option value='" . $st . "'"; if (get_request_var('os') == $st) { print ' selected'; } print '>' . $st . "</option>"; ++ print "<option value='" . html_escape($st) . "'"; if (get_request_var('os') == $st) { print ' selected'; } print '>' . html_escape($st) . "</option>"; + } + } + ?> +@@ -545,7 +545,7 @@ function draw_filter() { + <?php + if (cacti_sizeof($status_arr)) { + foreach ($status_arr as $st) { +- print "<option value='" . $st . "'"; if (get_request_var('snmp') == $st) { print ' selected'; } print '>' . $st . "</option>"; ++ print "<option value='" . html_escape($st) . "'"; if (get_request_var('snmp') == $st) { print ' selected'; } print '>' . html_escape($st) . "</option>"; + } + } + ?> +@@ -560,7 +560,7 @@ function draw_filter() { + <?php + if (cacti_sizeof($item_rows) > 0) { + foreach ($item_rows as $key => $value) { +- print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . "</option>"; ++ print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . html_escape($value) . "</option>"; + } + } + ?> +--- a/data_debug.php ++++ b/data_debug.php +@@ -969,7 +969,7 @@ function data_debug_filter() { + + if (cacti_sizeof($templates) > 0) { + foreach ($templates as $template) { +- print "<option value='" . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . title_trim(html_escape($template['name']), 40) . "</option>"; ++ print "<option value='" . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . html_escape($template['name']) . '</option>'; + } + } + ?> +@@ -997,7 +997,7 @@ function data_debug_filter() { + $profiles = array_rekey(db_fetch_assoc('SELECT id, name FROM data_source_profiles ORDER BY name'), 'id', 'name'); + if (cacti_sizeof($profiles)) { + foreach ($profiles as $key => $value) { +- print "<option value='" . $key . "'"; if (get_request_var('profile') == $key) { print ' selected'; } print '>' . html_escape($value) . "</option>"; ++ print "<option value='" . $key . "'"; if (get_request_var('profile') == $key) { print ' selected'; } print '>' . html_escape($value) . '</option>'; + } + } + ?> +@@ -1063,7 +1063,7 @@ function data_debug_filter() { + <?php + if (cacti_sizeof($item_rows) > 0) { + foreach ($item_rows as $key => $value) { +- print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . html_escape($value) . "</option>"; ++ print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . html_escape($value) . '</option>'; + } + } + ?> +--- a/data_sources.php ++++ b/data_sources.php +@@ -1361,7 +1361,7 @@ function clearFilter() { + + if (cacti_sizeof($templates)) { + foreach ($templates as $template) { +- print "<option value='" . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . title_trim(html_escape($template['name']), 40) . '</option>'; ++ print "<option value='" . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . html_escape($template['name']) . '</option>'; + } + } + ?> +--- a/lib/api_automation.php ++++ b/lib/api_automation.php +@@ -154,7 +154,7 @@ function clearDeviceFilter() { + + if (cacti_sizeof($host_templates)) { + foreach ($host_templates as $host_template) { +- print "<option value='" . $host_template['id'] . "'"; if (get_request_var('host_template_id') == $host_template['id']) { print ' selected'; } print '>' . $host_template['name'] . "</option>\n"; ++ print "<option value='" . $host_template['id'] . "'"; if (get_request_var('host_template_id') == $host_template['id']) { print ' selected'; } print '>' . html_escape($host_template['name']) . '</option>'; + } + } + ?> +@@ -184,7 +184,7 @@ function clearDeviceFilter() { + <?php + if (cacti_sizeof($item_rows)) { + foreach ($item_rows as $key => $value) { +- print "<option value='". $key . "'"; if (get_request_var('rowsd') == $key) { print ' selected'; } print '>' . $value . '</option>\n'; ++ print "<option value='". $key . "'"; if (get_request_var('rowsd') == $key) { print ' selected'; } print '>' . $value . '</option>'; + } + } + ?> +@@ -432,7 +432,7 @@ function clearFilter() { + $hosts = get_allowed_devices(); + if (cacti_sizeof($hosts)) { + foreach ($hosts as $host) { +- print "<option value='" . $host['id'] . "'"; if (get_request_var('host_id') == $host['id']) { print ' selected'; } print '>' . html_escape($host['description']) . "</option>\n"; ++ print "<option value='" . $host['id'] . "'"; if (get_request_var('host_id') == $host['id']) { print ' selected'; } print '>' . html_escape($host['description']) . '</option>'; + } + } + ?> +@@ -453,7 +453,7 @@ function clearFilter() { + + if (cacti_sizeof($templates) > 0) { + foreach ($templates as $template) { +- print "<option value=' " . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . title_trim($template['name'], 40) . "</option>\n"; ++ print "<option value=' " . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . html_escape($template['name']) . '</option>'; + } + } + ?> +@@ -484,7 +484,7 @@ function clearFilter() { + <?php + if (cacti_sizeof($item_rows)) { + foreach ($item_rows as $key => $value) { +- print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . "</option>\n"; ++ print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . '</option>'; + } + } + ?> +@@ -718,7 +718,7 @@ function clearObjectFilter() { + <?php + if (cacti_sizeof($item_rows)) { + foreach ($item_rows as $key => $value) { +- print "<option value='". $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . '</option>\n'; ++ print "<option value='". $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . '</option>'; + } + } + ?> +@@ -1078,10 +1078,10 @@ function clearFilter() { + <?php + $host_templates = db_fetch_assoc('select id,name from host_template order by name'); + +- if (cacti_sizeof($host_templates) > 0) { +- foreach ($host_templates as $host_template) { +- print "<option value='" . $host_template['id'] . "'"; if (get_request_var('host_template_id') == $host_template['id']) { print ' selected'; } print '>' . $host_template['name'] . "</option>\n"; +- } ++ if (cacti_sizeof($host_templates)) { ++ foreach ($host_templates as $host_template) { ++ print "<option value='" . $host_template['id'] . "'"; if (get_request_var('host_template_id') == $host_template['id']) { print ' selected'; } print '>' . html_escape($host_template['name']) . '</option>'; ++ } + } + ?> + </select> +@@ -1110,7 +1110,7 @@ function clearFilter() { + <?php + if (cacti_sizeof($item_rows)) { + foreach ($item_rows as $key => $value) { +- print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . "</option>\n"; ++ print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . '</option>'; + } + } + ?> +--- a/lib/html.php ++++ b/lib/html.php +@@ -998,7 +998,7 @@ function html_create_list($form_data, $column_display, $column_id, $form_previou + print ' selected'; + } + +- print '>' . title_trim(null_out_substitutions(html_escape($form_data[$id])), 75) . '</option>'; ++ print '>' . html_escape(null_out_substitutions($form_data[$id])) . '</option>'; + } + } + } else { +@@ -1011,9 +1011,9 @@ function html_create_list($form_data, $column_display, $column_id, $form_previou + } + + if (isset($row['host_id'])) { +- print '>' . title_trim(html_escape($row[$column_display]), 75) . '</option>'; ++ print '>' . html_escape($row[$column_display]) . '</option>'; + } else { +- print '>' . title_trim(null_out_substitutions(html_escape($row[$column_display])), 75) . '</option>'; ++ print '>' . html_escape(null_out_substitutions($row[$column_display])) . '</option>'; + } + } + } +@@ -2010,7 +2010,7 @@ function html_host_filter($host_id = '-1', $call_back = 'applyFilter', $sql_wher + + if (cacti_sizeof($devices)) { + foreach ($devices as $device) { +- print "<option value='" . $device['id'] . "'"; if ($host_id == $device['id']) { print ' selected'; } print '>' . title_trim(html_escape(strip_domain($device['description'])), 40) . '</option>'; ++ print "<option value='" . $device['id'] . "'"; if ($host_id == $device['id']) { print ' selected'; } print '>' . html_escape(strip_domain($device['description'])) . '</option>'; + } + } + ?> +@@ -2385,6 +2385,7 @@ function html_common_header($title, $selectedTheme = '') { + <meta name='apple-mobile-web-app-capable' content='yes'> + <meta name='description' content='Monitoring tool of the Internet'> + <meta name='mobile-web-app-capable' content='yes'> ++ <meta name="theme-color" content="#161616"/> + <meta http-equiv="Content-Security-Policy" content="default-src *; img-src 'self' <?php print $alternates;?> data: blob:; style-src 'self' 'unsafe-inline' <?php print $alternates;?>; script-src 'self' <?php print $script_policy;?> 'unsafe-inline' <?php print $alternates;?>; worker-src 'self'"> + <meta name='robots' content='noindex,nofollow'> + <title><?php print $title; ?></title> +--- a/lib/html_graph.php ++++ b/lib/html_graph.php +@@ -212,9 +212,9 @@ function html_graph_preview_filter($page, $action, $devices_where = '', $templat + <select id='graphs' onChange='applyGraphFilter()'> + <?php + if (cacti_sizeof($graphs_per_page)) { +- foreach ($graphs_per_page as $key => $value) { +- print "<option value='" . $key . "'"; if (get_request_var('graphs') == $key) { print ' selected'; } print '>' . $value . "</option>\n"; +- } ++ foreach ($graphs_per_page as $key => $value) { ++ print "<option value='" . $key . "'"; if (get_request_var('graphs') == $key) { print ' selected'; } print '>' . $value . "</option>\n"; ++ } + } + ?> + </select> +@@ -260,7 +260,7 @@ function html_graph_preview_filter($page, $action, $devices_where = '', $templat + + if (cacti_sizeof($graph_timespans)) { + foreach($graph_timespans as $value => $text) { +- print "<option value='$value'"; if ($_SESSION['sess_current_timespan'] == $value) { print ' selected'; } print '>' . $text . "</option>\n"; ++ print "<option value='$value'"; if ($_SESSION['sess_current_timespan'] == $value) { print ' selected'; } print '>' . html_escape($text) . '</option>'; + } + } + ?> +@@ -293,7 +293,7 @@ function html_graph_preview_filter($page, $action, $devices_where = '', $templat + $end_val = cacti_sizeof($graph_timeshifts)+1; + if (cacti_sizeof($graph_timeshifts) > 0) { + for ($shift_value=$start_val; $shift_value < $end_val; $shift_value++) { +- print "<option value='$shift_value'"; if ($_SESSION['sess_current_timeshift'] == $shift_value) { print ' selected'; } print '>' . title_trim($graph_timeshifts[$shift_value], 40) . "</option>\n"; ++ print "<option value='$shift_value'"; if ($_SESSION['sess_current_timeshift'] == $shift_value) { print ' selected'; } print '>' . html_escape($graph_timeshifts[$shift_value]) . '</option>'; + } + } + ?> +--- a/lib/html_tree.php ++++ b/lib/html_tree.php +@@ -1138,7 +1138,7 @@ function grow_right_pane_tree($tree_id, $leaf_id, $host_group_data) { + + if (cacti_sizeof($graph_timespans)) { + foreach($graph_timespans as $value => $text) { +- print "<option value='$value'"; if ($_SESSION['sess_current_timespan'] == $value) { print ' selected'; } print '>' . $text . '</option>'; ++ print "<option value='$value'"; if ($_SESSION['sess_current_timespan'] == $value) { print ' selected'; } print '>' . html_escape($text) . '</option>'; + } + } + ?> +@@ -1171,7 +1171,7 @@ function grow_right_pane_tree($tree_id, $leaf_id, $host_group_data) { + $end_val = cacti_sizeof($graph_timeshifts)+1; + if (cacti_sizeof($graph_timeshifts)) { + for ($shift_value=$start_val; $shift_value < $end_val; $shift_value++) { +- print "<option value='$shift_value'"; if ($_SESSION['sess_current_timeshift'] == $shift_value) { print ' selected'; } print '>' . title_trim($graph_timeshifts[$shift_value], 40) . '</option>'; ++ print "<option value='$shift_value'"; if ($_SESSION['sess_current_timeshift'] == $shift_value) { print ' selected'; } print '>' . html_escape($graph_timeshifts[$shift_value]) . '</option>'; + } + } + ?> +--- a/managers.php ++++ b/managers.php +@@ -483,7 +483,7 @@ function clearFilter() { + <?php + if (cacti_sizeof($mibs)) { + foreach ($mibs as $mib) { +- print "<option value='" . $mib['mib'] . "'"; if (get_request_var('mib') == $mib['mib']) { print ' selected'; } print '>' . $mib['mib'] . '</option>'; ++ print "<option value='" . html_escape($mib['mib']) . "'"; if (get_request_var('mib') == $mib['mib']) { print ' selected'; } print '>' . html_escape($mib['mib']) . '</option>'; + } + } + ?> +--- a/utilities.php ++++ b/utilities.php +@@ -812,7 +812,7 @@ function applyFilter() { + + if (cacti_sizeof($users)) { + foreach ($users as $user) { +- print "<option value='" . $user['username'] . "'"; if (get_request_var('username') == $user['username']) { print ' selected'; } print '>' . $user['username'] . '</option>'; ++ print "<option value='" . html_escape($user['username']) . "'"; if (get_request_var('username') == $user['username']) { print ' selected'; } print '>' . html_escape($user['username']) . '</option>'; + } + } + ?> +@@ -1034,19 +1034,19 @@ function utilities_view_logfile() { + + $logfile = basename(get_nfilter_request_var('filename')); + $logbase = basename(read_config_option('path_cactilog')); +- ++ + if ($logfile == '') { + $logfile = $logbase; + } +- ++ + if ($logfile == '') { + $logfile = 'cacti.log'; + } +- ++ + $logname = ''; + $logpath = ''; + +- if (!clog_validate_filename($logfile, $logpath, $logname, true)) { ++ if (!clog_validate_filename($logfile, $logpath, $logname, true)) { + raise_message('clog_invalid'); + header('Location: utilities.php?action=view_logfile&filename=' . $logbase); + exit(0); +@@ -1171,7 +1171,7 @@ function clearFilter() { + + if (cacti_sizeof($logFileArray)) { + foreach ($logFileArray as $logFile) { +- print "<option value='" . $logFile . "'"; ++ print "<option value='" . html_escape($logFile) . "'"; + + if (get_nfilter_request_var('filename') == $logFile) { + print ' selected'; +@@ -1182,7 +1182,7 @@ function clearFilter() { + $logDate = cacti_count($logParts) < 2 ? '' : $logParts[1] . (isset($logParts[2]) ? '-' . $logParts[2]:''); + $logName = $logParts[0]; + +- print '>' . $logName . ($logDate != '' ? ' [' . substr($logDate,4) . ']':'') . '</option>'; ++ print '>' . html_escape($logName . ($logDate != '' ? ' [' . substr($logDate,4) . ']':'')) . '</option>'; + } + } + ?> +@@ -1807,7 +1807,7 @@ function clearFilter() { + + if (cacti_sizeof($templates)) { + foreach ($templates as $template) { +- print "<option value='" . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . title_trim(html_escape($template['name']), 40) . '</option>'; ++ print "<option value='" . $template['id'] . "'"; if (get_request_var('template_id') == $template['id']) { print ' selected'; } print '>' . html_escape($template['name']) . '</option>'; + } + } + ?> +@@ -2540,7 +2540,7 @@ function clearFilter() { + <?php + if (cacti_sizeof($mibs) > 0) { + foreach ($mibs as $mib) { +- print "<option value='" . $mib['mib'] . "'"; if (get_request_var('mib') == $mib['mib']) { print ' selected'; } print '>' . html_escape($mib['mib']) . '</option>'; ++ print "<option value='" . html_escape($mib['mib']) . "'"; if (get_request_var('mib') == $mib['mib']) { print ' selected'; } print '>' . html_escape($mib['mib']) . '</option>'; + } + } + ?> +@@ -2804,7 +2804,7 @@ function purgeFilter() { + <option value='-1'<?php if (get_request_var('receiver') == '-1') {?> selected<?php }?>><?php print __('Any');?></option> + <?php + foreach ($receivers as $receiver) { +- print "<option value='" . $receiver['manager_id'] . "'"; if (get_request_var('receiver') == $receiver['manager_id']) { print ' selected'; } print '>' . $receiver['hostname'] . '</option>'; ++ print "<option value='" . $receiver['manager_id'] . "'"; if (get_request_var('receiver') == $receiver['manager_id']) { print ' selected'; } print '>' . html_escape($receiver['hostname']) . '</option>'; + } + ?> + </select> |