Repository navigation
Open
Labels
securityA credential, an exposure, or a control that is weaker than recordedA credential, an exposure, or a control that is weaker than recordedsensitivestacks/sensitive on trinity (VLAN 99)stacks/sensitive on trinity (VLAN 99)
Description
The weekly CVE scan found fixable HIGH or CRITICAL vulnerabilities in stirlingtools/stirling-pdf. This body is rewritten by every scan, and the issue closes itself when a scan finds the pinned digest clean.
The fix is normally the Dependabot bump for this image. If upstream has not released one, the fixed versions below say what to wait for.
stirlingtools/stirling-pdf:3.2.1
Stacks: sensitive. Digest: sha256:f95b691c3df463373258e21a578b404f1eb4c7660e8170a40e3e03c9c8f208a4.
| Severity | ID | Package | Installed | Fixed in |
|---|---|---|---|---|
| CRITICAL | CVE-2026-111497 | brotli | 1.2.0 | 1.2.1 |
| CRITICAL | CVE-2026-112393 | pillow | 12.3.0 | 13.0.0 |
| CRITICAL | CVE-2026-112398 | pillow | 12.3.0 | 13.0.0 |
| CRITICAL | CVE-2026-112403 | pillow | 12.3.0 | 13.0.0 |
| CRITICAL | CVE-2026-112900 | pillow | 12.3.0 | 13.0.0 |
| CRITICAL | CVE-2026-96639 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-109518 | apt | 2.8.3 | 2.8.4ubuntu0.1 |
| HIGH | CVE-2026-89407 | com.fasterxml.jackson.core:jackson-core | 2.21.5 | 2.18.11, 2.21.7, 2.22.3 |
| HIGH | CVE-2026-89425 | com.fasterxml.jackson.core:jackson-core | 2.21.5 | 2.21.7, 2.22.3, 2.18.11 |
| HIGH | CVE-2026-68497 | com.fasterxml.jackson.core:jackson-databind | 2.21.5 | 2.18.10, 2.21.6, 2.22.2 |
| HIGH | CVE-2026-91776 | com.fasterxml.jackson.core:jackson-databind | 2.21.5 | 2.18.11, 2.21.7, 2.22.3 |
| HIGH | CVE-2026-91777 | com.fasterxml.jackson.core:jackson-databind | 2.21.5 | 2.21.7, 2.18.11, 2.22.3 |
| HIGH | CVE-2026-102554 | com.google.guava:guava | 33.6.0-jre | 33.7.2 |
| HIGH | CVE-2026-109518 | libapt-pkg6.0t64 | 2.8.3 | 2.8.4ubuntu0.1 |
| HIGH | CVE-2026-111497 | libbrotli1 | 1.1.0-2build2 | 1.1.0-2ubuntu0.1 |
| HIGH | CVE-2026-84782 | libssl3t64 | 3.0.13-0ubuntu3.12 | 3.0.13-0ubuntu3.16 |
| HIGH | CVE-2026-84782 | openssl | 3.0.13-0ubuntu3.12 | 3.0.13-0ubuntu3.16 |
| HIGH | CVE-2026-75140 | org.jsoup:jsoup | 1.15.3 | 1.23.2 |
| HIGH | CVE-2026-75140 | org.jsoup:jsoup | 1.15.4 | 1.23.2 |
| HIGH | CVE-2026-112390 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112392 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112397 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112399 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112400 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112402 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112404 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112405 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112406 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112892 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112893 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112894 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112895 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112896 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112897 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-112902 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-96637 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-96640 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-96642 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-96643 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-96644 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-96778 | pillow | 12.3.0 | 13.0.0 |
| HIGH | GHSA-78g4-xqwv-q3g8 | pillow | 12.3.0 | 13.0.0 |
| HIGH | CVE-2026-89407 | tools.jackson.core:jackson-core | 3.1.5 | 3.1.7, 3.2.2 |
| HIGH | CVE-2026-89425 | tools.jackson.core:jackson-core | 3.1.5 | 3.1.7, 3.2.3 |
| HIGH | CVE-2026-68497 | tools.jackson.core:jackson-databind | 3.1.5 | 3.2.2, 3.1.6 |
| HIGH | CVE-2026-91776 | tools.jackson.core:jackson-databind | 3.1.5 | 3.1.7, 3.2.3 |
| HIGH | CVE-2026-91777 | tools.jackson.core:jackson-databind | 3.1.5 | 3.1.7, 3.2.3 |
Written by .github/workflows/cve-scan.yml in this run.
Metadata
Metadata
Assignees
Labels
securityA credential, an exposure, or a control that is weaker than recordedA credential, an exposure, or a control that is weaker than recordedsensitivestacks/sensitive on trinity (VLAN 99)stacks/sensitive on trinity (VLAN 99)
Activity
Gerrrt commentedon Oct 10, 2026
Triage, 2026-10-10: waiting on upstream. Nothing to change here, and the next bump won't fix this.
stirlingtools/stirling-pdf:3.1.0@sha256:b5b9e400…(the current:latest) with the same trivy invocationscripts/scan-images.shuses (aquasec/trivy:0.75.0,--severity HIGH,CRITICAL --ignore-unfixed). It reports the same 14 HIGH findings as the pinned 3.0.2: jackson-core/databind 2.21.5 and 3.1.5, jsoup 1.15.3/1.15.4, and Ubuntu's openssl 3.0.13-0ubuntu3.12. Merging that PR won't close this issue. Review it as a feature release on its own merits (it adds Stirling Office Convert, beta).stacks/sensitivegets merged, homelab-converge-sensitive deploys it within the hour (Nothing converges stacks/sensitive: the tier with the real data is the only one deployed by hand #533), and the next scan closes this issue if the new digest is clean./tmp, and LibreOffice runs under Landlock and seccomp (STIRLING_LO_SANDBOX=required). The findings are in parsers (Jackson's JSON and jsoup's HTML), so the input that could reach them is what a household member uploads. With 0 critical findings, we're not building and patching our own image. We take upstream's release instead.Gerrrt commentedon Oct 10, 2026
This is waiting on upstream. Nothing in the repo needs to change.
stirlingtools/stirling-pdf:3.0.2(sha256:c1959253…).pin-digests.shreports no drift, so the tag hasn't been rebuilt since it was pinned.com.fasterxml.jackson.core:jackson-databind: 3 findings, fixed in 3 different versions (see the table)tools.jackson.core:jackson-databind: 3 findings, fixed in 2 different versions (see the table)com.fasterxml.jackson.core:jackson-core: 2 findings, fixed in 2 different versions (see the table)org.jsoup:jsoup: 2 findings, fixed in 1.23.2tools.jackson.core:jackson-core: 2 findings, fixed in 2 different versions (see the table)libssl3t64: 1 finding, fixed in 3.0.13-0ubuntu3.16When upstream rebuilds or ships a release with these fixes, Dependabot should open the bump. Check it with trivy and
check_image_pins.py, then deploy. The next scan will then close this issue.Gerrrt commentedon Oct 10, 2026
Rechecked 2026-10-10. Upstream hasn't moved: 3.1.0 is still the latest release (digest
sha256:b5b9e400…, unchanged), and Stirling-Tools/Stirling-PDF#8252 is still open. Dependabot's #1138 (3.0.2 → 3.1.0) is open with CI green. As triaged above, it doesn't change this issue's findings.jsoup was the one finding without a known upstream owner. It has one now. Scanning 3.1.0 with our pinned trivy gives its two copies:
app/lib/jinjava-2.8.4.jarjinjava.org.jsoup), so no Gradle force in Stirling can replace itapp/lib/jsoup-1.15.4.jarjinjava 2.8.4 is the latest on Maven Central. The fix is HubSpot/jinjava#1337 ("Bump jsoup to 1.23.2"), which is open, along with issues HubSpot/jinjava#1335 and #1342. So jsoup clears only after a jinjava release ships that change and Stirling bumps
jinjavaVersion.Updated wait-list, all already reported upstream, so nothing to file:
3.0.13-0ubuntu3.12→.16): Pin Netty, Jackson and base image Python deps past the Spring BOM Stirling-Tools/Stirling-PDF#8252.Gerrrt commentedon Oct 10, 2026
The 14 HIGHs, traced, 2026-10-10
There are no criticals (a fresh trivy 0.75.0 scan of the pinned
stirling-pdf:3.0.2@sha256:c1959253…agrees). The 14 HIGH rows are 7 CVEs, because Jackson 2.21.5 and Jackson 3.1.5 each carry the same five. For each advisory I took its precondition and searched the bytecode of Stirling's own jars (app.jar,proprietary-3.0.2-plain.jar,common-3.0.2-plain.jar) and all 410 jars in/app/lib. I also mapped the paths Stirling serves before login (RequestUriUtils,UserAuthenticationFilter). WithSECURITY_ENABLELOGIN: "true"set, those areauth/login,auth/refresh,invite/*,webhooks/,workflow/participant/and some GET info routes.Result: nothing is reachable without a login or a signing invitation. One Jackson CVE (a CPU DoS) is reachable by a signing participant or by someone who can create a signing workflow.
JsonFactory.createParser(DataInput)createParser(DataInput)overload.javax.xml.datatype.Duration/XMLGregorianCalendarfields@JsonTypeInfo(use = NAME, defaultImpl = …)(a fallback for unknown type IDs)@JsonTypeInfowithNAME(Condition,ConditionInput,Schedule,AiEngineProgressDetail). None setsdefaultImpl, so an unknown ID fails instead of being cached.@JsonIdentityInfocollections or maps with forward references@JsonIdentityInfo.NumberInput.looksLikeValidNumber)Double/Float/BigDecimal/Number(databind'sNumberDeserializers/StdDeserializer, and Jackson 3'sStringNode)POST /api/v1/workflow/participant/submit-signature. ItswetSignaturesDatais read intoWetSignatureMetadata, which hasDoublex, y, width and height. That route is login-exempt, butsubmitSignaturefirst runsensureSigningEnabled, thenfindByShareToken(participantToken)(else 404), then rejects expired or completed participants and inactive sessions, and only after that parses the JSON. No other@RequestBodycontroller binds a DTO with numeric fields. The login DTOs (UsernameAndPassMfa,MfaCodeRequest) have none.XmlTreeBuilder/Parser.xmlParser()) on deeply nested, uniquely-namespaced inputFlexmarkHtmlConverter(HTML to Markdown), which uses the HTML parser, neverxmlParser/XmlTreeBuilder. The jinjava copy is used only byAiDocumentHtmlRenderer, and we run withAIENGINE_ENABLED: "false".What that leaves. One CPU-DoS path, open to whoever holds a signing link, or to a household member who can create one. Stirling isn't published and is reachable only through Caddy at
pdf.matrix.elysium, and it has a CPU ceiling. This doesn't change the triage above: no rebuild, and take the upstream release that brings Jackson 2.22.3/3.1.7 (Stirling-Tools/Stirling-PDF#8265 is merged and #8252 is open).What would change this:
To reproduce:
🤖 Traced by Claude Code
Gerrrt commentedon Oct 10, 2026
The signing path, traced to the end, 2026-10-10: CVE-2026-89407 isn't reachable either
This follows up the trace above, which left one Jackson CVE as "reachable only with a valid participant token" through
POST /api/v1/workflow/participant/submit-signature. I traced that path to the end against the runningsensitive-stirling-pdfon trinity. The signing feature is off, so the path closes before any JSON is parsed, for anonymous and logged-in users alike.The gate.
WorkflowSessionService.ensureSigningEnabled()readsstorage.enabledandstorage.signing.enabledand throws403 "Group signing is disabled"unless both are true. The live/configs/settings.ymlhasstorage.enabled: falseandstorage.signing.enabled: false, and noSTORAGE_*environment variable overrides them.Every route hits the gate first. All 21 mapped workflow endpoints call
ensureSigningEnabledas their first invocation:WorkflowParticipantController:getSessionByToken,getParticipantDetails,submitSignature,declineParticipation,getDocument,validateCertificate.SigningSessionController:listSessions,createSession,getSession,deleteSession,addParticipants,removeParticipant,getSessionPdf,finalizeSession,getSignedPdf,listSignRequests,getSignRequestDetail,getSignRequestDocument,signDocument,declineSignRequest,validateCertificate.What sits behind it, for when signing is on.
submitSignaturedoes these in order:ensureSigningEnabled;participantTokenis present;findByShareToken(404 otherwise);buildSubmissionMetadata.buildSubmissionMetadataparseswetSignaturesDatawith Jackson 3 (tools.jackson.databind.ObjectMapper) intoWetSignatureMetadata. That hasDoublex/y/width/height, which is where a string-to-number coercion would hit the CVE-2026-89407 regex. Creating a session (SigningSessionController) needs a login and the same gate.Updated verdict for #1004: none of the 14 HIGHs is reachable as deployed. The previous comment's one exception is closed by
storage.signing.enabled: false.What would change this: turning on
storage.enabledtogether withstorage.signing.enabled(both marked ALPHA in Stirling's settings). If that's ever wanted, take the Jackson 3.1.7 release first.To reproduce:
🤖 Traced by Claude Code
Gerrrt commentedon Oct 11, 2026
Re-traced on 3.1.0, 2026-10-11, with a correction to the 3.0.2 verdict
#1138 moved Stirling-PDF to
3.1.0@sha256:b5b9e400…, and it has been running on trinity since 2026-10-10 22:29 UTC. A fresh trivy 0.75.0 scan gives the same 14 HIGH rows (7 CVEs) as 3.0.2. I re-ran the whole trace against 3.1.0 (own jarsapp.jar,proprietary-3.1.0-plain.jar,common-3.1.0-plain.jar, plus all of/app/lib), and re-checked the live settings.Unchanged from 3.0.2:
createParser(DataInput)(89425), and nojavax.xml.datatypefields (68497).@JsonTypeInfois only onCondition/ConditionInput/Schedule/AiEngineProgressDetail, none withdefaultImpl(91776). No@JsonIdentityInfo(91777).AiDocumentHtmlRenderer, andAIENGINE_ENABLED=false.WorkflowParticipantController, which is still behindensureSigningEnabled. Live,storage.enabled,storage.signing.enabledandstorage.sharing.enabledare allfalse, withSECURITY_ENABLELOGIN=true.Correction: CVE-2026-89407 is reachable after login, on 3.0.2 and 3.1.0 alike. The earlier comments checked only
@RequestBodyDTOs, but 94 of Stirling's own classes runObjectMapperthemselves on JSON form fields. Here are the triggers in jackson-databind:looksLikeValidNumberfromNumberDeserializer.deserializeandStdDeserializer._parseFloatPrimitive, plus the Double/Float/BigDecimal deserializers.StringNode._tryParseAs*(Integer, Long, BigInteger, Float, Double, BigDecimal). So tree-model code reading a JSON string node as any number hits the regex.Two ordinary tools do that with user input, both on Jackson 3 and identical in 3.0.2:
FormFillController,/api/v1/form, thenFormPayloadParser) reads numbers from parsed JSON tree nodes.PdfJsonConversionService) binds user JSON intoPdfJson*types with float/double fields.So a logged-in Stirling user can submit a long digit-run string where a number is expected and burn CPU quadratically in the request thread. This is from the code structure; I didn't exercise it. The other 13 classes found by the same search sit behind features that are off or unconfigured: AI classify and workflows, vector DB and external API integrations, the license check, policy store, account linking, math auditor and portal.
Exposure: a Stirling login is required, and accounts are the household's. Stirling is capped at
cpus: 2, so it degrades Stirling only, not trinity. There's no data access. This is the same class of finding as "authenticated users can make the service do expensive work", and it doesn't change the decision: take the upstream Jackson 3.1.7/2.21.7 release when it ships. #1004's open items are still Stirling-Tools/Stirling-PDF#8252 (Jackson 3 and the base image) and a release containing it.To reproduce:
🤖 Traced by Claude Code
[-]Fixable CVEs in stirlingtools/stirling-pdf (0 critical, 14 high)[/-][+]Fixable CVEs in stirlingtools/stirling-pdf (6 critical, 37 high)[/+]github-actions commentedon Oct 26, 2026
New since the last scan: CVE-2026-112390, CVE-2026-112392, CVE-2026-112393, CVE-2026-112397, CVE-2026-112398, CVE-2026-112399, CVE-2026-112400, CVE-2026-112402, CVE-2026-112403, CVE-2026-112404, CVE-2026-112405, CVE-2026-112406, CVE-2026-112892, CVE-2026-112893, CVE-2026-112894, CVE-2026-112895, CVE-2026-112896, CVE-2026-112897, CVE-2026-112900, CVE-2026-112902 and 9 more.
[-]Fixable CVEs in stirlingtools/stirling-pdf (6 critical, 37 high)[/-][+]Fixable CVEs in stirlingtools/stirling-pdf (6 critical, 39 high)[/+]github-actions commentedon Nov 2, 2026
New since the last scan: CVE-2026-102554, CVE-2026-111497.
[-]Fixable CVEs in stirlingtools/stirling-pdf (6 critical, 39 high)[/-][+]Fixable CVEs in stirlingtools/stirling-pdf (6 critical, 41 high)[/+]github-actions commentedon Nov 9, 2026
New since the last scan: CVE-2026-109518.