The example config allowlists public hosts that carry anyone's uploads #249

Closed
opened 2026-10-13 08:46:11 +02:00 by clawbot · 1 comment
Collaborator

Where: configs/config.example.yml lines 51-56; README.md lines 17-21 (Getting Started copies that file and changes only the signing key), on v1.0.0-rc1.

What is wrong: the example allowlists github.com and user-images.githubusercontent.com, besides three of the author's own hosts. Anyone can put an image on those two. A deployment made as Getting Started says serves, without a signature, every image anyone uploads there, at any size, format and quality: an open resizing service for the public internet, and the cheapest way to reach the processing-cost problems filed separately (an attacker-chosen 8192x8192 PNG is a few KB to upload).

How it fails: an outsider hotlinks or scripts /v1/image/user-images.githubusercontent.com/<their upload>/0x8192.avif against the deployment; each request is a full fetch and transcode on the operator's CPU and disk, and the cache fills with the attacker's variants.

Severity: medium

Definition of done:

  1. The example allowlist is empty, with a commented example entry under a domain of the operator's own, so a copied config serves nothing without a signature.
  2. Getting Started and "Running under upaas" in README.md say that an allowlisted host is an open proxy for everything on it and must be one the operator controls.
  3. make check green.

Model: fable-5-1

Where: `configs/config.example.yml` lines 51-56; `README.md` lines 17-21 (Getting Started copies that file and changes only the signing key), on `v1.0.0-rc1`. What is wrong: the example allowlists `github.com` and `user-images.githubusercontent.com`, besides three of the author's own hosts. Anyone can put an image on those two. A deployment made as Getting Started says serves, without a signature, every image anyone uploads there, at any size, format and quality: an open resizing service for the public internet, and the cheapest way to reach the processing-cost problems filed separately (an attacker-chosen 8192x8192 PNG is a few KB to upload). How it fails: an outsider hotlinks or scripts `/v1/image/user-images.githubusercontent.com/<their upload>/0x8192.avif` against the deployment; each request is a full fetch and transcode on the operator's CPU and disk, and the cache fills with the attacker's variants. Severity: medium Definition of done: 1. The example allowlist is empty, with a commented example entry under a domain of the operator's own, so a copied config serves nothing without a signature. 2. Getting Started and "Running under upaas" in `README.md` say that an allowlisted host is an open proxy for everything on it and must be one the operator controls. 3. `make check` green. Model: fable-5-1
clawbot self-assigned this 2026-10-13 08:46:11 +02:00
Author
Collaborator

Plan, as the definition of done says: configs/config.example.yml allowlists nothing, with one commented example entry under example.com naming a host the operator runs; Getting Started and "Running under upaas" in README.md say that every image on an allowlisted host is served without a signature, so an allowlisted host must be one the operator controls.

If an existing test reads the example config and depends on its hosts, the worker stops and says so on the PR.

Model: opus-5-5

Plan, as the definition of done says: `configs/config.example.yml` allowlists nothing, with one commented example entry under `example.com` naming a host the operator runs; Getting Started and "Running under upaas" in `README.md` say that every image on an allowlisted host is served without a signature, so an allowlisted host must be one the operator controls. If an existing test reads the example config and depends on its hosts, the worker stops and says so on the PR. Model: opus-5-5
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sneak/pixa#249