{"id":2781,"date":"2022-03-31T11:22:03","date_gmt":"2022-03-31T10:22:03","guid":{"rendered":"https:\/\/blog.outscale.com\/?p=2781"},"modified":"2022-03-31T11:47:03","modified_gmt":"2022-03-31T10:47:03","slug":"dealing-with-a-0-day-vulnerability-behind-the-scenes","status":"publish","type":"post","link":"https:\/\/blog.outscale.com\/en\/dealing-with-a-0-day-vulnerability-behind-the-scenes\/","title":{"rendered":"Dealing with a 0-Day Vulnerability: Behind the Scenes"},"content":{"rendered":"<p><strong>Learn how 3DS OUTSCALE runs its Bug Bounty program and go behind the scenes of a recent CVE (Common Vulnerabilities and Exposures) publication.<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Bug Bounty at 3DS OUTSCALE<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">3DS OUTSCALE, as an IaaS Cloud provider, is looking for any security-oriented feedback. For this purpose, we opened <a href=\"https:\/\/yeswehack.com\/programs\/outscale\" target=\"_blank\" rel=\"noopener\">our Bug Bounty program on the YesWeHack platform<\/a> in 2016. Security researchers are encouraged to hunt for bugs on our public IaaS platform, especially on the API and the Cockpit web interface.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We want them to find any ways of bypassing segregation measures, or anything impacting their customer experience or the infrastructure itself! To make it possible, we provide security researchers access to a Cloud account that will allow them to test our infrastructure as if they were regular customers. With limited but sufficient quotas, they may spawn private LANs, virtual machines and manage CPUs, RAM, security groups, etc.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Practical Case: Vulnerability in a WordPress Plugin<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">In 2021, a security researcher (<\/span><a href=\"https:\/\/github.com\/0xspade\" target=\"_blank\" rel=\"noopener\">0xspade<\/a>) submitted a report on our YesWeHack program. This report pointed out an endpoint (a web address at which users can send requests to perform specific actions) on our official website that was not properly escaping input data. The researcher proved that sending some altered data to this endpoint could lead to local code execution. In short, we were facing an XSS vulnerability.<\/p>\n<p><span style=\"font-weight: 400;\">At 3DS OUTSCALE, we use WordPress to power some of our official websites. We had to conduct an investigation to find out which part of the source code was vulnerable, because WordPress works with plugins, which all have their own logic. This investigation led us to apply a hotfix on our servers while waiting for an official patch from the editor. The technical details can be found in the last part of this article.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">After a first unsuccessful contact with the plugin editor, we decided to contact <a href=\"https:\/\/www.ssi.gouv.fr\/\" target=\"_blank\" rel=\"noopener\">ANSSI<\/a> (the National Cybersecurity Agency of France) as well as <a href=\"https:\/\/wpscan.com\/\" target=\"_blank\" rel=\"noopener\">WPScan<\/a>, which is a French <a href=\"https:\/\/www.cve.org\/ProgramOrganization\/CNAs\" target=\"_blank\" rel=\"noopener\">CNA<\/a> (CVE Numbering Authority) specialized in vulnerabilities that can be found within the WordPress ecosystem.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">WPScan notably offers a vulnerability scanner as a plugin\/CLI, and maintains a database of all vulnerabilities affecting WordPress and its plugins. They were therefore the right contact to help us move forward, acting as our intermediary between the editor and the marketplace during the whole process.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">They helped us make the editor realize the severity of the vulnerability and gave them some time to release patches that fixed the problem. We methodically followed the steps and carried out the process successfully.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ultimately, two CVEs were created regarding this issue. They were recently published under the references <a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2021-24814\" target=\"_blank\" rel=\"noopener\">CVE-2021-24814<\/a> and <a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2022-0220\" target=\"_blank\" rel=\"noopener\">CVE-2022-0220<\/a>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Official advisories are available here:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/wpscan.com\/vulnerability\/94ab34f6-86a9-4e14-bf86-26ff6cb4383e\" target=\"_blank\" rel=\"noopener\">https:\/\/wpscan.com\/vulnerability\/94ab34f6-86a9-4e14-bf86-26ff6cb4383e<\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/wpscan.com\/vulnerability\/a91a01b9-7e36-4280-bc50-f6cff3e66059\" target=\"_blank\" rel=\"noopener\">https:\/\/wpscan.com\/vulnerability\/a91a01b9-7e36-4280-bc50-f6cff3e66059<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Technical Analysis<\/strong><\/p>\n<p><strong># Situation<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">The issue was in the <b>wordpress-gdpr<\/b> plugin (version 1.9.25). Used for compliance with GDPR requirements in the EU, it asks the user&#8217;s consent for the use of cookies.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Each time a page is loaded on a website using this plugin, the latter performs an asynchronous HTTP request (AJAX) to this specific endpoint: <i>\/wp-admin\/admin-ajax.php<\/i>. The request is meant to retrieve the user\u2019s choice regarding the use of cookies.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In order for these calls to be made by every visitor, logged in or not, the developers have been using a non-authenticated AJAX call.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The problem was that the function associated with this AJAX call (<i>check_privacy_settings<\/i>) returned JSON data, but with a wrong Content-Type (<i>text\/html<\/i>) and including non-sanitized input passed during the request.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">When the endpoint is typically used making AJAX calls from the client to the backend, there is no problem because the XHR object handles the response and converts it to whatever is suitable (JSON object). But if we create a malicious request (i.e., with malicious HTML &amp; JavaScript user input) that makes a browser go to this endpoint as if it was a normal browsing page, then the browser is unable to interpret this as JSON data, because of the lack of <i>application\/json<\/i> Content-Type. Consequently, it will display an HTML page with the malicious user input interpreted.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><strong># Exploration<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">First, how does this plugin work?\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">When a visitor arrives on a website using this plugin, an AJAX call is made to retrieve some information:<\/span><\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-2782 aligncenter\" src=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/ajax-call1-300x108.png\" alt=\"\" width=\"500\" height=\"180\" srcset=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/ajax-call1-300x108.png 300w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/ajax-call1-1024x370.png 1024w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/ajax-call1-768x277.png 768w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/ajax-call1-1170x423.png 1170w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/ajax-call1-585x211.png 585w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/ajax-call1.png 1362w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/p>\n<p style=\"text-align: center; font-weight: 400;\"><b>Figure 1<\/b> &#8211; AJAX call by the vulnerable plugin<\/p>\n<p><span style=\"font-weight: 400;\">Two parameters are sent along with the request, which is supposed to trigger a <i>check_privacy_settings<\/i> function. This function is actually fired up by a <i>wp_ajax_nopriv_<\/i> hook. For those who are not familiar with the WordPress universe, it is a custom AJAX endpoint created by the plugin&#8217;s developers and reachable without authentication.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If we look at the function&#8217;s code, without going into details, we basically have something like this:<\/span><\/p>\n<p><img decoding=\"async\" class=\" wp-image-2784 aligncenter\" src=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/check_privacy_settings-function1-300x148.png\" alt=\"\" width=\"488\" height=\"241\" srcset=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/check_privacy_settings-function1-300x148.png 300w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/check_privacy_settings-function1-1024x504.png 1024w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/check_privacy_settings-function1-768x378.png 768w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/check_privacy_settings-function1-1170x575.png 1170w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/check_privacy_settings-function1-585x288.png 585w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/check_privacy_settings-function1.png 1208w\" sizes=\"(max-width: 488px) 100vw, 488px\" \/><\/p>\n<p style=\"text-align: center; font-weight: 400;\"><b>Figure 2<\/b> &#8211; simplified <i>check_privacy_settings<\/i> function&#8217;s code<\/p>\n<p><span style=\"font-weight: 400;\">We can see that a part of the input (the <code>$setting<\/code> variable corresponding to the values of the <code>$settings<\/code> associative array) is reinjected into the function&#8217;s output, without sanitization.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Let&#8217;s play with it.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><strong># Disillusion<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">The scenario on which we will base our thinking is the following:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">An attacker creates a malicious webpage (which has a safe-looking URL, or at least not suspicious) and sends the link to the victim;<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">The malicious page redirects the victim&#8217;s browser to the vulnerable endpoint by passing HTML input as POST parameters;<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Once redirected to the vulnerable endpoint, the victim\u2019s browser executes the payload.<\/li>\n<\/ul>\n<p><b style=\"text-align: center;\"><img decoding=\"async\" class=\"wp-image-2788 aligncenter\" src=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1-300x129.png\" alt=\"\" width=\"502\" height=\"216\" srcset=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1-300x129.png 300w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1-1024x440.png 1024w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1-768x330.png 768w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1-1536x660.png 1536w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1-1170x503.png 1170w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1-585x251.png 585w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-maliciouspage1.png 1676w\" sizes=\"(max-width: 502px) 100vw, 502px\" \/><\/b><\/p>\n<p style=\"text-align: center; font-weight: 400;\"><b>Figure 3<\/b> &#8211; Try #1: The malicious page<\/p>\n<p><span style=\"font-weight: 400;\">In this example, we simply create a form with the same parameters as in the above screenshot, and we automatically submit it via JavaScript. An HTML payload is included in the value of one of the parameters. When browsing this page, we see a <i>Loading&#8230;<\/i> text, then we are automatically redirected to <i>hxxps:\/\/vuln-wp.xyz\/wp-admin\/admin-ajax.php<\/i> and we get the following content:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2786 aligncenter\" src=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1-300x48.png\" alt=\"\" width=\"450\" height=\"72\" srcset=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1-300x48.png 300w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1-1024x162.png 1024w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1-768x122.png 768w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1-1536x244.png 1536w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1-1170x186.png 1170w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1-585x93.png 585w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-1-endpoint1.png 1652w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><\/p>\n<p style=\"text-align: center; font-weight: 400;\"><b>Figure 4<\/b> &#8211; Try #1: The vulnerable endpoint<\/p>\n<p><span style=\"font-weight: 400;\">As you can see, the <code>&lt;h1&gt;<\/code> tag is interpreted by the browser because the Content-Type of the response is set to <i>text\/html<\/i> (this is the default Content-Type returned by <i>admin-ajax.php<\/i>).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">But we also have some escaped characters. That is because of the <code>json_encode<\/code> function which escapes the data to make it JSON valid. This is why <code>\"<\/code>, <code>'<\/code>, <code>\/<\/code>, and <code>\\<\/code> are being escaped.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">What we have to understand is that it won&#8217;t be possible to execute code with <code>&lt;script&gt;&lt;\/script&gt;<\/code> because the closing tag is mandatory for the JavaScript code to be interpreted. Knowing that, how can we produce a working exploit?<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><strong># Motivation<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">As we want the exploit to be transparent to the victim, we are looking for a way to automatically execute JavaScript code inside a page, without any user interaction needed (click or anything else).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We know that the use of <code>&lt;script&gt;<\/code> tags is not possible. Another option would be to use <a href=\"https:\/\/www.w3schools.com\/tags\/ref_eventattributes.asp\" target=\"_blank\" rel=\"noopener\">HTML events<\/a>. HTML elements can trigger JavaScript code under some circumstances (e.g. element is clicked, mouse is moved over, image is loaded, window is resized, etc.). The large majority of these events require an interaction between the user and the webpage. Except for the <i>onload<\/i> event, which is fired up once an element is loaded (image, body, etc.).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The <i>onload<\/i> event works well with <code>&lt;img&gt;<\/code> and <code>&lt;body&gt;<\/code> tags. Moreover, <code>&lt;img&gt;<\/code> is a void element and HTML does not require to close it, and the <code>&lt;body&gt;<\/code>&#8216;s closing tag is also not mandatory for the browser to interpret it.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We are now able to execute JavaScript code automatically. We can submit a value without the use of quotes to an HTML attribute and, in this case, we must do so:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2790 aligncenter\" src=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-maliciouspage1-300x122.png\" alt=\"\" width=\"490\" height=\"200\" srcset=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-maliciouspage1-300x122.png 300w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-maliciouspage1-1024x415.png 1024w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-maliciouspage1-1536x623.png 1536w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-maliciouspage1-1170x474.png 1170w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-maliciouspage1-585x237.png 585w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-maliciouspage1.png 1682w\" sizes=\"(max-width: 490px) 100vw, 490px\" \/><\/p>\n<p style=\"text-align: center; font-weight: 400;\"><b>Figure 5<\/b> &#8211; Try #2: The malicious page<\/p>\n<p><span style=\"font-weight: 400;\">And the resulted behavior:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2792 aligncenter\" src=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-endpoint1-300x95.png\" alt=\"\" width=\"442\" height=\"140\" srcset=\"https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-endpoint1-300x95.png 300w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-endpoint1-768x244.png 768w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-endpoint1-585x186.png 585w, https:\/\/blog.outscale.com\/wp-content\/uploads\/2022\/03\/poc-2-endpoint1.png 926w\" sizes=\"(max-width: 442px) 100vw, 442px\" \/><\/p>\n<p style=\"text-align: center; font-weight: 400;\"><b>Figure 6<\/b> &#8211; Try #2: The vulnerable endpoint<\/p>\n<p><span style=\"font-weight: 400;\">However, we are somewhat limited in the code we can run due to escaped characters, as seen earlier. Thus we need to find workarounds.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><strong># Annihilation<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">We are forced to remove all whitespaces in the JavaScript payload because the browser will cut the script if it encounters a whitespace, thinking that it acts as a separator between the <i>onload<\/i> value and the next attribute for this HTML element (this is because we didn&#8217;t surround the <i>onload<\/i> content with quotes).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Furthermore, if we want to use variables inside the payload, we have to declare them without the <code>var<\/code> keyword. This technique is valid and won&#8217;t trigger a <i>ReferenceError<\/i> as long as we don&#8217;t use <i>strict mode<\/i> (and we won&#8217;t).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For <i>return<\/i> statements, we may use <code>return(value)<\/code> instead of <code>return[space]value<\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">And remember, we can&#8217;t use single and double quotes! Meaning we won&#8217;t be able to use standard strings in the script we write for the <i>onload<\/i> event. We have two options to work around this problem:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Using <i>backticks<\/i> (<code>`<\/code>) instead of quotes given that <a href=\"https:\/\/www.w3schools.com\/js\/js_string_templates.asp\" target=\"_blank\" rel=\"noopener\">template literals<\/a> can be used in the same way as strings;<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Using an array of <i>charcodes<\/i> without spaces (<code>[104,101,108,108,111]<\/code>) and converting it into a string with a function such as the following:<\/li>\n<\/ul>\n<pre style=\"font-size: 0.8em; background: #eee;\">\/\/ Function.prototype.apply() :\r\nString.fromCharCode.apply(null, charcodes)\r\n\/\/ OR Spread syntax :\r\nString.fromCharCode(...charcodes)<\/pre>\n<p><span style=\"font-weight: 400;\">Thanks to these little tweaks, we are able to make the victim&#8217;s browser execute whatever we want with, for instance, something like <code>eval(atob(`base64encodedPayload`))<\/code>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Now, imagine the victim is an administrator of the targeted WordPress, with a valid session cookie (i.e., they are already logged in as admin on the site). Because the admin panel is on the same domain as this vulnerable endpoint, AJAX calls are possible and not restricted (i.e., we don&#8217;t need explicit <a href=\"https:\/\/www.w3.org\/wiki\/CORS#Use_Cases\" target=\"_blank\" rel=\"noopener\">CORS<\/a> permissions), and <i>iframe<\/i> manipulation is not restricted by the <a href=\"https:\/\/www.w3.org\/Security\/wiki\/Same_Origin_Policy\" target=\"_blank\" rel=\"noopener\"><i>same-origin policy<\/i><\/a>. We may then perform any action we want on the admin panel on behalf of the administrator (user creation, article edition, plugin installation, etc.), and even upload a <i>webshell<\/i> to keep full access to the WordPress in the future and try lateral movements or privilege escalation.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><strong># Resolution<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">The easiest, and fastest, way to protect against this vulnerability is to adapt the Content-Type each time a function returns JSON data.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The plugin&#8217;s editor first decided to add a <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_verify_nonce\/\" target=\"_blank\" rel=\"noopener\"><i>nonce<\/i> check<\/a> for this request in their 1.9.26 patch. Unfortunately, this wasn&#8217;t enough since it didn&#8217;t fix the XSS vulnerability but only slightly reduced the severity. In fact, a <i>nonce<\/i> has a default validity of 24 hours (twice its default 12 hours lifetime). However, if it&#8217;s compromised, the admin may still be exposed to an attack during this time. But above all, the problem is that the nonce is the same for all unauthenticated visitors. All four variables used to <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_create_nonce\/\" target=\"_blank\" rel=\"noopener\">create the nonce<\/a> (<code>$uid<\/code>, <code>$token<\/code>, <code>$action<\/code>, <code>$i<\/code>) have the same value if the user is not logged in. This means that the endpoint is still vulnerable to phishing issues. One could redirect an unauthenticated victim to this page and execute JavaScript code.\u00a0 For example, it would be possible to create a fake Login page to steal the admin&#8217;s credentials. The only constraint for the attacker is to update the nonce in their malicious code once a day.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Eventually the editor added a <i>casting<\/i> to integer on to the input data (the famous <code>$setting<\/code> variable, since the client is supposed to send a number) in the <strong>version 1.9.27<\/strong>. Now a string payload is converted to <i>int(0)<\/i> and there is no more XSS. As there are one partial patch and one complete patch, two distinct CVEs have been opened.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">If you are a cybersecurity researcher yourself and would like to discover the Cloud, you are welcome to join <a href=\"https:\/\/yeswehack.com\/programs\/outscale\" target=\"_blank\" rel=\"noopener\">our bug bounty program<\/a>! You just have to create a YesWeHack account and contact us so that we can provide you with free access to the platform. Hope to see you soon \ud83d\ude09<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how 3DS OUTSCALE runs its Bug Bounty program and go behind the scenes of a&hellip;<\/p>\n","protected":false},"author":9,"featured_media":2798,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[34],"tags":[],"class_list":["post-2781","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/posts\/2781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/comments?post=2781"}],"version-history":[{"count":9,"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/posts\/2781\/revisions"}],"predecessor-version":[{"id":2805,"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/posts\/2781\/revisions\/2805"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/media\/2798"}],"wp:attachment":[{"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/media?parent=2781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/categories?post=2781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.outscale.com\/en\/wp-json\/wp\/v2\/tags?post=2781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}