Build1 publisher3 min readPublished
AWS's extended SQS and SNS clients inherit Jackson pins from a library last released in March 2024
AWS's Java extended clients for large SQS and SNS messages pull Jackson versions with seven known advisories via a library last released in March 2024. Kotlin services now have ports on Maven Central that take Jackson out of that code path.
The Engineer · Build desk

What happened
- AWS offers the S3 claim-check pattern for large messages as two Java libraries, one for SQS and one for SNS, both built on a shared payload-offloading common library.
- That common library, payloadoffloading-common 2.2.0, was last released in March 2024 and pins jackson-databind 2.15.2 and jackson-core 2.16.0.
- As of September 2026 the GitHub Advisory Database lists seven advisories against those exact Jackson versions, three rated high, according to the ports' author.
- Developer Christoph Sens has published three Kotlin ports on Maven Central, s3overflow, sqsoverflow and snsoverflow, for services built on aws-sdk-kotlin.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint Java users cannot clear the scanner findings by upgrading the SQS client; the pin moves only when payloadoffloading-common ships again or when a team overrides Jackson itself.
- cost Teams staying on the Java clients pay either in repeated triage of the same findings on every scan or in running Jackson versions the library was never tested against.
- decision SQS workloads whose messages all fit under the 1 MiB limit can weigh dropping the extended client entirely, along with its Jackson dependency.
- exposure Kotlin teams that migrate put their large-message delivery path on a 1.1.0 library ported by one developer, in place of a slow-moving AWS one.
The Jackson exposure in AWS's extended clients is narrower than a scanner report suggests. Christoph Sens, who ported the clients to Kotlin, wrote that "whether an advisory is exploitable depends on how Jackson is used, and the extended clients only (de)serialize a small pointer object" [8][20]. The advisories include bypasses of Jackson's polymorphic type validation and a denial-of-service bug in the async parser [4]. Seven advisories is a lot of paperwork for a small pointer. The paperwork also repeats: "every dependency scanner flags these versions, someone has to triage the findings again and again," Sens wrote [9].
The pin sits one layer below the clients. July's SQS release left it in place [5]. Neither the common library nor the SNS client has shipped since March 2024 [6]. By the September 2026 advisory count, the component that owns the Jackson versions had gone 30 months without a release [1].
Java teams can override Jackson in their own build [9]. Sens's objection is that "forcing newer Jackson versions under a library that was never tested against them is its own risk" [9]. The Java libraries also compile for Java 8 and keep separate sync and async classes with largely duplicated pass-through code [11]. His answer is removal. "Removing Jackson from this code path makes the question disappear," he wrote [10].
The port gets substitution right. SqsExtendedClient is an SqsClient, so it goes anywhere a plain client goes [13]. Because aws-sdk-kotlin clients are suspend-based, one class replaces the Java pair of AmazonSQSExtendedClient and AmazonSQSExtendedAsyncClient [13][11]. Below the size threshold, a message goes straight to SQS. Above it, the body goes to S3 and the queue carries a small JSON pointer plus an ExtendedPayloadSize attribute [14]. Receive fetches the object. Delete removes it too, through cleanupS3Payload, on by default [15].
SNS has no receive side, so a topic that fans out to SQS with raw message delivery relies on sqsoverflow's client at the subscriber [19]. I'd set cleanupS3Payload explicitly on those queues. If several subscribers resolve pointers to one S3 object, the default lets the first delete remove it before the others have fetched it [15][19].
The size limits moved under both libraries. SQS has accepted 1 MiB, body plus attributes, since August 2025, up from 256 KiB [16], a fourfold rise [2]. SNS still defaults to 256 KiB, though since September 2026 a topic can take 1 MiB once its MaximumMessageSize attribute is raised [17]. sqsoverflow offloads at 1 MiB by default and snsoverflow at 256 KiB, both adjustable through payloadSizeThreshold [18].
For a Kotlin service, I think the port is the right call. The Java clients wrap the AWS SDK for Java v2 clients, so they never fit aws-sdk-kotlin [7]. The cost is taking on sqsoverflow 1.1.0, a library one developer ported, in place of AWS's own [12][7].
What to watch
- A new payloadoffloading-common release that moves off jackson-databind 2.15.2 and jackson-core 2.16.0 would clear the findings for Java users without any migration.
- Whether sqsoverflow's JSON pointer can be read by AWS's Java extended client decides if mixed Java and Kotlin fleets can share a queue during a migration.
- Whether the ports keep shipping past 1.1.0 at a faster cadence than the AWS libraries they replace.