Fix note · OpenSearch Security Analytics · threat intelligence

OpenSearch S3_CUSTOM threat intel source: NoClassDefFoundError … AfterburnerModule, and the node exits.

What you see: the S3 connection test (POST /_plugins/_security_analytics/connections/s3/test) fails, or creating an S3_CUSTOM threat intel source stops the OpenSearch process, and the log says java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/afterburner/AfterburnerModule. It is not your bucket, role or IOC file: the error is raised while a Security Analytics class is being loaded, before any call to S3. In our lab (stock OpenSearch 3.8.0 and 3.9.0, security plugin disabled, no network), the connection test alone made the node exit: 2 runs out of 2 on 3.8.0, 1 out of 1 on 3.9.0. None of the 913 jars in the 3.8.0 image contains the missing class. Of the releases we tested, 3.6.0 is the newest where the connection test did not take the node down, and creating an IOC_UPLOAD source on 3.9.0 worked without touching the broken code.

Dong Nguyen, ATK New Technology · 29 October 2026 · measured on stock opensearchproject/opensearch 3.6.0, 3.7.0, 3.8.0 and 3.9.0 in our test container

Reported upstream as security-analytics#1851 (3.9.0.0). One node, security plugin off, REST API only, no network: nothing in our test reached AWS.

Stuck on Security Analytics right now? Email the request body, the log lines around the error and your OpenSearch version to support@atkvn.com. We run them on a test node of that version and reply within 24 hours with what it actually does. Free. Remove account IDs, bucket names and hostnames first.


How to check yours

Both checks are read-only. Run them on one node.

  1. Is it this bug? Search the node log for the class name:
    grep -n "AfterburnerModule\|InputCodecSchema\|fatal error in thread" /usr/share/opensearch/logs/*.log
    A hit on InputCodecSchema.<clinit> or Could not initialize class …InputCodecSchema means you are looking at this note.
  2. Is the class in your install?
    cd /usr/share/opensearch
    for j in $(find plugins lib modules -name '*.jar'); do
      unzip -l "$j" 2>/dev/null | grep -q 'jackson/module/afterburner/AfterburnerModule' && echo "$j"
    done
    No output means no jar provides it. In the 3.8.0 image we got no output from 913 jars.

1. What happens, measured

We started opensearchproject/opensearch:3.8.0 as one node with the security plugin disabled and --network none, so no request could leave the container. Then we sent the reporter’s exact body to the connection test:

POST /_plugins/_security_analytics/connections/s3/test
{"bucket_name":"test-bucket","object_key":"iocs.ndjson",
 "region":"eu-central-1","role_arn":"arn:aws:iam::123456789012:role/test-role"}

curl got no response. The node log showed:

fatal error in thread [Thread-8], exiting
java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/afterburner/AfterburnerModule
  at org.opensearch.securityanalytics.commons.connector.model.InputCodecSchema.<clinit>(InputCodecSchema.java:20)
  at org.opensearch.securityanalytics.services.STIX2IOCFetchService.constructS3Connector(STIX2IOCFetchService.java:276)
  at org.opensearch.securityanalytics.services.STIX2IOCFetchService.testS3ClientConnection(STIX2IOCFetchService.java:229)
  at org.opensearch.securityanalytics.services.STIX2IOCFetchService.testS3Connection(STIX2IOCFetchService.java:221)
  at org.opensearch.securityanalytics.transport.TransportTestS3ConnectionAction.doExecute(TransportTestS3ConnectionAction.java:41)

and the container stopped with exit code 1. Same result on a second fresh run, and on one run of 3.9.0 with the same script. Because the node was already gone, we could not run the second step (creating the S3_CUSTOM source) on either version.

The failure is in a static initialiser (<clinit>), so it happens the first time anything touches InputCodecSchema, whatever the bucket, region or role. A NoClassDefFoundError is an Error, not an Exception; OpenSearch treats an uncaught Error on a thread as fatal and exits.

Why the class is missing

In the 3.8.0 image, security-analytics-commons-1.0.0.jar is 12,642,708 bytes and has no com/fasterxml/jackson entries. Across all 913 jars under plugins, lib and modules, none contains AfterburnerModule. The issue quotes build.gradle: Jackson is left out of the commons jar “to avoid jar hell with alerting plugin” and is expected from the alerting plugin at runtime. In the 3.8.0 image we scanned, no jar under plugins, lib or modules, the alerting plugin’s included, provides AfterburnerModule; the reporter found the same in 3.9.0.

Our lab and the issue report differ on the first step

The reporter, on 3.9.0, got a 500 from the connection test, and the node exited only when they created the source. In our lab the connection test itself took the node down, on 3.8.0 and on 3.9.0. Their 500 was a security_exception, so their node had the security plugin on; ours did not. We have not tested with it on, and that may be the difference. In both reports, a call that loads this code path stopped the node.

2. Which versions

VersionConnection testAfterburnerModule in any jarCommons jar size
3.9.0node exits (1 run)0 of 94312,635,662 bytes, 0 Jackson entries
3.8.0node exits (2 runs)0 of 91312,642,708 bytes, 0 Jackson entries
3.7.0node exits (1 run)0 of 90912,642,708 bytes, 0 Jackson entries
3.6.0answered, node stayed up (1 run)1 of 855 (the commons jar itself)18,737,211 bytes, 1,035 Jackson entries

Of the releases we tested, 3.6.0 is the newest where the connection test did not take the node down. With no network it answered HTTP 200 with {"status":"FORBIDDEN","error":"Resource not found."}: an ordinary error reply, not a crash. There the commons jar still bundles Jackson, including AfterburnerModule. The two jar sizes match the figures the issue gives for the commons jar before and after it was rebuilt (18.7 MB and 12.6 MB). We did not check which release first shipped the smaller jar, and we did not test 3.5.0 or older.

3. What to do until it is fixed

Follow security-analytics#1851 for the upstream fix.

Limits of what we measured

Stock opensearchproject/opensearch 3.8.0 (28 October 2026, two runs), 3.9.0, 3.7.0 and 3.6.0 (29 October 2026), one node, security plugin off, plain HTTP, no network, in our test container. 3.6.0 and 3.7.0 were run once each, on 29 October 2026. We did not reach S3_CUSTOM source creation on 3.7.0 to 3.9.0, and did not test it with a schedule. Not measured: the security plugin on, real S3 with real credentials, a cluster, OpenSearch Dashboards, 3.5.0 or older, and IOC_UPLOAD with a large IOC set or inside a working detector.

Free check

Send us the Security Analytics call or rule that is not doing what you expect. The request body or rule, the log lines around the error and your OpenSearch version, with account IDs and hostnames removed. We run it on a test node of that version and reply within 24 hours with what it actually does. Free.

Send it

Free answer within 24 hours.

Paste the request body, the log lines around the error and your OpenSearch version below, with account IDs and hostnames removed, and say what you expected it to do. We reply within 24 hours with what it actually does.

Or email support@atkvn.com.