Jan 15, 2026·7 min read·62 visits
The software used to design HMI screens for industrial control systems has a fatal flaw in how it parses project files. It detects errors but ignores them, continuing to write data until it corrupts memory. By tricking an engineer into opening a malicious project file, an attacker can execute arbitrary code on the engineering workstation.
A critical Out-of-bounds Write vulnerability in JTEKT Screen Creator Advance 2 allows attackers to achieve Arbitrary Code Execution via malformed project files, exploiting a failure to abort operations upon encountering 'out of specification' errors.
In the world of Industrial Control Systems (ICS), the engineering workstation is the crown jewel. It's the machine where the logic for PLCs is written and where the screens for Human-Machine Interfaces (HMIs) are designed. If you compromise the workstation, you own the factory floor. Enter JTEKT Screen Creator Advance 2, a piece of software used to design the touch interfaces for JTEKT's industrial displays.
File format parsers are the soft underbelly of ICS software. These applications are built to ingest complex, proprietary file formats (often legacy binary blobs) that define everything from button placement to macro logic. CVE-2023-22345 is a classic example of what happens when a parser trusts its input too much. It’s a vulnerability that turns a mundane design file into a weaponized payload capable of executing arbitrary code on the designer's machine.
Why is this interesting? Because it targets the human element. You don't need to bypass a firewall to exploit this; you just need a frustrated engineer to open a "troubleshooting" file you sent them. It's a client-side attack against the people holding the keys to the physical machinery.
The vulnerability is an Out-of-bounds Write (CWE-787), but the root cause is a failure of logic rather than just a simple calculation error. According to the analysis, the issue resides in how the software handles "out of specification" errors during the parsing of project files.
When a robust parser encounters data that violates the file format specification (e.g., a button width defined as 40,000 pixels on a 1080p screen), it should throw an exception and abort the load process. Screen Creator Advance 2, however, exhibits a fatal stubbornness. It seemingly detects the error—recognizing the data is "out of specification"—but fails to stop the processing pipeline.
Imagine a construction crew building a bridge. The blueprint says to use a 10-foot beam. The truck delivers a 50-foot beam. The foreman notes, "This is the wrong size," in a logbook, but then tells the crew, "Install it anyway." The result is structural failure. In software terms, the application continues to write the malformed data into a fixed-size memory buffer, causing an overflow that overwrites adjacent memory, potentially including return addresses or function pointers.
While the proprietary source code isn't public, we can reconstruct the logic flaw based on the vulnerability behavior. This pattern is distressingly common in legacy C/C++ parsers where error handling is an afterthought or where developers try to make the software "robust" by ignoring non-critical errors.
In the vulnerable version, the parser likely checks for validity but forgets the most important part: the return statement.
// Pseudo-code reconstruction of the flaw
void ParseProjectElement(char* inputData) {
ElementHeader header;
memcpy(&header, inputData, sizeof(header));
// 1. Validation Step
if (header.dataLength > MAX_BUFFER_SIZE) {
// LOGIC FLAW: The error is logged/flagged, but execution continues!
LogError("Error: Data length out of specification");
// Missing: return; or goto error;
}
// 2. The Corruption
// The code proceeds to use the bad length because it wasn't aborted.
// This writes past the end of 'destinationBuffer'.
memcpy(destinationBuffer, inputData + sizeof(header), header.dataLength);
}The remediation in Ver.0.1.1.4 Build01A involves strictly enforcing the error condition. When the parser detects data that is out of spec, it must immediately halt processing to prevent the dangerous memcpy or write operation.
// The patched logic
if (header.dataLength > MAX_BUFFER_SIZE) {
LogError("Error: Data length out of specification");
// FIX: Abort the operation immediately
return ERROR_INVALID_FILE;
}This simple addition of a flow control statement prevents the instruction pointer from ever reaching the memory corruption routine.
Exploiting CVE-2023-22345 requires a standard file format exploit chain. Since this is a Windows-based application, the attacker needs to craft a file that bypasses modern mitigations like ASLR (Address Space Layout Randomization) and DEP (Data Execution Prevention).
Step 1: File Format Reversing The attacker starts by generating valid project files and fuzzing them. They mutate specific fields—lengths, offsets, and counters—looking for crashes. The goal is to find the specific field that triggers the "out of specification" error path.
Step 2: Triggering the Overflow Once the crash is identified, the attacker refines the file. They set a length field to a value larger than the allocated buffer. When the user opens this file, the application attempts to copy the attacker's payload into the buffer. Because the length is unchecked (effectively), the copy operation smashes the stack or heap metadata.
Step 3: Gaining Control If it's a stack overflow, the attacker overwrites the Saved Return Address (SRA). When the parsing function attempts to return, it pops the attacker's address off the stack instead of the legitimate caller's address. If it's a heap overflow, the attacker might corrupt the Free List or C++ vtable pointers.
Step 4: ROP Chain and Shellcode
To bypass DEP, the attacker constructs a Return-Oriented Programming (ROP) chain—small snippets of existing executable code—to mark their shellcode region as executable (e.g., via VirtualProtect). Finally, the execution flows to the shellcode, which likely opens a reverse shell back to the attacker.
> [!NOTE] > This is a "User Interaction Required" (UI:R) vulnerability. The exploit doesn't work by staring at the screen; the victim must actively open the file. This makes it a prime candidate for spear-phishing campaigns targeting OT engineers.
Why panic over a desktop app vulnerability? Because of where it sits. Screen Creator Advance 2 isn't installed on the receptionist's laptop; it's installed on the Engineering Workstation.
1. Lateral Movement: Engineering workstations often sit in a unique position in the network topology. They have one leg in the corporate IT network (to receive email/files) and one leg in the OT/ICS network (to push programming to PLCs and HMIs). Gaining RCE here bridges the air gap.
2. Project Tampering: An attacker doesn't just have to run ransomware. They can subtly modify legitimate HMI projects. Imagine altering the "Emergency Stop" button logic on a foundry control screen so that the UI shows "Stopped" while the furnace continues to heat up. The physical consequences of integrity loss in this environment are catastrophic.
3. Intellectual Property Theft: Project files contain the entire logic and layout of a manufacturing process. Stealing these files gives competitors or nation-states a blueprint of the facility's operations.
JTEKT has released a patch, and applying it is the only reliable fix. The vulnerability logic is hardcoded into the binary; no amount of firewall rules will fix a broken parser.
Immediate Action: Update to Screen Creator Advance 2 Ver.0.1.1.4 Build01A or later. This version correctly implements the error handling logic, ensuring that "out of specification" data terminates the parsing process safely.
Process Mitigation: Implement strict file hygiene. Engineering workstations should be treated as secure enclaves. Do not download project files from the internet or open email attachments directly on these machines. Transfer files via a sanitized USB or a secure file transfer gateway that scans for anomalies, although custom file format fuzzing by security gateways is rare.
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Screen Creator Advance 2 JTEKT ELECTRONICS CORPORATION | <= 0.1.1.4 Build01 | 0.1.1.4 Build01A |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-787 (Out-of-bounds Write) |
| CVSS v3.1 | 7.8 (High) |
| Attack Vector | Local (User Interaction Required) |
| Impact | Arbitrary Code Execution / Denial of Service |
| Exploit Status | PoC (Theoretical) |
| KEV Listed | No |
The product writes data past the end, or before the beginning, of the intended buffer.
CVE-2026-115895 is a high-severity code injection vulnerability (CWE-94) in the happy-dom npm package prior to version 21.0.4. The vulnerability exists within the ECMAScriptModuleCompiler component, which transforms ECMAScript module syntax into executable Node.js functions when JavaScript evaluation is enabled. Due to an incomplete fix for CVE-2026-33943, the compiler failed to validate local named import aliases against legal JavaScript identifier rules. Attackers supplying crafted module imports—specifically utilizing destructuring default initializers alongside JSON module attributes—can inject arbitrary JavaScript expressions directly into the host Node.js runtime context.
An improper input validation and authorization bypass vulnerability exists in the LangGraph storage layer affecting langgraph, langgraph-checkpoint-postgres, and langgraph-checkpoint-sqlite. Because relational store implementations serialize namespace tuples into dot-delimited strings without validating labels on read, search, delete, and batch operations, an attacker who controls a namespace label can inject periods (.) to traverse namespace boundaries and access, modify, or delete data belonging to other namespaces.
CVE-2026-115886 (GHSA-2wqp-q3c6-ccj5) is a Server-Side Request Forgery (SSRF) and Unsafe Reflection vulnerability in MLflow versions 3.12.0rc0 prior to 3.17.0. Unauthenticated REST API endpoints accept serialized third-party scorer JSON payloads that are dynamically deserialized and reflectively instantiated without sanitizing constructor keyword arguments. When optional dependencies such as trulens and trulens-providers-litellm are installed, attackers can inject egress-steering arguments into the scorer payload, forcing the MLflow server to dispatch outbound HTTP requests to arbitrary internal destinations or cloud metadata services.
CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.
CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.
CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.