Back to Intelligence

Ubuntu USN-8955-1: nginx Unauthenticated RCE and SSL Bypass — Detection and Remediation Guide

SA
Security Arsenal Team
October 26, 2026
8 min read

Ubuntu has published security advisory USN-8955-1, shipping fixes for multiple vulnerabilities in nginx — including an issue that permits unauthenticated remote code execution and a separate flaw that can bypass SSL/TLS protections. For any organization running nginx on Ubuntu LTS releases as a reverse proxy, API gateway, TLS terminator, or static web tier, this is a patch-now event. nginx sits on the network edge by design; a pre-authentication code execution flaw in that tier collapses your perimeter in a single request.

The full advisory is published at Ubuntu USN-8955-1. This post breaks down the defensive picture: what's affected, how to hunt for exploitation attempts and post-exploitation behavior, and exactly how to remediate and verify.

Technical Analysis

Affected Products and Platforms

The advisory applies to nginx as packaged for supported Ubuntu releases (LTS and interim releases still in support). Both the nginx-core, nginx-full, nginx-light, and nginx-extras package flavors are in scope, as are systems using nginx as a reverse proxy or TLS offload point. If your estate includes container images built FROM ubuntu with nginx installed via apt, those base layers are equally affected and must be rebuilt — patching the host does nothing for vulnerable containers.

Vulnerability Overview

USN-8955-1 bundles fixes for several distinct issues. The two that demand immediate attention from a defender's perspective:

  1. Unauthenticated code execution. A remote attacker can achieve code execution in the context of the nginx worker process (typically the www-data user) without any credentials. Exploitation requirements are low: network reachability to the listening HTTP/HTTPS service. While code execution as www-data is not root, it is a beachhead — from there attackers pursue local privilege escalation, credential harvesting from readable config (upstream API keys, database passwords in environment files), and lateral movement.
  2. SSL/TLS bypass. The second class of flaw undermines the confidentiality and integrity guarantees of nginx's TLS handling. Practically, this can mean traffic that operators believe is encrypted and authenticated is exposed to interception or manipulation — a serious problem for any deployment terminating TLS for sensitive applications (healthcare portals under HIPAA, cardholder data environments under PCI-DSS, authentication endpoints).

Attack Chain (Defender's View)

From a detection engineering standpoint, the exploitation chain looks like this:

  • Stage 1 — Delivery: Crafted HTTP(S) requests against the vulnerable nginx listener. Expect abnormal request sizes, malformed headers, or unusual protocol negotiation in access/error logs.
  • Stage 2 — Code execution: The nginx worker process (nginx: worker process) spawns a child — a shell (/bin/sh, /bin/bash), an interpreter (python3, perl, php), or a download cradle (curl, wget). This is the single highest-fidelity detection opportunity.
  • Stage 3 — Post-exploitation: Reverse shells, web shells dropped into served directories (/var/www/html, site document roots), cron or systemd persistence, and outbound C2 from the host.

Exploitation Status

At the time of writing, the advisory is newly published. No public proof-of-concept or confirmed in-the-wild exploitation has been formally attributed in the summary, and there is no CISA KEV entry yet — but pre-auth RCE in nginx is exactly the category of flaw that gets weaponized within days of disclosure, and internet-wide scanners will fingerprint unpatched servers quickly. Treat this as urgent: patch within your emergency change window, not your monthly cycle.

Detection & Response

The detections below focus on the highest-signal, lowest-noise behaviors: nginx spawning unexpected child processes, tampering with nginx configuration or served content, and web-shell indicators on the host. Tune the document-root paths to your environment.

Sigma Rules

YAML
---
title: Nginx Worker Spawning Shell or Interpreter
description: Detects the nginx worker process spawning a shell, interpreter, or download utility — a high-fidelity indicator of successful web server exploitation such as the unauthenticated RCE addressed in Ubuntu USN-8955-1.
references:
  - https://linuxsecurity.com/advisories/ubuntu/ubuntu-8955-1-nginx
  - https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/04/06
status: experimental
id: 3f8c1a7e-2b4d-4e9f-a6c1-8d5e2f7b9012
tags:
  - attack.execution
  - attack.t1059
  - attack.t1190
logsource:
  product: linux
  category: process_creation
detection:
  selection_parent:
    ParentImage|endswith: '/nginx'
  selection_child:
    Image|endswith:
      - '/sh'
      - '/bash'
      - '/dash'
      - '/zsh'
      - '/python'
      - '/python3'
      - '/perl'
      - '/php'
      - '/curl'
      - '/wget'
      - '/nc'
      - '/ncat'
      - '/socat'
  condition: selection_parent and selection_child
falsepositives:
  - nginx reload scripts or health-check wrappers invoked via worker context (rare; investigate rather than auto-exclude)
level: critical
---
title: File Creation in Nginx Web Root by Non-Deploy Process
description: Detects executable or script files written into nginx document roots outside of normal deployment tooling, consistent with web shell deployment following exploitation of the USN-8955-1 nginx vulnerabilities.
references:
  - https://linuxsecurity.com/advisories/ubuntu/ubuntu-8955-1-nginx
  - https://attack.mitre.org/techniques/T1505/003/
author: Security Arsenal
date: 2026/04/06
status: experimental
id: 9b2e4d61-7c3a-4f58-b1d4-6a9c0e3f5728
tags:
  - attack.persistence
  - attack.t1505.003
logsource:
  product: linux
  category: file_event
detection:
  selection_path:
    TargetFilename|contains:
      - '/var/www/'
      - '/usr/share/nginx/'
      - '/srv/www/'
  selection_ext:
    TargetFilename|endswith:
      - '.php'
      - '.py'
      - '.sh'
      - '.pl'
      - '.jsp'
  filter_deploy:
    Image|endswith:
      - '/git'
      - '/rsync'
      - '/ansible'
      - '/dpkg'
  condition: selection_path and selection_ext and not filter_deploy
falsepositives:
  - Manual content updates by administrators; CI/CD pipelines not yet in the exclusion list
level: high

KQL (Microsoft Sentinel / Defender)

For estates forwarding Linux syslog/auditd via the Azure Monitor agent or CEF, and for Defender for Endpoint onboarded Linux hosts:

KQL — Microsoft Sentinel / Defender
// Hunt: nginx spawning shells, interpreters, or download tools (post-exploitation indicator for USN-8955-1)
union isfuzzy=true
(DeviceProcessEvents
 | where InitiatingProcessFileName =~ "nginx"
 | where FileName in~ ("sh","bash","dash","zsh","python","python3","perl","php","curl","wget","nc","ncat","socat")
 | project TimeGenerated, DeviceName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, AccountName, RemoteIP
),
(Syslog
 | where ProcessName =~ "nginx" or Facility =~ "daemon"
 | where SyslogMessage has_any ("execve", "/bin/sh", "/bin/bash", "curl ", "wget ")
 | project TimeGenerated, Computer, ProcessName, SyslogMessage, SeverityLevel
)
| order by TimeGenerated desc
KQL — Microsoft Sentinel / Defender
// Hunt: anomalous request patterns against nginx (request-size/header anomalies preceding RCE attempts) via CEF/syslog ingestion
CommonSecurityLog
| where DeviceProduct has "nginx" or ApplicationProtocol =~ "HTTP"
| summarize RequestCount=count(), UniqueURIs=dcount(RequestURL), AvgSize=avg(to_long(SentBytes)) by SourceIP, DestinationHostName, bin(TimeGenerated, 5m)
| where RequestCount > 500 or AvgSize > 100000
| order by RequestCount desc

Velociraptor VQL

VQL — Velociraptor
-- Hunt artifact: nginx worker processes with unexpected children on Ubuntu hosts
SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE Ppid IN (
  SELECT Pid FROM pslist() WHERE Name =~ 'nginx'
)
AND CommandLine =~ 'sh|bash|dash|python|perl|php|curl|wget|ncat|socat'
VQL — Velociraptor
-- Hunt artifact: recently created script files in nginx document roots (web shell triage)
SELECT FullPath, Size, Mtime, Ctime, Mode
FROM glob(globs=['/var/www/**/*.php', '/var/www/**/*.sh', '/var/www/**/*.py', '/usr/share/nginx/**/*.php', '/srv/www/**/*.sh'])
WHERE Mtime > now() - 86400*3
ORDER BY Mtime DESC

Remediation and Verification Script

Bash / Shell
#!/usr/bin/env bash
# USN-8955-1 nginx remediation & verification — run on each Ubuntu host
set -euo pipefail

echo "=== Current nginx version ==="
nginx -v 2>&1 || echo "nginx not installed"

echo "=== Refreshing package metadata ==="
apt-get update

echo "=== Candidate (fixed) package versions ==="
apt-cache policy nginx nginx-common nginx-core nginx-full 2>/dev/null | grep -E 'nginx|Candidate'

echo "=== Applying security updates for nginx ==="
apt-get install --only-upgrade -y nginx nginx-common nginx-core nginx-full nginx-light nginx-extras 2>/dev/null \
  || apt-get install --only-upgrade -y nginx nginx-common

echo "=== Restarting nginx to load patched binaries ==="
nginx -t && systemctl restart nginx && systemctl is-active --quiet nginx && echo "nginx active post-patch"

echo "=== Post-patch version check (compare against USN-8955-1 fixed versions) ==="
nginx -v 2>&1
dpkg -l | grep -E '^ii\s+nginx' || true

echo "=== Quick compromise check: nginx child processes ==="
pgrep -aP "$(pgrep -o nginx)" || echo "No suspicious nginx child processes"

echo "=== Recent files in web roots (last 72h) ==="
find /var/www /usr/share/nginx /srv/www -type f \( -name '*.php' -o -name '*.sh' -o -name '*.py' \) -mtime -3 2>/dev/null | head -50

echo "=== Listening sockets owned by nginx ==="
ss -tlnp | grep nginx || true

echo "DONE — verify installed version matches the fixed release in https://linuxsecurity.com/advisories/ubuntu/ubuntu-8955-1-nginx"

Remediation

  1. Patch immediately. Run sudo apt update && sudo apt upgrade nginx (or the script above) on every Ubuntu host running nginx. Confirm the installed package version matches the fixed release listed in USN-8955-1. Do not rely on unattended-upgrades alone for internet-facing systems — force the update now.
  2. Restart, don't reload. A graceful nginx -s reload keeps old worker processes alive on the vulnerable binary until connections drain. Use systemctl restart nginx to guarantee the patched code is actually executing.
  3. Rebuild container images. Any Docker/OCI image based on Ubuntu with nginx installed must be rebuilt and redeployed. Scan running containers for the vulnerable package — docker exec <c> nginx -v and dpkg -l | grep nginx.
  4. Validate TLS posture post-patch. Given the SSL bypass component, re-test terminated endpoints with testssl.sh or SSL Labs after patching to confirm expected protocol/cipher negotiation behavior is restored, and review any session tickets or keys that may have been exposed — consider rotating TLS private keys on high-sensitivity endpoints.
  5. Hunt before you patch. Pull nginx access/error logs for the exposure window and look for malformed requests, unusual request sizes, or 5xx spikes preceding patch time. Run the VQL artifacts above. If you find nginx spawning shells, treat it as an incident: isolate the host, preserve memory and disk, and move to IR.
  6. Reduce the blast radius. Ensure nginx workers run as an unprivileged user, proxy_pass upstreams are scoped minimally, served directories are mounted read-only where possible, and outbound egress from web tiers is restricted to known destinations — this is what turns an RCE into a dead end.
  7. Compliance note. For PCI-DSS (Req. 6.2) and HIPAA environments, document this patch against your vulnerability management SLAs; critical, internet-facing, pre-auth RCE fixes belong in your shortest remediation tier (typically 24–72 hours).

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.