BUG/MEDIUM: stats: subject "stats admin" accesses to "stats scope" filtering
It was reported by Red Hat in partnership with AISLE Research that
proxies updated via a stats page in "stats admin" mode were not subject
to the filtering of "stats scope".
It is totally true and was never meant to be when "stats scope" was
added in 1.2 in 2006 while "stats admin" arrived 5 years later in 1.4,
nor was it even implied by the doc, but it is easy to see how someone
who would combine the two could expect them to work together:
- "stats scope" only limits which proxies are shown, the purpose being
to avoid polluting the page with a long list of auxiliary proxies that
take ages to render (e.g. those dedictated to stick-tables etc). A
common use case is to only show known frontends so that numerous
backends are not listed, it's most often used on public access.
- "stats admin" is used to permit to change a proxy or a server's
state and is protected using HTTP Basic auth, cleartext passwords
by default, and is mostly meant to be used from trusted sources,
hence private access.
The two are almost never seen together (no single occurrence found
in github issues for 92 occurrences of "stats admin" and 5 of
"stats scope"), but admittedly, if someone were to combine the two,
seeing buttons on the listed proxies only, they would surely expect
to only be able to act on those.
So in order to clear this void, this commit does the following upon
a POST:
- when a scope is defined, the requested proxy must exist and match
the list of permitted ones, otherwise a DENY is returned. This
ensures that the POST cannot be abused either to infer the existence
of a given proxy name.
- when no scope is defined, a non-existing proxy continues to return
an "unknown proxy" error.
The doc was updated to explain this new behavior. This commit should
be backported to stable versions, along with the previous patch it
depends on:
MINOR: stats: factor the proxy vs scope check into its own function
The stats code was split between 2.9 and 3.0, so the changes must all
be performed in stats.c before 3.0. Also, ctx->http_px does not exist
earlier, but http_px is simply the calling stream's backend (s->be at
some places).
Thanks to Red Hat and AISLE Research for reporting this.