WPIntell

Source evidence

Security vulnerability

Weather Atlas Widget · support · 2024-11-18T20:22:00+00:00

mixedsentiment
highseverity
0.95relevance
14replies
Evidence linked to opportunitycommercial context

Proof Health

Open evidence

Commercial opportunities need traceable source links before they are treated as build-worthy.

3 / 28 rows with source links

10.7% of this page's analysis has direct source links.

0 build-decision rows missing links

0 rows here require auditable proof before promotion.

25 rows with no attached evidence

0 rows have source counts but still need direct links.

Conversation

support
dljordaneku resolved
I am getting notices that this plugin has a security vulnerability for cross site scripting. Is there a fix coming? https://patchstack.com/database/vulnerability/weather-atlas/wordpress-weather-atlas-widget-plugin-3-0-1-cross-site-scripting-xss-vulnerability?_a_id=431 Same issue here, WPToolkit Shows WordPress Weather Atlas Widget plugin <= 3.0.1 – Cross Site Scripting (XSS) vulnerability Cross Site Scripting (XSS) vulnerability discovered by LVT-tholv2k (Patchstack Alliance) in WordPress Plugin Weather Atlas Widget (versions <= 3.0.1) Date: 18.11.2024 | Source: https://patchstack.com/database/vulnerability/weather-atlas/wordpress-weather-atlas-widget-plugin-3-0-1-cross-site-scripting-xss-vulnerability?_a_id=110 I Disabled the plugin, I will wait a couple of days and if there is no patch or version update I will try to find where vulnerabillity is and update it myown or I will change the plugin with another one, its a pitty This is a very nice plugin. Thank you for the heads-up. We will most definitely try to identify the vulnerability. If/When we find the issue, we will fix it, hopefully before it is announced on the mentioned website. If it is published, we will address it promptly. Thx again @weatheratlas thanks for the update. dj https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/weather-atlas/weather-atlas-widget-301-unauthenticated-cross-site-scripting Dear Plugin Authors, Check the file class-weather-atlas-rest-api.php (I beleive here lies the XSSVulnerability) 1.) The maybe_unserialize and unserialize Mitigation: Escape all output data using esc_html() , esc_attr() , 2.) The widget_name might not be sanitized. Mitigation: Sanitize or validate all fields to ensure they meet expected formats before returning them. maybe this <?php // Assuming your namespace and use declarations here if you have any class Weather_Atlas_REST_API { public function __construct() { add_action('rest_api_init', array($this, 'register_routes')); } public function register_routes() { register_rest_route('weather-atlas/v1', '/widgets', array( 'methods' => 'GET', 'callback' => array($this, 'get_weather_widgets'), 'permission_callback' => '__return_true' )); } public function get_weather_widgets() { global $wpdb; $prefix = 'weather_atlas_widget_'; // Prepare the query securely $query = $wpdb->prepare("SELECT * FROM {$wpdb->options} WHERE option_name LIKE %s", $prefix . '%'); $widgets = $wpdb->get_results($query); // Safely sort widgets by 'widget_name' usort($widgets, function ($a, $b) { $a_data = maybe_unserialize($a->option_value); $b_data = maybe_unserialize($b->option_value); $a_name = isset($a_data['widget_name']) ? esc_html($a_data['widget_name']) : ''; $b_name = isset($b_data['widget_name']) ? esc_html($b_data['widget_name']) : ''; return strcmp($a_name, $b_name); }); // Prepare the response with sanitized data $formatted_widgets = array(); foreach ($widgets as $widget) { $widget_data = maybe_unserialize($widget->option_value); $formatted_widgets[] = array( 'id' => esc_attr(str_replace('weather_atlas_widget_', '', $widget->option_name)), 'widget_name' => isset($widget_data['widget_name']) ? esc_html($widget_data['widget_name']) : 'Unnamed Widget' ); } return $formatted_widgets; } } @weatheratlas any update on this? Several security sites are reporting this now. Please address this. @manos4wpsites Thank you for assisting with the patch. We have used your fix and updated a bit.. The old script had potential XSS issues because widget_name was returned without sanitization or escaping, allowing malicious data from the database to be exposed in the API response. This was resolved by sanitizing with sanitize_text_field() and escaping with esc_html() to ensure safe output. Commit Comments – Fixed XSS vulnerability by sanitizing widget_name with sanitize_text_field() during processing. – Escaped API output using esc_html() to ensure safe rendering of data. – Improved data handling with maybe_unserialize() to safely process serialized database values. – Enhanced API security by validating and escaping user-controlled data before returning responses. Fingers crossed this solved potential XSS issue Hello, unfortunately the problem has not yet been resolved in version 3.0.2. A security risk is still detected: https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/weather-atlas/weather-atlas-widget-301-unauthenticated-cross-site-scripting You marked this issue as resolved, but it seems this XSS vulnerability remains even on this 3.0.2 version. Do you have any plans to address this? https://patchstack.com/database/wordpress/plugin/weather-atlas/vulnerability/wordpress-weather-atlas-widget-plugin-3-0-1-cross-site-scripting-xss-vulnerability I am having same issue on the latest copy of the plugin version 3.0.2 see screemshot attached https://tinyurl.com/26qxna65 Hi Developer could you please check below and see if this can help you apply the necessary fixes to these vulnerabilities please. I have listed potential issues and their fixes. <?php /** * Weather Atlas Widget Security Fixes Documentation * Version: 3.0.2 * * This file documents the XSS vulnerabilities and their fixes. * DO NOT USE THIS FILE IN PRODUCTION - FOR DOCUMENTATION PURPOSES ONLY */ /** * 1. public/partials/weather-atlas-public-display.php Fixes * Problem: Unescaped output in widget display */ // Vulnerable code example: $widget_title = $instance['title']; echo $widget_title; // VULNERABLE // Fix: Proper escaping $widget_title = $instance['title']; echo esc_html($widget_title); // FIXED // Location display fix // Vulnerable: echo $location_name; // VULNERABLE // Fix: echo esc_html($location_name); // FIXED /** * 2. includes/class-weather-atlas.php Fixes * Problem: Unescaped widget output in widget() method */ // Vulnerable code example: $city_selector = $instance['city_selector']; $country_selector = $instance['country_selector']; echo '<div class="weather-atlas-wrapper" data-city="' . $city_selector . '" data-country="' . $country_selector . '">'; // VULNERABLE // Fix: Proper escaping and sanitization $city_selector = absint($instance['city_selector']); $country_selector = absint($instance['country_selector']); echo '<div class="weather-atlas-wrapper" data-city="' . esc_attr($city_selector) . '" data-country="' . esc_attr($country_selector) . '">'; // FIXED /** * 3. admin/weather-atlas-settings.php Fixes * Problem: Insufficient input validation in admin settings */ // Vulnerable code example: $api_settings = $_POST['weather_atlas_settings']; // VULNERABLE update_option('weather_atlas_settings', $api_settings); // Fix: Proper validation and sanitization if (!isset($_POST['weather_atlas_nonce']) || !wp_verify_nonce($_POST['weather_atlas_nonce'], 'weather_atlas_settings')) { wp_die('Security check failed'); } $api_settings = array( 'city_name' => sanitize_text_field($_POST['weather_atlas_settings']['city_name']), 'api_key' => sanitize_text_field($_POST['weather_atlas_settings']['api_key']), 'layout' => in_array($_POST['weather_atlas_settings']['layout'], array('horizontal', 'vertical')) ? $_POST['weather_atlas_settings']['layout'] : 'horizontal', 'temperature_unit' => in_array($_POST['weather_atlas_settings']['temperature_unit'], array('C', 'F')) ? $_POST['weather_atlas_settings']['temperature_unit'] : 'C' ); update_option('weather_atlas_settings', $api_settings); // FIXED /** * 4. block/block.js Fixes (JavaScript) * Problem: Potential XSS in Gutenberg block rendering * Note: While this is JavaScript, showing the vulnerable parts and fixes */ // Vulnerable code example: /* // VULNERABLE const widgetContent = <br> <div class="weather-widget"><br> ${props.attributes.location}<br> </div><br> ; element.innerHTML = widgetContent; */ // Fix: Proper escaping in JavaScript /* // FIXED const widgetContent = <br> <div class="weather-widget"><br> ${wp.escapeHtml(props.attributes.location)}<br> </div><br> ; element.innerHTML = wp.element.renderToString(widgetContent); */ /** * Additional Security Measures to Implement: * * 1. Input Validation: * - Always validate user input before processing * - Use WordPress sanitization functions * - Implement type checking * * 2. Output Escaping: * - esc_html() for plain text * - esc_attr() for HTML attributes * - esc_url() for URLs * - wp_kses() for allowing specific HTML tags * * 3. Form Security: * - Implement nonce checks * - Add capability checks * - Validate form submissions * * 4. API Security: * - Sanitize API responses * - Implement rate limiting * - Use wp_remote_get() instead of file_get_contents() * * 5. Database Security: * - Use prepared statements * - Sanitize data before storage * - Escape data on retrieval */ // END OF DOCUMENTATION Any updates forthcoming? Looks like this plugin may have fallen into the Abandoned bucket, which is a shame because I really like this plugin. It’s also a shame that after a month of no response from the developer, I will be forced to uninstall this plugin and replace it with an alternative. https://patchstack.com/database/wordpress/plugin/weather-atlas/vulnerability/wordpress-weather-atlas-widget-plugin-3-0-1-cross-site-scripting-xss-vulnerability v3.0.4 is fixed. Update to version 3.0.4 (or later).

Comments

14 shown
manos4wpsites 2024-11-19T10:29:00+00:00

Same issue here, WPToolkit Shows WordPress Weather Atlas Widget plugin <= 3.0.1 – Cross Site Scripting (XSS) vulnerability Cross Site Scripting (XSS) vulnerability discovered by LVT-tholv2k (Patchstack Alliance) in WordPress Plugin Weather Atlas Widget (versions <= 3.0.1) Date: 18.11.2024 | Source: https://patchstack.com/database/vulnerability/weather-atlas/wordpress-weather-atlas-widget-plugin-3-0-1-cross-site-scripting-xss-vulnerability?_a_id=110 I Disabled the plugin, I will wait a couple of days and if there is no patch or version update I will try to find where vulnerabillity is and update it myown or I will change the plugin with another one, its a pitty This is a very nice plugin.

Weather Atlas 2024-11-19T23:34:00+00:00

Thank you for the heads-up. We will most definitely try to identify the vulnerability. If/When we find the issue, we will fix it, hopefully before it is announced on the mentioned website. If it is published, we will address it promptly. Thx again

dljordaneku 2024-11-20T18:09:00+00:00

@weatheratlas thanks for the update. dj

manos4wpsites 2024-11-28T10:28:00+00:00

https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/weather-atlas/weather-atlas-widget-301-unauthenticated-cross-site-scripting

manos4wpsites 2024-11-28T11:25:00+00:00

Dear Plugin Authors, Check the file class-weather-atlas-rest-api.php (I beleive here lies the XSSVulnerability) 1.) The maybe_unserialize and unserialize Mitigation: Escape all output data using esc_html() , esc_attr() , 2.) The widget_name might not be sanitized. Mitigation: Sanitize or validate all fields to ensure they meet expected formats before returning them. maybe this <?php // Assuming your namespace and use declarations here if you have any class Weather_Atlas_REST_API { public function __construct() { add_action('rest_api_init', array($this, 'register_routes')); } public function register_routes() { register_rest_route('weather-atlas/v1', '/widgets', array( 'methods' => 'GET', 'callback' => array($this, 'get_weather_widgets'), 'permission_callback' => '__return_true' )); } public function get_weather_widgets() { global $wpdb; $prefix = 'weather_atlas_widget_'; // Prepare the query securely $query = $wpdb->prepare("SELECT * FROM {$wpdb->options} WHERE option_name LIKE %s", $prefix . '%'); $widgets = $wpdb->get_results($query); // Safely sort widgets by 'widget_name' usort($widgets, function ($a, $b) { $a_data = maybe_unserialize($a->option_value); $b_data = maybe_unserialize($b->option_value); $a_name = isset($a_data['widget_name']) ? esc_html($a_data['widget_name']) : ''; $b_name = isset($b_data['widget_name']) ? esc_html($b_data['widget_name']) : ''; return strcmp($a_name, $b_name); }); // Prepare the response with sanitized data $formatted_widgets = array(); foreach ($widgets as $widget) { $widget_data = maybe_unserialize($widget->option_value); $formatted_widgets[] = array( 'id' => esc_attr(str_replace('weather_atlas_widget_', '', $widget->option_name)), 'widget_name' => isset($widget_data['widget_name']) ? esc_html($widget_data['widget_name']) : 'Unnamed Widget' ); } return $formatted_widgets; } }

dljordaneku 2024-12-01T01:50:00+00:00

@weatheratlas any update on this? Several security sites are reporting this now. Please address this.

Weather Atlas 2024-12-03T10:37:00+00:00

@manos4wpsites Thank you for assisting with the patch. We have used your fix and updated a bit.. The old script had potential XSS issues because widget_name was returned without sanitization or escaping, allowing malicious data from the database to be exposed in the API response. This was resolved by sanitizing with sanitize_text_field() and escaping with esc_html() to ensure safe output. Commit Comments – Fixed XSS vulnerability by sanitizing widget_name with sanitize_text_field() during processing. – Escaped API output using esc_html() to ensure safe rendering of data. – Improved data handling with maybe_unserialize() to safely process serialized database values. – Enhanced API security by validating and escaping user-controlled data before returning responses. Fingers crossed this solved potential XSS issue

wpo9256 2024-12-08T08:21:00+00:00

Hello, unfortunately the problem has not yet been resolved in version 3.0.2. A security risk is still detected: https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/weather-atlas/weather-atlas-widget-301-unauthenticated-cross-site-scripting

Ken Sim 2024-12-18T17:02:00+00:00

You marked this issue as resolved, but it seems this XSS vulnerability remains even on this 3.0.2 version. Do you have any plans to address this? https://patchstack.com/database/wordpress/plugin/weather-atlas/vulnerability/wordpress-weather-atlas-widget-plugin-3-0-1-cross-site-scripting-xss-vulnerability

Peter 2024-12-19T15:07:00+00:00

I am having same issue on the latest copy of the plugin version 3.0.2 see screemshot attached https://tinyurl.com/26qxna65

Peter 2024-12-19T15:31:00+00:00

Hi Developer could you please check below and see if this can help you apply the necessary fixes to these vulnerabilities please. I have listed potential issues and their fixes. <?php /** * Weather Atlas Widget Security Fixes Documentation * Version: 3.0.2 * * This file documents the XSS vulnerabilities and their fixes. * DO NOT USE THIS FILE IN PRODUCTION - FOR DOCUMENTATION PURPOSES ONLY */ /** * 1. public/partials/weather-atlas-public-display.php Fixes * Problem: Unescaped output in widget display */ // Vulnerable code example: $widget_title = $instance['title']; echo $widget_title; // VULNERABLE // Fix: Proper escaping $widget_title = $instance['title']; echo esc_html($widget_title); // FIXED // Location display fix // Vulnerable: echo $location_name; // VULNERABLE // Fix: echo esc_html($location_name); // FIXED /** * 2. includes/class-weather-atlas.php Fixes * Problem: Unescaped widget output in widget() method */ // Vulnerable code example: $city_selector = $instance['city_selector']; $country_selector = $instance['country_selector']; echo '<div class="weather-atlas-wrapper" data-city="' . $city_selector . '" data-country="' . $country_selector . '">'; // VULNERABLE // Fix: Proper escaping and sanitization $city_selector = absint($instance['city_selector']); $country_selector = absint($instance['country_selector']); echo '<div class="weather-atlas-wrapper" data-city="' . esc_attr($city_selector) . '" data-country="' . esc_attr($country_selector) . '">'; // FIXED /** * 3. admin/weather-atlas-settings.php Fixes * Problem: Insufficient input validation in admin settings */ // Vulnerable code example: $api_settings = $_POST['weather_atlas_settings']; // VULNERABLE update_option('weather_atlas_settings', $api_settings); // Fix: Proper validation and sanitization if (!isset($_POST['weather_atlas_nonce']) || !wp_verify_nonce($_POST['weather_atlas_nonce'], 'weather_atlas_settings')) { wp_die('Security check failed'); } $api_settings = array( 'city_name' => sanitize_text_field($_POST['weather_atlas_settings']['city_name']), 'api_key' => sanitize_text_field($_POST['weather_atlas_settings']['api_key']), 'layout' => in_array($_POST['weather_atlas_settings']['layout'], array('horizontal', 'vertical')) ? $_POST['weather_atlas_settings']['layout'] : 'horizontal', 'temperature_unit' => in_array($_POST['weather_atlas_settings']['temperature_unit'], array('C', 'F')) ? $_POST['weather_atlas_settings']['temperature_unit'] : 'C' ); update_option('weather_atlas_settings', $api_settings); // FIXED /** * 4. block/block.js Fixes (JavaScript) * Problem: Potential XSS in Gutenberg block rendering * Note: While this is JavaScript, showing the vulnerable parts and fixes */ // Vulnerable code example: /* // VULNERABLE const widgetContent = <br> <div class="weather-widget"><br> ${props.attributes.location}<br> </div><br> ; element.innerHTML = widgetContent; */ // Fix: Proper escaping in JavaScript /* // FIXED const widgetContent = <br> <div class="weather-widget"><br>...

djenk 2025-01-13T15:46:00+00:00

Any updates forthcoming?

Ken Sim 2025-01-13T17:53:00+00:00

Looks like this plugin may have fallen into the Abandoned bucket, which is a shame because I really like this plugin. It’s also a shame that after a month of no response from the developer, I will be forced to uninstall this plugin and replace it with an alternative.

Weather Atlas 2025-07-07T09:43:00+00:00

https://patchstack.com/database/wordpress/plugin/weather-atlas/vulnerability/wordpress-weather-atlas-widget-plugin-3-0-1-cross-site-scripting-xss-vulnerability v3.0.4 is fixed. Update to version 3.0.4 (or later).