{"id":23619,"date":"2023-12-15T15:00:48","date_gmt":"2023-12-15T23:00:48","guid":{"rendered":"http:\/\/www.palada.net\/index.php\/2023\/12\/15\/news-17349\/"},"modified":"2023-12-15T15:00:48","modified_gmt":"2023-12-15T23:00:48","slug":"news-17349","status":"publish","type":"post","link":"http:\/\/www.palada.net\/index.php\/2023\/12\/15\/news-17349\/","title":{"rendered":"Patching Perforce perforations: Critical RCE vulnerability discovered in Perforce Helix Core Server"},"content":{"rendered":"<p><strong>Credit to Author: Microsoft Threat Intelligence| Date: Fri, 15 Dec 2023 17:00:00 +0000<\/strong><\/p>\n<p>Microsoft discovered, responsibly disclosed, and helped remediate four vulnerabilities that could be remotely exploited by unauthenticated attackers in <a href=\"https:\/\/www.perforce.com\/downloads\/helix-core-p4d\" target=\"_blank\" rel=\"noreferrer noopener\">Perforce Helix Core Server<\/a> (\u201cPerforce Server\u201d), a source code management platform largely used in the <a href=\"https:\/\/www.perforce.com\/solutions\/game-development\" target=\"_blank\" rel=\"noreferrer noopener\">videogame industry<\/a> and by multiple organizations spanning government, military, technology, retail, <a href=\"https:\/\/www.perforce.com\/customers?field_product_line_target_id=737\" target=\"_blank\" rel=\"noreferrer noopener\">and more<\/a>. Perforce Server customers are strongly urged to update to version 2023.1\/2513900, available here: <a href=\"https:\/\/www.perforce.com\/downloads\/helix-core-p4d\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.perforce.com\/downloads\/helix-core-p4d<\/a>. The most critical of the four vulnerabilities has a <a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:C\/C:H\/I:H\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">CVSS score of 10.0<\/a> because it allows for arbitrary remote code execution as <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/services\/localsystem-account\"><em>LocalSystem<\/em><\/a> by unauthenticated remote attackers. An attacker with system-level remote code execution access to a source code management platform can insert backdoors into software products, exfiltrate source code and other intellectual property, and pivot to other sensitive enterprise infrastructure. While Microsoft has not observed evidence of in-the-wild exploitation for any of these vulnerabilities, exploitation of the most critical vulnerability could give unauthenticated attackers complete control over unpatched systems and connected infrastructure.<\/p>\n<p>Due to the way Microsoft\u2019s deployed Perforce Servers were configured, at no point were any of Microsoft\u2019s internet-facing servers vulnerable to this critical vulnerability. No consumer, customer, or partner data was at risk or leaked.<\/p>\n<p>Microsoft\u2019s commitment to gaming and community <a href=\"https:\/\/blogs.microsoft.com\/on-the-issues\/2023\/11\/02\/secure-future-initiative-sfi-cybersecurity-cyberattacks\/\">security<\/a> is paramount, and we worked closely with Perforce to report these vulnerabilities and drive remediation. We thank Perforce and are grateful for their team\u2019s quick response in developing and releasing patches for these vulnerabilities.<\/p>\n<p>While the three high severity vulnerabilities could be used to launch attacks such as a denial of service (DoS) against vulnerable systems, vulnerabilities with a CVSS score of 10.0 have the most severe potential impact that can extend beyond the vulnerable component, introducing a risk to software supply chains. The discovered vulnerabilities are summarized in the table below:<\/p>\n<figure class=\"wp-block-table table\">\n<table class=\"has-fixed-layout\">\n<tbody>\n<tr>\n<td><strong>CVE ID<\/strong><\/td>\n<td><strong>CVSS Score<\/strong><\/td>\n<td><strong>CWE ID<\/strong><\/td>\n<td><strong>Vulnerability<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-5759\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-5759<\/a><\/strong><\/td>\n<td><a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:N\/I:N\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">7.5<\/a><\/td>\n<td><a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/405.html\" target=\"_blank\" rel=\"noreferrer noopener\">CWE-405: Asymmetric Resource Consumption (Amplification)<\/a><\/td>\n<td>Unauthenticated DoS via RPC Header Abuse<\/td>\n<\/tr>\n<tr>\n<td><strong><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45849\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-45849<\/a><\/strong><\/td>\n<td><a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:C\/C:H\/I:H\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">10.0<\/a><\/td>\n<td><a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/306.html\" target=\"_blank\" rel=\"noreferrer noopener\">CWE-306: Missing Authentication for Critical Function<\/a><\/td>\n<td>Unauthenticated Remote Code Execution as LocalSystem via user-bgtask RPC Command<\/td>\n<\/tr>\n<tr>\n<td><strong><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-35767\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-35767<\/a><\/strong><\/td>\n<td><a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:N\/I:N\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">7.5<\/a><\/td>\n<td><a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/306.html\" target=\"_blank\" rel=\"noreferrer noopener\">CWE-306: Missing Authentication for Critical Function<\/a><\/td>\n<td>Unauthenticated DoS via rmt-Shutdown RPC Command<\/td>\n<\/tr>\n<tr>\n<td><strong><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45319\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-45319<\/a><\/strong><\/td>\n<td><a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:N\/I:N\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">7.5<\/a><\/td>\n<td><a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/252.html\" target=\"_blank\" rel=\"noreferrer noopener\">CWE-252: Unchecked Return Value<\/a><\/td>\n<td>Unauthenticated DoS via rmt-UpdtFovrCommit RPC Command<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Perforce Server listens on TCP port 1666 by default, though server administrators will often change this port number to hide from scanners or to host Perforce Server via TLS. Microsoft scanned the internet in November 2023 for TCP port 1666 with a custom Perforce Server network signature and found over 1,000 exposed Perforce Server instances.<\/p>\n<p>In this blog, we detail how we discovered each of the vulnerabilities and highlight the potential impact if exploited. Alongside applying Perforce\u2019s patches, we also include additional mitigation and protection guidance for customers to minimize the risk of exploitation. Lastly, we\u2019re sharing this information with the broader community to drive awareness to further improve protections across the security ecosystem, and to emphasize the importance of responsible disclosure and collaboration to secure platforms and devices.<\/p>\n<h2 class=\"wp-block-heading\">Discovering the vulnerabilities<\/h2>\n<p>To keep <a href=\"https:\/\/www.xbox.com\/xbox-game-studios\" target=\"_blank\" rel=\"noreferrer noopener\">Microsoft\u2019s game development studios<\/a> and their customers safe, we recently conducted an application security review of Perforce Server, the source code management platform relied on by most of our studios. For our security review, we analyzed Perforce Server version 2023.1.244.2900 and installed it on Windows 11 22H2. We used Perforce Server\u2019s default installation options, which resulted <a href=\"https:\/\/portal.perforce.com\/s\/article\/3925\" target=\"_blank\" rel=\"noreferrer noopener\">by-design<\/a> in the Perforce Server service running as <em>LocalSystem<\/em>:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-1.-Perforce-Server-runs-as-LocalSystem.webp\" alt=\"Screenshot of Perforce Server running as LocalSystem\" class=\"wp-image-132786 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-1.-Perforce-Server-runs-as-LocalSystem.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 1. Perforce Server runs as LocalSystem<\/em><\/figcaption><\/figure>\n<h3 class=\"wp-block-heading\">Recovering debug symbols<\/h3>\n<p>In 2014, Perforce <a href=\"https:\/\/www.perforce.com\/press-releases\/perforce-open-sources-popular-version-control-tools\" target=\"_blank\" rel=\"noreferrer noopener\">open-sourced<\/a> the code for their CLI Perforce Client, and informed users we can download the code from the <em>bin.tools<\/em> subdirectory of any given <a href=\"https:\/\/ftp.perforce.com\/perforce\/\" target=\"_blank\" rel=\"noreferrer noopener\">release<\/a>. While having any source code is invaluable for application security vulnerability research purposes, this source code is specific to the client, not the server. The latter is only distributed in compiled binary form.<\/p>\n<p>The binaries that are installed by Perforce Server\u2019s installer have their <a href=\"\/\/learn.microsoft.com\/windows\/win32\/dxtecharts\/debugging-with-symbols\" target=\"_blank\" rel=\"noreferrer noopener\">debug symbols<\/a> stripped (removed from the distributed executable images), which makes it harder to understand the disassembled code during static analysis. To aid our review, we attempted to recover these debug symbols.<\/p>\n<h4 class=\"wp-block-heading\">Discovering debug symbols<\/h4>\n<p>Sometimes applications offer software development kits (SDKs) that can be mined for debug symbol data. In the case of Perforce Server, Perforce offers a \u201cC\/C++ API\u201d package for the Windows (x64) platform that comes in the form of a .zip file containing three directories: <em>include<\/em>, <em>lib<\/em>, and <em>sample<\/em>. The <em>lib<\/em> directory is especially interesting for us, as it contains about 400 MB of .lib files:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-2.-SDKs-.lib-files.webp\" alt=\"Screenshot of SDK's .lib files\" class=\"wp-image-132787 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-2.-SDKs-.lib-files.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 2. SDK&#8217;s .lib files<\/em><\/figcaption><\/figure>\n<p>Like .exe files, .lib files are <a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/debug\/pe-format\" target=\"_blank\" rel=\"noreferrer noopener\">COFF<\/a> files that can contain debug symbols. By using <a href=\"https:\/\/learn.microsoft.com\/cpp\/build\/reference\/dumpbin-reference\"><em>dumpbin.exe<\/em><\/a><em> \/symbols <\/em>to inspect each .lib file, we found that the nine .lib files in the package contain a total of 1,251,756 debug symbol entries.<\/p>\n<p>To understand why this is useful to us, let us consider an approximation of how .exe and .lib files are built:<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-3.-Compilation-process-1024x650.webp\" alt=\"Compilation process diagram depicting how SDK .obj files and server-specific .obj files link without debug symbols to p4s.exe. \" class=\"wp-image-132788 webp-format\" srcset=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-3.-Compilation-process-1024x650.webp 1024w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-3.-Compilation-process-300x191.webp 300w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-3.-Compilation-process-768x488.webp 768w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-3.-Compilation-process-1536x975.webp 1536w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-3.-Compilation-process-2048x1301.webp 2048w\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-3.-Compilation-process-1024x650.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 3. Compilation process<\/em><\/figcaption><\/figure>\n<p>In the diagram above, we can see that the SDK .obj files were linked along with server-specific .obj files to create Perforce Server\u2019s <a href=\"https:\/\/www.perforce.com\/manuals\/p4sag\/Content\/P4SAG\/install.windows.services.html\" target=\"_blank\" rel=\"noreferrer noopener\"><em>p4s.exe<\/em> (\u201cPerforce Service\u201d)<\/a> file. During that linking process, the debug symbols were stripped. However, the same SDK .obj files had their debug symbols <em>retained<\/em> when linked into the SDK .lib files. Since the .lib files contain debug symbols, we can match each compiled SDK function in each .lib file to its SDK function name. If we can then find those same compiled SDK functions in Perforce Server\u2019s .exe and .dll files, we can map the SDK function names to those functions as well, thus simplifying our analysis of the <em>p4s.exe<\/em> file.<\/p>\n<p>To begin, we must first determine which SDK package to use for our analysis. If we look at the <a href=\"https:\/\/ftp.perforce.com\/perforce\/r23.1\/bin.ntx64\/\" target=\"_blank\" rel=\"noreferrer noopener\">containing directory<\/a> for the .zip file downloaded from the \u201cC\/C++ API\u201d package, we see it contains 144 <em>p4api<\/em> SDK packages:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-4.-SDK-packages.webp\" alt=\"Screenshot of several p4api SDK packages\" class=\"wp-image-132789 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-4.-SDK-packages.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 4. SDK packages<\/em><\/figcaption><\/figure>\n<p>The reason we see 144 packages listed is that there is every combination of the following:<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-5.-Package-combinations-1024x385.webp\" alt=\"Package combinations multiplying nine possible compiler values, two possible values for linking, two possible values for build type, and four possible values for OpenSSL version.\" class=\"wp-image-132790 webp-format\" srcset=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-5.-Package-combinations-1024x385.webp 1024w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-5.-Package-combinations-300x113.webp 300w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-5.-Package-combinations-768x289.webp 768w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-5.-Package-combinations.webp 1476w\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-5.-Package-combinations-1024x385.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 5. Package combinations<\/em><\/figcaption><\/figure>\n<p>That\u2019s nine possible values for compiler, two possible values for linking, two possible values for build type, and four possible values for OpenSSL version. In other words, multiplying those four values together leads us to 144 possible combinations. To map named functions from the SDK\u2019s .lib files to Perforce Server\u2019s <em>p4s.exe<\/em> file, we\u2019ll need to choose the correct SDK package, since, for example, a function compiled with Visual Studio 2005 may look very different from the same function compiled with Visual Studio 2022.<\/p>\n<p>So how do we know which compiler, linker option, build type, and OpenSSL version were used for our installed distribution of Perforce Server? We don\u2019t. We could make some educated guesses and examine artifacts such as the binaries\u2019 <a href=\"https:\/\/www.virusbulletin.com\/virusbulletin\/2020\/01\/vb2019-paper-rich-headers-leveraging-mysterious-artifact-pe-format\/\" target=\"_blank\" rel=\"noreferrer noopener\">Rich Headers<\/a> to determine the right combination, but instead we chose to use automation to test all possible combinations. (Note that \u201cRich Headers\u201d is a colloquial term used in the industry, not a Microsoft-official name for this structure.)<\/p>\n<h4 class=\"wp-block-heading\">Finding the right set of debug symbols<\/h4>\n<p>After downloading all of the statically linked <em>p4api<\/em> archives from Perforce\u2019s website, we used <a href=\"https:\/\/hex-rays.com\/ida-pro\/\" target=\"_blank\" rel=\"noreferrer noopener\">IDA Pro&#8217;s<\/a> <a href=\"https:\/\/hex-rays.com\/products\/ida\/tech\/flirt\/in_depth\/\">F.L.I.R.T. technology<\/a> to create signatures for each Perforce Server SDK package. To do so, we automated the following steps:<\/p>\n<ol type=\"1\">\n<li>Use <em>pcf.exe<\/em> (\u201cparsecoff\u201d) from IDA Pro\u2019s Fast Library Acquisition for Identification and Recognition (FLAIR) SDK to create .pat (\u201cpattern\u201d) files for each Perforce Server SDK package\u2019s .lib file.<\/li>\n<li>Use <em>sigmake.exe<\/em> from the FLAIR SDK to create a .sig (\u201csignature\u201d) file for all the .pat files from each given Perforce Server SDK package.<\/li>\n<li>Use <em>zipsig.exe<\/em> from the FLAIR SDK to compress each .sig file.<\/li>\n<li>Disassemble Perforce Server\u2019s <em>p4s.exe<\/em> file with IDA Pro and save the resulting .idb (\u201cIDA database\u201d) file.<\/li>\n<li>For each .sig file, open the .idb file, <a href=\"https:\/\/www.hex-rays.com\/products\/ida\/support\/idapython_docs\/ida_funcs.html#ida_funcs.plan_to_apply_idasgn\" target=\"_blank\" rel=\"noreferrer noopener\">apply the .sig file<\/a>, <a href=\"https:\/\/www.hex-rays.com\/products\/ida\/support\/idapython_docs\/ida_funcs.html#ida_funcs.get_idasgn_desc_with_matches\" target=\"_blank\" rel=\"noreferrer noopener\">count the number of .sig file function matches<\/a>, and close the .idb file without saving the modifications.<\/li>\n<li>Rank the number of function matches for each .sig file.<\/li>\n<\/ol>\n<p>After following the process above, we found the debug symbols from <em>p4api_vs2017_static_openssl1.1.1.zip<\/em> had the most function matches in <em>p4s.exe<\/em>:<\/p>\n<figure class=\"wp-block-table table\">\n<table>\n<tbody>\n<tr>\n<td><strong>Function<br \/>Matches<\/strong><\/td>\n<td><strong>Signature File<\/strong><\/td>\n<\/tr>\n<tr>\n<td>11,928<\/td>\n<td>p4api_vs2017_static_openssl1.1.1_p4api-2023.1.2468153-vs2017_static.sig<\/td>\n<\/tr>\n<tr>\n<td>11,887<\/td>\n<td>p4api_vs2017_static_openssl3_p4api-2023.1.2468153-vs2017_static.sig<\/td>\n<\/tr>\n<tr>\n<td>11,847<\/td>\n<td>p4api_vs2017_static_openssl1.0.2_p4api-2023.1.2468153-vs2017_static.sig<\/td>\n<\/tr>\n<tr>\n<td>11,847<\/td>\n<td>p4api_vs2017_static_p4api-2023.1.2468153-vs2017_static.sig<\/td>\n<\/tr>\n<tr>\n<td>10,228<\/td>\n<td>p4api_vs2017_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2017_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>10,187<\/td>\n<td>p4api_vs2017_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2017_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>10,147<\/td>\n<td>p4api_vs2017_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2017_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>10,147<\/td>\n<td>p4api_vs2017_static_vsdebug_p4api-2023.1.2468153-vs2017_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>8,222<\/td>\n<td>p4api_vs2019_static_openssl1.1.1_p4api-2023.1.2468153-vs2019_static.sig<\/td>\n<\/tr>\n<tr>\n<td>8,195<\/td>\n<td>p4api_vs2019_static_openssl3_p4api-2023.1.2468153-vs2019_static.sig<\/td>\n<\/tr>\n<tr>\n<td>8,167<\/td>\n<td>p4api_vs2019_static_openssl1.0.2_p4api-2023.1.2468153-vs2019_static.sig<\/td>\n<\/tr>\n<tr>\n<td>8,167<\/td>\n<td>p4api_vs2019_static_p4api-2023.1.2468153-vs2019_static.sig<\/td>\n<\/tr>\n<tr>\n<td>7,804<\/td>\n<td>p4api_vs2019_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2019_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>7,777<\/td>\n<td>p4api_vs2019_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2019_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>7,749<\/td>\n<td>p4api_vs2019_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2019_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>7,749<\/td>\n<td>p4api_vs2019_static_vsdebug_p4api-2023.1.2468153-vs2019_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>5,818<\/td>\n<td>p4api_vs2022_static_openssl1.1.1_p4api-2023.1.2468153-vs2022_static.sig<\/td>\n<\/tr>\n<tr>\n<td>5,802<\/td>\n<td>p4api_vs2022_static_openssl3_p4api-2023.1.2468153-vs2022_static.sig<\/td>\n<\/tr>\n<tr>\n<td>5,784<\/td>\n<td>p4api_vs2022_static_openssl1.0.2_p4api-2023.1.2468153-vs2022_static.sig<\/td>\n<\/tr>\n<tr>\n<td>5,784<\/td>\n<td>p4api_vs2022_static_p4api-2023.1.2468153-vs2022_static.sig<\/td>\n<\/tr>\n<tr>\n<td>5,525<\/td>\n<td>p4api_vs2022_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2022_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>5,509<\/td>\n<td>p4api_vs2022_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2022_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>5,491<\/td>\n<td>p4api_vs2022_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2022_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>5,491<\/td>\n<td>p4api_vs2022_static_vsdebug_p4api-2023.1.2468153-vs2022_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,639<\/td>\n<td>p4api_vs2015_static_openssl1.1.1_p4api-2023.1.2468153-vs2015_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,639<\/td>\n<td>p4api_vs2015_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2015_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,630<\/td>\n<td>p4api_vs2015_static_openssl1.0.2_p4api-2023.1.2468153-vs2015_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,630<\/td>\n<td>p4api_vs2015_static_p4api-2023.1.2468153-vs2015_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,630<\/td>\n<td>p4api_vs2015_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2015_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,630<\/td>\n<td>p4api_vs2015_static_vsdebug_p4api-2023.1.2468153-vs2015_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,628<\/td>\n<td>p4api_vs2015_static_openssl3_p4api-2023.1.2468153-vs2015_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,628<\/td>\n<td>p4api_vs2015_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2015_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,042<\/td>\n<td>p4api_vs2013_static_openssl1.1.1_p4api-2023.1.2468153-vs2013_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,041<\/td>\n<td>p4api_vs2013_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2013_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,040<\/td>\n<td>p4api_vs2013_static_openssl1.0.2_p4api-2023.1.2468153-vs2013_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,040<\/td>\n<td>p4api_vs2013_static_p4api-2023.1.2468153-vs2013_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,039<\/td>\n<td>p4api_vs2013_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2013_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,039<\/td>\n<td>p4api_vs2013_static_vsdebug_p4api-2023.1.2468153-vs2013_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>1,033<\/td>\n<td>p4api_vs2013_static_openssl3_p4api-2023.1.2468153-vs2013_static.sig<\/td>\n<\/tr>\n<tr>\n<td>1,032<\/td>\n<td>p4api_vs2013_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2013_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>973<\/td>\n<td>p4api_vs2012_static_openssl1.1.1_p4api-2023.1.2468153-vs2012_static.sig<\/td>\n<\/tr>\n<tr>\n<td>972<\/td>\n<td>p4api_vs2012_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2012_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>971<\/td>\n<td>p4api_vs2012_static_openssl1.0.2_p4api-2023.1.2468153-vs2012_static.sig<\/td>\n<\/tr>\n<tr>\n<td>971<\/td>\n<td>p4api_vs2012_static_p4api-2023.1.2468153-vs2012_static.sig<\/td>\n<\/tr>\n<tr>\n<td>970<\/td>\n<td>p4api_vs2012_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2012_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>970<\/td>\n<td>p4api_vs2012_static_vsdebug_p4api-2023.1.2468153-vs2012_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>967<\/td>\n<td>p4api_vs2012_static_openssl3_p4api-2023.1.2468153-vs2012_static.sig<\/td>\n<\/tr>\n<tr>\n<td>966<\/td>\n<td>p4api_vs2012_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2012_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>838<\/td>\n<td>p4api_vs2010_static_openssl1.1.1_p4api-2023.1.2468153-vs2010_static.sig<\/td>\n<\/tr>\n<tr>\n<td>838<\/td>\n<td>p4api_vs2010_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2010_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>837<\/td>\n<td>p4api_vs2010_static_openssl1.0.2_p4api-2023.1.2468153-vs2010_static.sig<\/td>\n<\/tr>\n<tr>\n<td>837<\/td>\n<td>p4api_vs2010_static_p4api-2023.1.2468153-vs2010_static.sig<\/td>\n<\/tr>\n<tr>\n<td>837<\/td>\n<td>p4api_vs2010_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2010_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>837<\/td>\n<td>p4api_vs2010_static_vsdebug_p4api-2023.1.2468153-vs2010_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>833<\/td>\n<td>p4api_vs2010_static_openssl3_p4api-2023.1.2468153-vs2010_static.sig<\/td>\n<\/tr>\n<tr>\n<td>833<\/td>\n<td>p4api_vs2010_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2010_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>495<\/td>\n<td>p4api_vs2008_static_openssl1.1.1_p4api-2023.1.2468153-vs2008_static.sig<\/td>\n<\/tr>\n<tr>\n<td>495<\/td>\n<td>p4api_vs2008_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2008_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>494<\/td>\n<td>p4api_vs2008_static_openssl1.0.2_p4api-2023.1.2468153-vs2008_static.sig<\/td>\n<\/tr>\n<tr>\n<td>494<\/td>\n<td>p4api_vs2008_static_p4api-2023.1.2468153-vs2008_static.sig<\/td>\n<\/tr>\n<tr>\n<td>494<\/td>\n<td>p4api_vs2008_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2008_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>494<\/td>\n<td>p4api_vs2008_static_vsdebug_p4api-2023.1.2468153-vs2008_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>490<\/td>\n<td>p4api_vs2008_static_openssl3_p4api-2023.1.2468153-vs2008_static.sig<\/td>\n<\/tr>\n<tr>\n<td>490<\/td>\n<td>p4api_vs2008_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2008_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>440<\/td>\n<td>p4api_vs2005_static_openssl1.1.1_p4api-2023.1.2468153-vs2005_static.sig<\/td>\n<\/tr>\n<tr>\n<td>440<\/td>\n<td>p4api_vs2005_static_vsdebug_openssl1.1.1_p4api-2023.1.2468153-vs2005_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>439<\/td>\n<td>p4api_vs2005_static_openssl1.0.2_p4api-2023.1.2468153-vs2005_static.sig<\/td>\n<\/tr>\n<tr>\n<td>439<\/td>\n<td>p4api_vs2005_static_p4api-2023.1.2468153-vs2005_static.sig<\/td>\n<\/tr>\n<tr>\n<td>439<\/td>\n<td>p4api_vs2005_static_vsdebug_openssl1.0.2_p4api-2023.1.2468153-vs2005_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>439<\/td>\n<td>p4api_vs2005_static_vsdebug_p4api-2023.1.2468153-vs2005_static_vsdebug.sig<\/td>\n<\/tr>\n<tr>\n<td>435<\/td>\n<td>p4api_vs2005_static_openssl3_p4api-2023.1.2468153-vs2005_static.sig<\/td>\n<\/tr>\n<tr>\n<td>435<\/td>\n<td>p4api_vs2005_static_vsdebug_openssl3_p4api-2023.1.2468153-vs2005_static_vsdebug.sig<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The remainder of this blog post leverages these signatures for <em>p4s.exe\u2019s<\/em> function names and type information.<\/p>\n<h3 class=\"wp-block-heading\">Investigating the RPC header<\/h3>\n<p>Given that Perforce Server runs as <em>LocalSystem<\/em>, local elevation of privilege attacks would certainly be worthwhile to explore. However, remote attacks via a network are much more intriguing from a vulnerability research perspective. Our next step is to investigate how Perforce Server handles data it receives from remote users, or in our case, attackers.<\/p>\n<p>Using <a href=\"https:\/\/learn.microsoft.com\/sysinternals\/downloads\/tcpview\">TCPView<\/a>, we can see that <em>p4s.exe<\/em> is listening for incoming connections on TCP port 1666:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-6.-TCPView-showing-Perforce-Servers-listening-TCP-port.webp\" alt=\"Screenshot of TCPView showing Perforce Server listening on local TCP port 1666\" class=\"wp-image-132791 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-6.-TCPView-showing-Perforce-Servers-listening-TCP-port.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 6. TCPView showing Perforce Server&#8217;s listening TCP port<\/em><\/figcaption><\/figure>\n<p>Programs built for Windows that listen on TCP ports for incoming connections almost always use Winsock\u2019s <a href=\"https:\/\/hex-rays.com\/blog\/igor-tip-of-the-week-16-cross-references\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>recv()<\/em><\/a><em> <\/em>function to receive incoming network data from clients. Using IDA Pro\u2019s <a href=\"https:\/\/hex-rays.com\/blog\/igor-tip-of-the-week-16-cross-references\/\">cross-references<\/a> (\u201cCODE XREF\u201ds below), we can see that <em>recv()<\/em> is called by several functions:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-7.-Code-cross-references-to-recv.webp\" alt=\"Screenshot of source code cross-references to recv()\" class=\"wp-image-132792 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-7.-Code-cross-references-to-recv.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 7. Code cross-references to recv()<\/em><\/figcaption><\/figure>\n<p>We\u2019re looking to assess how received network data is parsed and handled, and to save time in determining which of the functions above actually receives the connected client data via <em>recv()<\/em>, we used a debugger to set a breakpoint on <em>recv()<\/em> and reviewed its thread\u2019s call-stack to reveal the following chain of function calls:<\/p>\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-8.-The-function-call-stack-for-recv-at-runtime-1024x935.webp\" alt=\"A call-stack diagram starting with Rpc::DispatchOne(), which then calls RpcTransport::Receive(), which calls NetBuffer::Receive(), which is followed by NetTcpTransport::SendOrReceive(), which finally calls recv().\" class=\"wp-image-132793 webp-format\" style=\"aspect-ratio:1.095187165775401;width:541px;height:auto\" srcset=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-8.-The-function-call-stack-for-recv-at-runtime-1024x935.webp 1024w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-8.-The-function-call-stack-for-recv-at-runtime-300x274.webp 300w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-8.-The-function-call-stack-for-recv-at-runtime-768x702.webp 768w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-8.-The-function-call-stack-for-recv-at-runtime-1536x1403.webp 1536w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-8.-The-function-call-stack-for-recv-at-runtime.webp 1642w\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-8.-The-function-call-stack-for-recv-at-runtime-1024x935.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 8. The function call-stack for recv() at runtime<\/em><\/figcaption><\/figure>\n<p>In the call-stack above, \u201c<em>Rpc<\/em>\u201d is short for \u201cRemote Procedure Call\u201d, a <a href=\"https:\/\/users.cs.cf.ac.uk\/Dave.Marshall\/C\/node33.html\" target=\"_blank\" rel=\"noreferrer noopener\">common term<\/a> used for remotely executing functions.<\/p>\n<p>Although we\u2019re assessing the Perforce Server, the function <em>RpcTransport::Receive()<\/em> (in Figure 8) is also included in <a href=\"https:\/\/ftp.perforce.com\/perforce\/r23.1\/bin.tools\/p4source.tgz\" target=\"_blank\" rel=\"noreferrer noopener\">the client source code<\/a> discussed above (note that the comments are from Perforce\u2019s developers, not from Microsoft):<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-9.-Source-code-for-RpcTransportReceive-812x1024.webp\" alt=\"Screenshot of source code for RpcTransport::Receive()\" class=\"wp-image-132794 webp-format\" srcset=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-9.-Source-code-for-RpcTransportReceive-812x1024.webp 812w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-9.-Source-code-for-RpcTransportReceive-238x300.webp 238w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-9.-Source-code-for-RpcTransportReceive-768x969.webp 768w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-9.-Source-code-for-RpcTransportReceive.webp 1113w\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-9.-Source-code-for-RpcTransportReceive-812x1024.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 9. Source code for RpcTransport::Receive()<\/em><\/figcaption><\/figure>\n<p>The code above does the following:<\/p>\n<ol type=\"1\">\n<li>On line 69, calls <em>NetBuffer::Receive()<\/em> to receive five bytes of data from the connected TCP client. We will refer to these five bytes as the RPC header.<\/li>\n<li>On line 72, verifies that the first byte\u2019s value equals the value of the following four bytes using the XOR operation to compute a parity byte checksum.<\/li>\n<li>On line 78, interprets those following four bytes as a 32-bit little-endian value named <em>length<\/em>.<\/li>\n<li>On line 85, verifies that <em>length &gt;= 12<\/em> and that <em>length &lt; 0x1FFFFFFF<\/em>.<\/li>\n<li>On line 93, allocates memory of size <em>length<\/em> and receives <em>length<\/em> bytes from the connected TCP client.<\/li>\n<\/ol>\n<p>However, there\u2019s a design risk in the code above, in that there\u2019s not sufficient protection against <a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/405.html\" target=\"_blank\" rel=\"noreferrer noopener\">asymmetric resource consumption<\/a> attacks from remote unauthenticated attackers. An attacker could connect to the Perforce Server, send a five-byte RPC header specifying a <em>length<\/em> value of <em>0x1FFFFFFE<\/em>, and cause the server to allocate <em>0x1FFFFFFE<\/em> bytes (about 537 MB) of memory. An attacker could exploit this vulnerability by establishing numerous connections and requesting these large memory allocations via each connection, quickly consuming all the server\u2019s available memory. Once available memory is exhausted, the next call to <em>Alloc()<\/em> (step 5 above) will lead Perforce Server\u2019s memory allocator (which happens to be <a href=\"https:\/\/github.com\/microsoft\/mimalloc\" target=\"_blank\" rel=\"noreferrer noopener\">mimalloc<\/a>) to throw an unhandled <em>std::bad_alloc()<\/em> exception from <a href=\"https:\/\/github.com\/microsoft\/mimalloc\/blob\/master\/src\/alloc.c#L907\" target=\"_blank\" rel=\"noreferrer noopener\"><em>mi_try_new_handler()<\/em><\/a>, causing the Perforce Server process to crash and not restart. This denial-of-service (DoS) attack is exploitable by remote unauthenticated attackers.<\/p>\n<p>This vulnerability is now identified as <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-5759\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-5759<\/a> and it has a <a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:N\/I:N\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">CVSS score of 7.5<\/a>.<\/p>\n<h3 class=\"wp-block-heading\">Investigating RPC handler functions<\/h3>\n<p>We showed in the call-stack above that <em>RpcTransport::Receive()<\/em> is called by <em>Rpc::DispatchOne()<\/em>. This latter function takes the allocated buffer received by <em>RpcTransport::Receive()<\/em>, parses it as an RPC command with optional arguments, looks up the handler for the given RPC command, and calls the handler with the received arguments. Many of these RPC commands are mapped to the p4 commands listed <a href=\"https:\/\/www.perforce.com\/manuals\/cmdref\/Content\/CmdRef\/commands.html\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>. Specifically, there are 202 formally documented p4 commands, and about 450 defined RPC commands, though not all RPC commands have their handlers registered by default at runtime.<\/p>\n<p>Since we\u2019re most interested in the possibility of remote unprivileged attacks against Perforce Server in its default configuration, we created our own Perforce client from scratch that attempts to call (without any authentication) each of the approximately 450 RPC commands defined in <em>p4s.exe<\/em>. Of those, we found that about 360 RPC commands have their handlers registered by default at runtime. This is too high of a count to manually assess in a reasonable amount of time, so we had to find other means to prioritize our RPC command analysis.<\/p>\n<p>We found that <em>p4s.exe<\/em> statically imports 382 API functions. Of those, we identified the most interesting functions that could potentially achieve remote code execution, assuming an unauthenticated remote attacker could both execute an RPC function that calls one of these API functions and control the arguments to that API function. These functions are:<\/p>\n<ul>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/winbase\/nf-winbase-createfilemappinga\"><em>CreateFileMapping()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/processthreadsapi\/nf-processthreadsapi-createprocessa\"><em>CreateProcess()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/ioapiset\/nf-ioapiset-deviceiocontrol\"><em>DeviceIoControl()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/libloaderapi\/nf-libloaderapi-loadlibrarya\"><em>LoadLibrary()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/libloaderapi\/nf-libloaderapi-loadlibraryexa\"><em>LoadLibraryEx()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/memoryapi\/nf-memoryapi-mapviewoffile\"><em>MapViewOfFile()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/winbase\/nf-winbase-movefileexa\"><em>MoveFileEx()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/winreg\/nf-winreg-regsetvalueexa\"><em>RegSetValueEx()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/shellapi\/nf-shellapi-shellexecuteexa\"><em>ShellExecuteEx()<\/em><\/a><em><\/em><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/windows\/win32\/api\/fileapi\/nf-fileapi-writefile\"><em>WriteFile()<\/em><\/a><em><\/em><\/li>\n<\/ul>\n<p>Assessing this short list of API functions and analyzing code-flow paths from RPC handlers to these functions was a much more tractable problem than manually reviewing each of the approximately 360 registered RPC handlers.<\/p>\n<h4 class=\"wp-block-heading\">The bgtask command<\/h4>\n<p>By reviewing <a href=\"https:\/\/hex-rays.com\/blog\/igor-tip-of-the-week-16-cross-references\/\" target=\"_blank\" rel=\"noreferrer noopener\">cross-references<\/a> with IDA Pro, we were able to identify the following call-chain from an RPC command handler to <em>CreateProcess()<\/em>:<\/p>\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-10.-The-function-call-chain-from-bgtask-to-CreateProcess-1024x965.webp\" alt=\"A call-chain displays the RPC handler for p4 bgtask command calls RunCommand::RunChild(), which calls RunCommand::DoRunChild(), then RunProcess(), and finally calls CreateProcess().\" class=\"wp-image-132795 webp-format\" style=\"aspect-ratio:1.061139896373057;width:542px;height:auto\" srcset=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-10.-The-function-call-chain-from-bgtask-to-CreateProcess-1024x965.webp 1024w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-10.-The-function-call-chain-from-bgtask-to-CreateProcess-300x283.webp 300w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-10.-The-function-call-chain-from-bgtask-to-CreateProcess-768x724.webp 768w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-10.-The-function-call-chain-from-bgtask-to-CreateProcess-1536x1448.webp 1536w, https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-10.-The-function-call-chain-from-bgtask-to-CreateProcess.webp 1591w\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-10.-The-function-call-chain-from-bgtask-to-CreateProcess-1024x965.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 10. The function call-chain from bgtask to CreateProcess()<\/em><\/figcaption><\/figure>\n<p>According to <a href=\"https:\/\/www.perforce.com\/manuals\/cmdref\/Content\/CmdRef\/p4_bgtask.html\" target=\"_blank\" rel=\"noreferrer noopener\">Perforce\u2019s documentation<\/a>, the <em>p4 bgtask<\/em> command \u201cenables a Helix Core superuser on the p4 command-line client to run commands or programs remotely on the server in the background.\u201d It\u2019s thus not surprising that this type of command would end up calling <em>CreateProcess()<\/em>, but since the documentation states that this command can only be run by a superuser, our only hope of finding a security vulnerability here was if there was a bug in the authentication component or in how the RPC arguments were getting parsed.<\/p>\n<p>To begin our assessment of <em>p4 bgtask<\/em>, we used the custom Perforce client that we wrote to see how the server would respond if we tried remotely calling <em>bgtask<\/em> without any authentication. To our surprise, the server didn\u2019t return any errors. In fact, the server ran the command line that we sent to it, and this child process ran as <em>LocalSystem<\/em>.<\/p>\n<p>Upon further investigation, this is <a href=\"https:\/\/www.perforce.com\/manuals\/p4sag\/Content\/P4SAG\/protections.when_to_set.html\" target=\"_blank\" rel=\"noreferrer noopener\">by design<\/a>, with the manual noting to \u201cRun <em>p4 protect<\/em> immediately after installing Helix Server for the first time. Before the first call to<em> p4 protect<\/em>, every Helix Server user is a superuser and thus can access and change anything in the depot\u201d. In this context, \u201cevery Helix Server user\u201d also includes unauthenticated anonymous remote users.<\/p>\n<p>If an administrator does not manually perform those post-installation steps, this <a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/306.html\" target=\"_blank\" rel=\"noreferrer noopener\">missing authentication for a critical function<\/a> allows unauthenticated remote attackers to run arbitrary command lines (including <a href=\"https:\/\/learn.microsoft.com\/powershell\/module\/microsoft.powershell.core\/about\/about_powershell_exe?view=powershell-5.1#-command\">PowerShell command lines with script blocks<\/a>) as <em>LocalSystem<\/em> when Perforce Server is installed with its default configuration.<\/p>\n<p>This vulnerability is now identified as <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45849\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-45849<\/a> and it has a <a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:C\/C:H\/I:H\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">CVSS score of 10.0<\/a>.<\/p>\n<h4 class=\"wp-block-heading\">The rmt-Shutdown RPC handler<\/h4>\n<p>When a user (or attacker) uses the <em>p4 bgtask<\/em> discussed above with the standard <a href=\"https:\/\/www.perforce.com\/downloads\/helix-command-line-client-p4\" target=\"_blank\" rel=\"noreferrer noopener\">Perforce Client<\/a>, the client sends the RPC command name <em>user-bgtask<\/em> to the server to execute that command. However, some RPC command names that are accepted by the server don\u2019t have a corresponding Perforce Client command; one of those RPC command names is <em>rmt-Shutdown<\/em>.<\/p>\n<p>Although it\u2019s not possible to send the <em>rmt-Shutdown<\/em> RPC command with the standard Perforce Client (nor the <a href=\"https:\/\/www.perforce.com\/downloads\/administration-tool\" target=\"_blank\" rel=\"noreferrer noopener\">Perforce Admin Tool<\/a>), and it doesn\u2019t appear to be documented on Perforce\u2019s website, we were able to send the command with our custom Perforce client. We found that the handler for <em>rmt-Shutdown<\/em> requires a username of <em>remote<\/em> but doesn\u2019t require any authentication credentials for that username. When the Perforce Server receives this command, it terminates the Perforce Server process, thereby allowing unauthenticated remote attackers to perform DoS attacks against the server.<\/p>\n<p>This vulnerability is now identified as <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-35767\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-35767<\/a> and it has a <a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:N\/I:N\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">CVSS score of 7.5<\/a>.<\/p>\n<h4 class=\"wp-block-heading\">The rmt-UpdtFovrCommit RPC handler<\/h4>\n<p>Similar to the <em>rmt-Shutdown<\/em> RPC command name, the RPC command name <em>rmt-UpdtFovrCommit<\/em> (which is likely short for \u201cremote update failover commit\u201d) cannot be sent via the standard Perforce Client nor Admin Tool and doesn\u2019t appear to be documented on Perforce\u2019s website but can be sent with a custom Perforce client. This RPC function piqued our interest when we first tested for registered RPC handlers, since when our custom-built scanner sent a <em>rmt-UpdtFovrCommit<\/em> RPC command as an anonymous user and without any command arguments to the Perforce Server, the Perforce Server process crashed.<\/p>\n<p>We can see the reason for the crash in the decompiled <em>rmt-UpdtFovrCommit<\/em> handler code below:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-11.-Snippet-of-code-from-the-decompiled-rmt-UpdtFovrCommit-handler-function.webp\" alt=\"Screenshot of source code from the decompiled rmt-UpdtFovrCommit handler function\" class=\"wp-image-132796 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-11.-Snippet-of-code-from-the-decompiled-rmt-UpdtFovrCommit-handler-function.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 11. Snippet of code from the decompiled rmt-UpdtFovrCommit handler function<\/em><\/figcaption><\/figure>\n<p>As previously discussed, RPC messages sent from the client to the server contain the RPC function name and can optionally contain RPC function arguments. In the code above, <em>StrDict::GetVar()<\/em> is used to get the client\u2019s RPC function arguments from the <em>pRpc<\/em> object. If the given argument name was not provided in the client\u2019s RPC message, then <em>StrDict::GetVar()<\/em> returns zero. In the first line above, <em>StrDict::GetVar()<\/em> is used to get the value of the <em>user<\/em> RPC function argument. However, if the user (or attacker) does not specify a value for <em>user<\/em> in their RPC message then <em>pStrPtrUser<\/em> gets set to zero. In the last line above, we see <em>pStrPtrUser<\/em> passed as the second argument to <em>StrOps::PackOctet()<\/em>, (the source code for which is available in <a href=\"https:\/\/ftp.perforce.com\/perforce\/r23.1\/bin.tools\/p4source.tgz\" target=\"_blank\" rel=\"noreferrer noopener\">the client source code<\/a> discussed above):<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-12.-Source-code-snippets-from-strbuf.h-1.webp\" alt=\"Screenshot of code from strbuf.h\" class=\"wp-image-132827 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-12.-Source-code-snippets-from-strbuf.h-1.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 12. Source code snippets from strbuf.h<\/em><\/figcaption><\/figure>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-13.-Source-code-snippet-from-strbuf.cc-1.webp\" alt=\"Screenshot of code from strbuf.cc\" class=\"wp-image-132828 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-13.-Source-code-snippet-from-strbuf.cc-1.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 13. Source code snippet from strbuf.cc<\/em><\/figcaption><\/figure>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-14.-Source-code-snippet-from-strops.cc-1.webp\" alt=\"Screenshot of code from strops.cc\" class=\"wp-image-132829 webp-format\" srcset=\"\" data-orig-src=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/wp-content\/uploads\/2023\/12\/Figure-14.-Source-code-snippet-from-strops.cc-1.webp\"><figcaption class=\"wp-element-caption\"><em>Figure 14. Source code snippet from strops.cc<\/em><\/figcaption><\/figure>\n<p>As can be seen in the code above, when <em>StrOps::PackOctet()<\/em> is called with zero as the value for <em>s<\/em>, <em>StrBuf::Append()<\/em> gets called with zero as the value for <em>t<\/em>. This results in <em>StrBuf::Append()<\/em> trying to dereference the <em>length<\/em> field of <em>t<\/em>, where the <em>buffer<\/em> field of <em>t<\/em> is at offset <em>0<\/em> relative to the beginning of the <em>t<\/em> object and the <em>length<\/em> field of <em>t<\/em> is at offset <em>8<\/em> relative to the beginning of the <em>t<\/em> object (since <em>char *buffer<\/em> is 64-bits). When the value of <em>t<\/em> is <em>0<\/em>, dereferencing <em>length<\/em> leads to reading from virtual memory address <em>0x0000000000000008<\/em>, which results in a read-access violation or segmentation fault. We found that these types of exceptions are not handled gracefully by the server and that such read-exceptions cause the entire server process to crash and not restart. This DoS attack is exploitable by remote unauthenticated attackers.<\/p>\n<p>This vulnerability is now identified as <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45319\" target=\"_blank\" rel=\"noreferrer noopener\">CVE-2023-45319<\/a> and it has a <a href=\"https:\/\/nvd.nist.gov\/vuln-metrics\/cvss\/v3-calculator?vector=AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:N\/I:N\/A:H&amp;version=3.1\" target=\"_blank\" rel=\"noreferrer noopener\">CVSS score of 7.5<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Coordinated disclosure<\/h2>\n<p>Microsoft reported these four security vulnerabilities to the vendor Perforce at the end of August 2023. Immediately afterwards, on September 1, Perforce acknowledged these four vulnerabilities and began work to investigate and remediate them. Throughout September and October, Perforce communicated status updates to Microsoft on implementing fixes and putting those fixes through their QA processes. Perforce reserved CVE IDs on October 24, 2023, shared those IDs with Microsoft on October 25, 2023, and informed Microsoft at that time that the patches would be published by mid-November 2023. On November 7, 2023, Perforce published Perforce Server version 2023.1\/2513900, which mitigates these four vulnerabilities.<\/p>\n<p>Microsoft would like to thank Perforce for their professionalism and for their rapid response in addressing these security vulnerabilities. Microsoft is grateful for this partnership and for Perforce\u2019s commitment to security.<\/p>\n<h2 class=\"wp-block-heading\">Mitigation and protection guidance<\/h2>\n<p>Microsoft is not aware of any adversaries exploiting these vulnerabilities, but mitigations should be applied by all Perforce Server customers as soon as possible.<\/p>\n<h3 class=\"wp-block-heading\">Risk detection<\/h3>\n<p>Extend vulnerability and risk detection beyond the firewall&nbsp;with platforms like <a href=\"https:\/\/learn.microsoft.com\/azure\/external-attack-surface-management\/\" target=\"_blank\" rel=\"noreferrer noopener\">Microsoft Defender External Attack Surface Management<\/a>. Customers can identify internet-exposed infrastructure running Perforce Server in their inventory and use the insights tile under the Attack Surface Summary dashboard to surface assets vulnerable to CVE-2023-5759, CVE-2023-45849, CVE-2023-35767, and CVE-2023-45319.<\/p>\n<h3 class=\"wp-block-heading\">What to do now if you\u2019re affected<\/h3>\n<p>Update to version 2023.1\/2513900 immediately, available here: <a href=\"https:\/\/www.perforce.com\/downloads\/helix-core-p4d\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.perforce.com\/downloads\/helix-core-p4d<\/a>.<\/p>\n<h3 class=\"wp-block-heading\">Defense-in-depth<\/h3>\n<p>In addition to following Perforce\u2019s guidance on \u201c<a href=\"https:\/\/www.perforce.com\/manuals\/p4sag\/Content\/P4SAG\/chapter.security.html\" target=\"_blank\" rel=\"noreferrer noopener\">Securing the server<\/a>\u201d, Microsoft recommends adhering to the following defense-in-depth tactics to minimize the risk of exploitation of these or other Perforce Server vulnerabilities.<\/p>\n<ul>\n<li>Regularly monitor for and apply patches for third-party software.<\/li>\n<li>Use a VPN and\/or an IP allow-list to limit who can communicate with your Perforce Server.<\/li>\n<li>Issue TLS certificates to legitimate Perforce users and use a <a href=\"https:\/\/wikipedia.org\/wiki\/TLS_termination_proxy\" target=\"_blank\" rel=\"noreferrer noopener\">TLS termination proxy<\/a> in front of Perforce Server to validate client\u2019s TLS certificates before allowing them to connect to Perforce Server.<\/li>\n<li>Log all access to your Perforce Server, both via your network appliances and <a href=\"https:\/\/www.perforce.com\/manuals\/cmdref\/Content\/CmdRef\/P4DEBUG.html\" target=\"_blank\" rel=\"noreferrer noopener\">via Perforce Server itself<\/a>.<\/li>\n<li>Configure alerting to notify IT administrators and your security team if the Perforce Server process crashes.<\/li>\n<li>Use network segmentation to ensure that if your Perforce Server is compromised, an attacker\u2019s ability to pivot in your network is limited.<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">Appendix<\/h2>\n<h3 class=\"wp-block-heading\">Threat intelligence reports<\/h3>\n<p>Microsoft customers can use the following reports in Microsoft products to get the most up-to-date information about the threat actor, malicious activity, and techniques discussed in this blog. These reports provide intelligence, protection information, and recommended actions to prevent, mitigate, or respond to associated threats found in customer environments.<\/p>\n<p><strong>Microsoft Defender Threat Intelligence<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/ti.defender.microsoft.com\/cves\/CVE-2023-5759\">CVE-2023-5759<\/a><\/li>\n<li><a href=\"https:\/\/ti.defender.microsoft.com\/cves\/CVE-2023-45849\">CVE-2023-45849<\/a><\/li>\n<li><a href=\"https:\/\/ti.defender.microsoft.com\/cves\/CVE-2023-35767\">CVE-2023-35767<\/a><\/li>\n<li><a href=\"https:\/\/ti.defender.microsoft.com\/cves\/CVE-2023-45319\">CVE-2023-45319<\/a><\/li>\n<\/ul>\n<p><strong>Microsoft 365 Defender Threat analytics\u00a0<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/security.microsoft.com\/threatanalytics3\/c21c9acc-6f5c-404b-96a0-5187c6c68689\/analystreport?search=CVE-2023-45319&amp;tid=0553df8d-f650-4a9b-b0b8-f97df0aedfce\">Vulnerability profile: Critical remote code execution vulnerability in Perforce Helix Core Server<\/a><\/li>\n<\/ul>\n<p><strong>Jason Geffner<\/strong><\/p>\n<p><em>Microsoft Threat Intelligence Community<\/em><\/p>\n<h3 class=\"wp-block-heading\">References<\/h3>\n<ul>\n<li><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-5759\">https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-5759<\/a><\/li>\n<li><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-35767\">https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-35767<\/a><\/li>\n<li><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45319\">https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45319<\/a><\/li>\n<li><a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45849\">https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2023-45849<\/a><\/li>\n<li><a href=\"https:\/\/ftp.perforce.com\/perforce\/r23.1\/bin.ntx64\/\">https:\/\/ftp.perforce.com\/perforce\/r23.1\/bin.ntx64\/<\/a><\/li>\n<li><a href=\"https:\/\/portal.perforce.com\/s\/article\/3925\">https:\/\/portal.perforce.com\/s\/article\/3925<\/a><\/li>\n<li><a href=\"https:\/\/swarm.workshop.perforce.com\/projects\/perforce_software-p4\">https:\/\/swarm.workshop.perforce.com\/projects\/perforce_software-p4<\/a><\/li>\n<li><a href=\"https:\/\/www.perforce.com\/downloads\/administration-tool\">https:\/\/www.perforce.com\/downloads\/administration-tool<\/a><\/li>\n<li><a href=\"https:\/\/www.perforce.com\/downloads\/helix-command-line-client-p4\">https:\/\/www.perforce.com\/downloads\/helix-command-line-client-p4<\/a><\/li>\n<li><a href=\"https:\/\/www.perforce.com\/downloads\/helix-core-c\/c-api\">https:\/\/www.perforce.com\/downloads\/helix-core-c\/c-api<\/a><\/li>\n<li><a href=\"https:\/\/www.perforce.com\/downloads\/helix-core-p4d\">https:\/\/www.perforce.com\/downloads\/helix-core-p4d<\/a><\/li>\n<li><a href=\"https:\/\/www.perforce.com\/manuals\/cmdref\/Content\/CmdRef\/commands.html\">https:\/\/www.perforce.com\/manuals\/cmdref\/Content\/CmdRef\/commands.html<\/a><\/li>\n<li><a href=\"https:\/\/www.perforce.com\/manuals\/p4sag\/Content\/P4SAG\/protections.when_to_set.html\">https:\/\/www.perforce.com\/manuals\/p4sag\/Content\/P4SAG\/protections.when_to_set.html<\/a><\/li>\n<li><a href=\"https:\/\/www.perforce.com\/press-releases\/perforce-open-sources-popular-version-control-tools\">https:\/\/www.perforce.com\/press-releases\/perforce-open-sources-popular-version-control-tools<\/a><\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">Acknowledgments<\/h3>\n<p>Microsoft would like to recognize <a href=\"https:\/\/www.keysight.com\/blogs\/tech\/nwvs\/2022\/06\/08\/a-sneak-peek-into-the-protocol-behind-perforce\">https:\/\/www.keysight.com\/blogs\/tech\/nwvs\/2022\/06\/08\/a-sneak-peek-into-the-protocol-behind-perforce<\/a> for previous work done in analyzing Perforce\u2019s RPC protocol.<\/p>\n<h3 class=\"wp-block-heading\">Learn more<\/h3>\n<p>For the latest security research from the Microsoft Threat Intelligence community, check out the Microsoft Threat Intelligence Blog:&nbsp;<a href=\"https:\/\/aka.ms\/threatintelblog\">https:\/\/aka.ms\/threatintelblog<\/a>.<\/p>\n<p>To get notified about new publications and to join discussions on social media, follow us on Twitter at&nbsp;<a href=\"https:\/\/twitter.com\/MsftSecIntel\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/twitter.com\/MsftSecIntel<\/a>.<\/p>\n<p>To hear stories and insights from the Microsoft Threat Intelligence community about the ever-evolving threat landscape, listen to the Microsoft Threat Intelligence podcast: <a href=\"https:\/\/thecyberwire.com\/podcasts\/microsoft-threat-intelligence\">https:\/\/thecyberwire.com\/podcasts\/microsoft-threat-intelligence<\/a>.<\/p>\n<p>The post <a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/2023\/12\/15\/patching-perforce-perforations-critical-rce-vulnerability-discovered-in-perforce-helix-core-server\/\">Patching Perforce perforations: Critical RCE vulnerability discovered in Perforce Helix Core Server<\/a> appeared first on <a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\">Microsoft Security Blog<\/a>.<\/p>\n<p><a href=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/2023\/12\/15\/patching-perforce-perforations-critical-rce-vulnerability-discovered-in-perforce-helix-core-server\/\" target=\"bwo\" >https:\/\/blogs.technet.microsoft.com\/mmpc\/feed\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><strong>Credit to Author: Microsoft Threat Intelligence| Date: Fri, 15 Dec 2023 17:00:00 +0000<\/strong><\/p>\n<p>Four new unauthenticated remotely exploitable security vulnerabilities discovered in the popular source code management platform Perforce Helix Core Server have been remediated after being responsibly disclosed by Microsoft. Perforce Server customers are strongly urged to update to version 2023.1\/2513900.<\/p>\n<p>The post <a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/2023\/12\/15\/patching-perforce-perforations-critical-rce-vulnerability-discovered-in-perforce-helix-core-server\/\">Patching Perforce perforations: Critical RCE vulnerability discovered in Perforce Helix Core Server<\/a> appeared first on <a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\">Microsoft Security Blog<\/a>.<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[10759,10378],"tags":[11682],"class_list":["post-23619","post","type-post","status-publish","format-standard","hentry","category-microsoft","category-security","tag-remote-code-execution"],"_links":{"self":[{"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/posts\/23619","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/comments?post=23619"}],"version-history":[{"count":0,"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/posts\/23619\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/media?parent=23619"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/categories?post=23619"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.palada.net\/index.php\/wp-json\/wp\/v2\/tags?post=23619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}