XHack Logo
XHack
Products
Services
Compliance
Pricing
Resources
Company
Sign upLogin
XHack Logo
XHackOffensive Security

Certified offensive security team delivering penetration testing evidence written for your auditor.

OSCP+OSCPC-AI/MLPenCASA
support@xhack.io

24/7 SOC Operations

XHack Status
Under attack? Get help now
Services
  • VAPT Services
  • Red Teaming
  • SOC Services
  • Threat Intelligence
  • Incident Response
  • Managed Testing
Pricing
  • Platform Plans
  • Services Pricing
Compliance
  • SOC 2
  • PCI DSS
  • ISO 27001
  • GDPR
  • HIPAA
  • ISO 42001
  • AI Maturity Assessment
  • TX-RAMP
  • NBFC / SECP
  • All Frameworks
Products
  • Vulnerability Assessment
  • GitGuard
  • AI Probe
  • SOC Dashboard
  • AI Agent
  • Cloud Investigation
Comparison
  • XBOW vs XHack
  • Horizon3 vs XHack
  • Strix vs XHack
  • Pentera vs XHack
Resources
  • Platform Tour
  • All Features
  • Install the Agent
  • XHack AI
  • Documentation
  • Blog
  • Case Studies
  • Documents
  • FAQ
Company
  • About Us
  • Our Team
  • Certifications
  • Security and Trust
  • VAPT Explained
  • Contact

© 2026 XHack. All rights reserved.

Security & TrustVulnerability DisclosurePrivacy PolicyTerms of ServiceRefund Policy
Blog/News

CVE-2016-3081: Why CISA Just Flagged This Ten-Year-Old Struts Exploit

XHack

XHack

Author

October 9, 2026

10 min read

CVE-2016-3081: Why CISA Just Flagged This Ten-Year-Old Struts Exploit

Table of contents

17

What CVE-2016-3081 Is, According to Apache

What CISA Added, and What It Did Not Say

Which Versions Are Affected by CVE-2016-3081, and Why the Sources Disagree

Why DMI Is the Switch That Matters for CVE-2016-3081

Public Exploits for CVE-2016-3081 Mean You Should Assume Attackers Can Do This

Finding CVE-2016-3081 in Your Own Estate, Step by Step

The Forensic Step Comes Before the CVE-2016-3081 Patch

How to Fix CVE-2016-3081 Safely

FAQ: CVE-2016-3081 Questions Answered

What is CVE-2016-3081?

Is CVE-2016-3081 being exploited?

Which Struts versions are affected by CVE-2016-3081?

What is the fix for CVE-2016-3081?

How do I know if CVE-2016-3081 was used against me?

Does disabling DMI fully protect me?

How XHack Helps Find Old Bugs Like This One

The Bottom Line on CVE-2016-3081

By Salman Khan, OSCP+, Founder of XHack, SRT (Synack Red Team member)

Read this in 30 seconds: CVE-2016-3081 is a command-injection bug in Apache Struts, reported in 2016, that lets a remote attacker run code on a server when Dynamic Method Invocation is enabled. CISA added it to its Known Exploited Vulnerabilities catalog on October 8, 2026, with a deadline of October 11 and a forensic-triage flag.

  • The bug is old, but the flag is new. The Struts advisory dates from 2016. CISA’s catalog entry is dated October 8, 2026. The catalog does not say why it was added now.
  • Apache and NVD disagree on the affected range. Apache lists 2.3.20 through 2.3.28, excluding two fixed releases. NVD starts at 2.3.19. Treat 2.3.19 as affected until you check it.
  • The fix is an upgrade or a setting. Upgrade to 2.3.20.3, 2.3.24.3 or 2.3.28.1, or turn Dynamic Method Invocation off.
  • Public exploit code exists. NVD’s references point to published exploits, so assume that attackers have what they need.
  • Check your logs before you patch. CISA’s forensic-triage flag means evidence should be preserved first.

A bug from 2016 is still on the list because old software is still running, and the people running it often don’t know it is there.

Apache Struts is a Java web framework, and CVE-2016-3081 lives in its core. It powers enterprise applications, and many of those applications were built years ago and rarely rebuilt. That is the context for CVE-2016-3081, and it explains why a flaw this old can still matter.

This article covers what the bug is, which versions are affected, why the sources disagree, how to find it in your own estate, and what to do before you change anything.

Affected and fixed Apache Struts versions for CVE-2016-3081, comparing Apache and NVD ranges
CVE-2016-3081: two sources, two affected ranges

What CVE-2016-3081 Is, According to Apache

Apache’s own bulletin, S2-032, describes the flaw directly. Attackers can pass a crafted expression that uses the method: prefix to run arbitrary code on the server. The bug applies only when Dynamic Method Invocation, or DMI, is enabled.

The bulletin credits Nike Zheng as the reporter, and rates the issue “Important.” It has a last-updated date of February 13, 2021, and does not give an original publication date in the page we read.

The NVD record carries the same weakness classification, CWE-77, which is command injection. NVD scores it CVSS 3.1 8.1 (High), with the vector AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H, and CVSS 2 9.3. The 3.1 score’s attack complexity is marked high (AC:H). That means the attacker needs conditions to line up, and in this case the main condition is the DMI setting.

What CISA Added, and What It Did Not Say

CISA’s catalog entry for CVE-2016-3081 is dated October 8, 2026. It carries a due date of October 11, the BOD 26-04 action text, a forensic-triage flag, and “Unknown” for known ransomware use. The entry’s notes link to Apache’s S2-032 page.

The catalog entry does not explain why CISA added a 2016 bug now. We looked, and we did not find a CISA statement or a vendor note that gives a reason. Several secondary aggregators list exploitation indicators, including exploit availability and a high predicted exploitation probability, but those are scoring services, not evidence of the events that prompted the listing.

We are therefore not going to tell you what changed. What we can say is that CISA considers the flaw exploited. Its entry points federal agencies to the BOD 26-04 deadline and forensic-triage guidance.

Which Versions Are Affected by CVE-2016-3081, and Why the Sources Disagree

This is where the sources most often confuse people, so here is the comparison for CVE-2016-3081.

SourceAffected rangeFixed releases
Apache S2-032 (primary)2.3.20 through 2.3.28, excluding 2.3.20.3 and 2.3.24.32.3.20.3, 2.3.24.3, 2.3.28.1
NVD (primary for NVD)2.3.19 to 2.3.20.2, 2.3.21 to 2.3.24.1, 2.3.25 to 2.3.28Not stated as a list in NVD’s description

The two lists differ on whether 2.3.19 is affected. Apache’s bulletin starts at 2.3.20. NVD’s range starts at 2.3.19. We cannot resolve that from the sources we read, so our advice is conservative: treat 2.3.19 as affected until you have confirmed otherwise against your own build.

The fixed-release list is consistent across the sources we checked, and that is the line to act on. Check which release line you run, and move to the fixed release on that line.

Why DMI Is the Switch That Matters for CVE-2016-3081

Dynamic Method Invocation is a Struts feature that lets an application call a method named in the request. It is powerful, and that power is the problem. When DMI is on, the method: prefix in a crafted expression can be interpreted as an instruction to run code.

Security write-ups describe the setting that controls DMI as a constant named struts.enable.DynamicMethodInvocation, which can be set in struts.xml or struts.properties. We found that name only in secondary sources, not in Apache’s documentation, so confirm it against the reference for your exact release before you change anything.

Disabling DMI is a mitigation, not a fix. It removes the vulnerable path, and it is a sensible safeguard even on releases you have upgraded, because the same write-ups describe later releases where DMI being enabled still allows the same kind of expression. Upgrading is still the step that closes the bug on the release you run.

Public Exploits for CVE-2016-3081 Mean You Should Assume Attackers Can Do This

NVD’s reference list includes a public exploit on Exploit-DB, a Packet Storm entry for a Struts 2.3.28 exploit, and a Rapid7 module reference. Those references are the reason we say public exploit code exists, and it is the reason the bug is dangerous in practice.

We are not going to walk through how the exploit works. The advisory describes the bug class, and the fix is in the upgrade. What matters for defenders is that a working exploit is widely available, which means a version check is not a safe answer on its own. You need to confirm that the version you run is fixed, and that DMI is off or the fixed release is in place.

Finding CVE-2016-3081 in Your Own Estate, Step by Step

Most Struts applications carry the framework inside a packaged web archive, so the first job is inventory.

Start with the build files. Check pom.xml, build.gradle and any lock files for the struts2-core dependency and its version. Then check what is deployed, because the version in source control is not always the version running in production.

For a packaged archive, you can list its contents and look for the core jar:

# List the Struts core jar inside a deployed web archive
unzip -l app.war | grep struts2-core

The version is part of the jar’s file name, so read it straight from the listing. Anything at 2.3.19 through 2.3.28 needs review against the table above.

Next, check the DMI setting in your configuration. Look for the constant named above in struts.xml and struts.properties. A missing setting does not prove DMI is off, because the default depends on the release, so check the release’s documentation rather than assuming.

Finally, search your web server and application logs for the method: prefix in request parameters. This is our suggestion rather than a published indicator, and it will produce false positives, since legitimate content can contain the same text. Review every hit by hand.

The Forensic Step Comes Before the CVE-2016-3081 Patch

CISA’s catalog flags CVE-2016-3081 for forensic triage. In practice that means you should preserve evidence before you patch, restart or rebuild anything, because a patch can overwrite the traces you need.

Before you change the application:

  1. Copy the access and application logs for the period you can still reach.
  2. Save a copy of the deployed archive and its configuration files.
  3. Record the running version and the DMI setting, so you can compare before and after.
  4. Only then upgrade or disable DMI.

If the logs show method: requests that you cannot explain, treat it as a possible compromise, and escalate before you assume the patch closed it.

How to Fix CVE-2016-3081 Safely

Work through these in order:

  1. Upgrade to a fixed release on your line. The fixed releases are 2.3.20.3, 2.3.24.3 and 2.3.28.1, according to Apache.
  2. If you cannot upgrade today, disable Dynamic Method Invocation, using the constant described above, after checking the change against your release’s documentation.
  3. Test the change in a non-production copy if your application depends on method invocation. Disabling DMI can break features that rely on it.
  4. Redeploy and re-check the version and the setting. Do not trust a build file that does not match what runs.
  5. Review the logs again after the fix, looking for requests that continue after the change.

FAQ: CVE-2016-3081 Questions Answered

What is CVE-2016-3081?

CVE-2016-3081 is a command-injection flaw in Apache Struts that lets a remote attacker run code on a server when Dynamic Method Invocation is enabled. It is reported in Apache’s S2-032 bulletin, and NVD classifies it as CWE-77.

Is CVE-2016-3081 being exploited?

CISA’s Known Exploited Vulnerabilities catalog lists it, with an entry dated October 8, 2026, a deadline of October 11 and a forensic-triage flag. The catalog does not explain why it was added now.

Which Struts versions are affected by CVE-2016-3081?

Apache lists 2.3.20 through 2.3.28, excluding 2.3.20.3 and 2.3.24.3. NVD starts its range at 2.3.19. Treat 2.3.19 as affected until you have confirmed otherwise.

What is the fix for CVE-2016-3081?

Upgrade to 2.3.20.3, 2.3.24.3 or 2.3.28.1, depending on your release line. If you cannot upgrade, disable Dynamic Method Invocation, after checking the setting against your version’s documentation.

How do I know if CVE-2016-3081 was used against me?

Preserve your logs, then search for method: in request parameters and review every hit by hand. Our search suggestion is not a published indicator of compromise, and a clean result does not prove the system is clean.

Does disabling DMI fully protect me?

It removes the vulnerable path. Upgrading is still the step that closes the bug on the release you run, and the forensic check still applies if the system was exposed.

How XHack Helps Find Old Bugs Like This One

Old framework bugs are often found by inventory rather than by a new exploit. Knowing which applications run which versions, and whether the risky feature is on, is most of the work.

Our AI VAPT services combine automated and human-led testing against exposed applications, and the inventory and version review above is part of that kind of work. A pentest report documents what was tested and what was found. It does not certify that an application is free of this bug, and it does not replace the upgrade.

If you test your own applications with XHack AI, the findings carry a CVSS v4.0 rating, a CWE, references, proof and reproduction steps. Review each one yourself before it goes anywhere, because an automated tool can be wrong in either direction.

The Bottom Line on CVE-2016-3081

CVE-2016-3081 is a decade-old Struts flaw that CISA has now listed as exploited, with a deadline of October 11 and a forensic-triage flag. Public exploit code exists, and the affected range is wider in some sources than others.

Inventory your Struts versions, preserve the logs, and then upgrade to a fixed release or turn Dynamic Method Invocation off. The fix is not complicated. The hard part is finding every copy that is still running.


Categories

News

Previous

Bug Bounty Methodology: The Honest 6-Phase Recon-to-Report Workflow

Next

Recon Automation for Bug Bounty Hunters: 7 Honest Rules for What to Automate

On this page

What CVE-2016-3081 Is, According to Apache

What CISA Added, and What It Did Not Say

Which Versions Are Affected by CVE-2016-3081, and Why the Sources Disagree

Why DMI Is the Switch That Matters for CVE-2016-3081

Public Exploits for CVE-2016-3081 Mean You Should Assume Attackers Can Do This

Finding CVE-2016-3081 in Your Own Estate, Step by Step

The Forensic Step Comes Before the CVE-2016-3081 Patch

How to Fix CVE-2016-3081 Safely

FAQ: CVE-2016-3081 Questions Answered

What is CVE-2016-3081?

Is CVE-2016-3081 being exploited?

Which Struts versions are affected by CVE-2016-3081?

What is the fix for CVE-2016-3081?

How do I know if CVE-2016-3081 was used against me?

Does disabling DMI fully protect me?

How XHack Helps Find Old Bugs Like This One

The Bottom Line on CVE-2016-3081

Related articles

Continue reading

CVE-2015-3306: The Critical ProFTPD Bug From 2015 That CISA Just Flagged

News

CVE-2015-3306: The Critical ProFTPD Bug From 2015 That CISA Just Flagged

CVE-2015-3306 is a CVSS 10.0 ProFTPD mod_copy flaw that lets anyone copy files without logging in. CISA flagged it as ex...

Read article
CVE-2026-76461: The Critical Cisco Email Gateway Bug Triggered by One Email

News

CVE-2026-76461: The Critical Cisco Email Gateway Bug Triggered by One Email

CVE-2026-76461 is a CVSS 9.8 SQL injection in Cisco Secure Email Gateway, exploited in the wild. Affected builds, fixes,...

Read article
CVE-2026-93616: The Critical Check Point Management Server Zero-Day

News

CVE-2026-93616: The Critical Check Point Management Server Zero-Day

CVE-2026-93616 is a CVSS 9.8 pre-auth zero-day in Check Point Security Management, exploited since July 23. Affected ver...

Read article