Security & access

Disable NGINX AIO or SSI for CVE-2026-97205 and verify the mitigation

If NGINX uses AIO together with SSI, you can disable either feature to reduce exposure to CVE-2026-97205 while arranging a package update. If the site still needs SSI to assemble pages, consider disabling AIO. If it does not need SSI, disabling SSI is another option.

Diagram showing two mitigation choices: disable AIO while keeping SSI, or disable SSI to stop processing directives in web pages

Information checked on 28 October 2026. The image is a diagram. Test results below are expected criteria, not measurements from the author’s server.

What the vulnerability involves

CVE-2026-97205 is a use-after-free: code accesses memory after it has been released. It can occur in certain configurations using asynchronous file I/O, or AIO, with Server Side Includes, or SSI, pages containing include virtual commands.

A remote attacker may cause worker crashes or memory corruption. Code execution may be possible if ASLR is disabled or bypassed. Red Hat’s advisory lists disabling AIO or SSI as mitigations.

This example assumes NGINX on Linux managed by systemd. For a container deployment, inspect and reload the configuration inside the container actually serving requests.

Check whether the relevant features are enabled

Check the version and dump the configuration, including included files:

nginx -v
sudo nginx -T

Look for AIO settings such as:

aio on;

or:

aio threads;

Also look for:

ssi on;

Read the surrounding http, server and location blocks and relevant subrequest paths. Finding aio and ssi in unrelated parts of the files is insufficient to establish an affected request path. Do not assume that switching to aio threads avoids the vulnerability.

The defaults are aio off; and ssi off;, but included files or child locations can enable them. See the AIO reference and SSI reference.

Option 1: disable AIO and keep SSI

If the site uses SSI to include headers, footers or content from another URL, consider disabling AIO so page assembly can continue. Back up the file first, then replace relevant aio on; or aio threads; settings with:

aio off;

For example, an existing location:

location /pages/ {
    root /var/www/site;
    aio threads;
    ssi on;
}

After the change:

location /pages/ {
    root /var/www/site;
    aio off;
    ssi on;
}

This illustrates the setting to change. Retain your actual root, alias, authentication and other site settings. Also review locations reached by SSI include virtual subrequests.

If setting aio off; at the http level, check for server or location overrides that re-enable AIO. Disabling AIO changes file I/O behavior, so check response times and resource use under representative load, especially for large-file workloads. See the AIO documentation.

Option 2: disable SSI if the site does not need it

Change the sections enabling SSI to:

ssi off;

Review every location, including if blocks inside locations if they contain ssi on;. Edit the existing directive rather than adding a duplicate ssi off; in the same scope.

NGINX will stop processing SSI commands in responses. Pages relying on SSI may lose content, and directives or paths in HTML comments may be delivered literally to clients. Review the actual pages before choosing this option. See the behavior described in the SSI module documentation.

Choose the option that fits the application; the advisory does not require disabling both features together.

Validate and reload

Check the configuration syntax:

sudo nginx -t

Only after it passes, reload and inspect status. Run these commands individually and stop to investigate any error:

sudo systemctl reload nginx
sudo systemctl status nginx --no-pager
sudo journalctl -u nginx --since "5 minutes ago" --no-pager

Read the NGINX error log too. An active service does not prove it loaded the new configuration. Check for errors applying it and confirm old workers have finished draining, as described in the reload documentation.

Test the AIO mitigation

Inspect nginx -T again. Read scopes and included files to confirm AIO is not enabled on relevant paths. Check reload success, then test real SSI pages and files the site serves.

sudo nginx -T

With AIO disabled and SSI retained, pages should still assemble normally. However, curl does not report whether NGINX used AIO. An HTTP 200 is an application check; configuration review and reload evidence are also needed.

nginx -T reads files on disk rather than resolved settings from a worker’s memory. The NGINX command-line documentation explains its scope. Do not use that output alone to claim the running process changed.

Test the SSI mitigation

In staging, place an HTML file under the existing location being checked. Do not create a new location with different SSI settings, and do not enable SSI on production just to obtain a baseline.

Create ssi-check.html under the document root so its URL is /ssi-check.html:

BEGIN
<!--# include virtual="/ssi-fragment.txt" -->
END

Create ssi-fragment.txt so it is available at /ssi-fragment.txt:

SSI_INCLUDE_OK

This is an ordinary SSI behavior check, not an exploit payload. The include virtual syntax comes from the NGINX SSI reference.

Use curl to reach the origin directly. Replace the domain and IP with your own. If the location uses a URL prefix, adjust both the requested URL and the fragment path accordingly.

curl --noproxy '*' \
  --resolve example.com:443:203.0.113.10 \
  --max-time 10 -i \
  https://example.com/ssi-check.html

Check that this is the intended file, that Content-Type is text/html and that the response is not cached. Compare the body; the following are expected examples.

Before the change, with SSI processing:

BEGIN
SSI_INCLUDE_OK
END

After setting ssi off;:

BEGIN
<!--# include virtual="/ssi-fragment.txt" -->
END

If you instead set aio off; and retain ssi on;, the included content should still appear. This test checks SSI processing; it does not detect AIO state.

Read the curl response body because a browser hides HTML comments. Check all relevant paths, remove the test files you added when finished and retest real pages. Without a baseline where SSI processed successfully, seeing a literal directive once cannot establish that the recent change caused it.

Selected mitigationEvidence to check
Disable AIOConfiguration covers relevant paths without enabled overrides; reload succeeded and old workers finished
Disable SSIConfiguration and reload evidence plus a working before/after comparison showing SSI no longer processes
Either optionReal site behavior remains acceptable and every instance has been checked

Update the packages to fix the bug

NGINX upstream fixes CVE-2026-97205 in the stable branch from 1.30.6 and the mainline branch from 1.31.7, according to NGINX Security Advisories. For Ubuntu packages, compare full package versions with USN-8955-1, since fixes may be backported to an older release.

After updating, verify that the running process uses the patched binary. A configuration reload alone does not load a new executable. If using systemctl restart nginx, choose a window that can tolerate stopping and starting the service, then check logs and application behavior again. Passing the AIO or SSI checks demonstrates configuration mitigation; proving the bug is fixed also requires package and running-binary evidence.

EOF.← Back to articles