Consumer Wallet Organization Slug Enumeration Automation: When a 404 Answers a Question Nobody Asked It To

A 404 is information, even when nothing sensitive is on the page it points to
A URL that returns a different status code depending on whether some value exists is a very common, very natural web pattern — and it silently becomes a disclosure the moment the value being checked is itself something worth knowing, independent of whatever content the URL would otherwise show. Whether a specific company is a customer of a specific vendor is exactly this kind of value: unremarkable on its own, but not something every business wants trivially discoverable by a stranger typing guesses into an address bar, and not something a vendor should make discoverable without anyone deciding that it should be.
How the underlying problem shows up before you fix it
A URL includes an identifier (here, an organization's own slug) that a page uses as part of deciding what to render — and the existence check for that identifier happens directly against a real, authoritative table, rather than against a decision the system has already made independently of it.
Two categories of input to a public URL — one that corresponds to a real, registered record and one that does not — produce two different HTTP status codes, turning the status code itself into a one-bit answer to "does this exist?" for anyone willing to ask.
No authentication, rate limit beyond ordinary page-request handling, or special tooling is required to exploit the difference — a stranger can learn the answer with a single, ordinary web request per guess.
The information being disclosed (which named businesses use a particular vendor's product) is not sensitive in the way a password or a financial balance is, which makes it easy to underweight during a security review focused on what data a page displays rather than what a page's mere response code reveals.
The distinguishing behavior lives in routing and authorization logic, not in the page's visible content — meaning a review of what the page SHOWS a legitimate visitor would never surface the issue; only comparing responses across valid and invalid inputs would.
How the address bar stopped being an oracle
Centriu Loop's public consumer portal lives at a URL that names the specific business it belongs to by a short, human-readable slug the business itself chose — a natural, ordinary design for a public-facing page meant to be shared with that business's own customers. Before this fix, the page's own logic used that slug as part of deciding what to do: it queried the organizations table directly to confirm the slug corresponded to a real, registered Centriu Loop customer before proceeding.
That lookup, entirely reasonable as an implementation detail, had a side effect visible from outside the system entirely: a slug that matched a real organization let the request proceed to the portal itself, returning an HTTP 200 status. A slug that matched nothing returned a 404. Nothing about the portal's actual CONTENT was exposed in either case to someone without valid consumer credentials — but the STATUS CODE alone, which any browser or simple script receives automatically on every request, was enough to answer a specific, real question: is this company a Centriu Loop customer? A stranger could work through a list of company names, converting each into its likely slug format, and learn — with nothing more than ordinary web requests, no login, no special tooling — exactly which ones came back 200.
The underlying pattern is a common one specifically because it looks so unremarkable in isolation: checking whether a referenced record exists before proceeding is a completely standard piece of authorization logic, and 404-for-missing/200-for-found is the conventional, expected behavior for almost every other kind of URL on the web. The defect here was not the pattern in general — it was applying that pattern to an identifier whose mere existence-or-not is itself a fact some businesses would reasonably prefer not to be a public, machine-checkable signal, especially machine-checkable at zero cost and with no way for the affected business to know it had happened.
The fix removes the slug from the portal's authorization decision entirely, rather than trying to rate-limit or obscure the difference. The page no longer performs a lookup against the organizations table using the URL's slug as a search key at all — the slug plays no role in determining whether the request is authorized to proceed. Every address, whether it happens to match a real organization's slug or an arbitrary invented string, now returns the identical HTTP 200 status and renders the identical initial screen, which itself requires the separate, actual credential (covered on a companion page) before revealing anything at all. The question "does a company with this name use Centriu Loop" is no longer one the public URL structure can answer, for any input.
What is actually built today
The consumer portal's URL slug plays no role in the page's authorization decision — the page no longer queries the organizations table using the slug as a search key at all.
Every request to the consumer portal, regardless of whether its slug corresponds to a real, registered organization or an arbitrary invented string, returns the identical HTTP 200 status and renders the identical initial screen.
Determining which organization and consumer a session actually belongs to happens entirely through the separate, single-use credential mechanism (covered on a companion page) — never through anything present in the URL itself.
A business's own slug remains a convenient, human-readable way to share its own consumer portal link — this fix removes only the SIDE EFFECT of that slug also functioning as a public existence check, not the slug's own legitimate, cosmetic purpose.
The fix required no change to how a business chooses or is assigned its own slug — only to what the portal's own backend logic does with that slug once a request arrives.
Guessing company names, one status code at a time (illustrative framing of the actual fix)
Before the fix, someone curious whether a specific, named competitor used Centriu Loop could construct a plausible slug from that company's name, request the corresponding portal URL, and learn the answer directly from whether the response was a 200 (yes) or a 404 (no) — a single, unauthenticated web request, repeatable for any number of company names, with no trace distinguishable from ordinary traffic. After the fix, the identical request returns 200 regardless of the slug, disclosing nothing about which businesses are Centriu Loop customers through the URL structure itself.
What changes operationally
Centriu Loop's public consumer-portal URL no longer functions as a means of discovering which named businesses are Centriu Loop customers — every address responds identically regardless of whether its slug corresponds to a real organization, closing a public, unauthenticated enumeration path that required no login and no special tooling to use.
When this is not the right fit
This automation governs the internal authorization logic behind Centriu Loop's own public consumer-portal URL — it does not change how a business chooses, is assigned, or shares its own slug, does not add a customer-facing setting, and does not affect any OTHER Centriu system's own use of a slug in its URLs, which this fix does not touch.
Existence-based routing vs. routing that reveals nothing beyond a credential
Returning 404 for a URL segment that does not correspond to a real record is the ordinary, expected behavior across most of the web, and is usually the right choice — the risk is specific to a case where the very fact of a match is itself information someone has a reason to keep from being trivially, publicly checkable. Designing a public-facing route so that its response code depends only on whether a genuine credential is later presented — never on whether an identifier in the URL happens to correspond to something real — removes the question of existence from the URL's own observable behavior entirely, at the cost of a slightly less conventional 404 policy for that one specific route.
Related systems
Main system: Centriu Loop.
What it does NOT do
- Does not change how a business chooses, is assigned, or shares its own slug for its consumer portal link — the slug's cosmetic, human-readable purpose is unchanged; only its role in the authorization decision was removed.
- Does not affect any other Centriu system's own use of a slug in its own URLs — this fix is specific to Centriu Loop's public consumer portal route.
- Does not disclose anything about a specific consumer's balance or identity — that protection is provided separately by the credential mechanism covered on a companion page, unaffected by this fix.
- Does not retroactively identify whether any specific business's customer status was discovered through this path before the fix shipped — a team with that concern would need its own historical access-log review, which this fix does not provide.
- Does not overlap with the identifier-based lookup elimination fix or the rate-limiter race-condition fix — both are separate, independent mechanisms from the same source commit, covered on their own pages.
Security and governance
Centriu Loop's public consumer-portal URL no longer uses its own slug as part of any authorization decision — every address returns an identical response regardless of whether it corresponds to a real, registered organization, closing an unauthenticated enumeration path that previously let anyone discover which named businesses are Centriu Loop customers. Any personal data referenced remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.
Pricing and contracting
Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).
Frequently asked questions
What exactly could someone learn through this before the fix?
Whether a specific, named business was a Centriu Loop customer — nothing about that business's own consumer balances or records, which remained protected separately, but the bare fact of being a customer at all, discoverable through ordinary, unauthenticated web requests.
Did this require any special tooling or authentication to exploit?
No — a single, ordinary web request per guessed slug was sufficient. The difference between a real and an invented slug was visible in the plain HTTP status code, which every browser and basic script receives automatically.
Why is this considered a real issue if no consumer data was exposed?
Because whether a named company is a customer of a particular vendor is information some businesses reasonably prefer not to be publicly, trivially checkable by anyone — independent of whether any consumer-specific data was also exposed alongside it (in this case, it was not).
Does a business's slug still work as a portal link?
Yes — the slug still identifies the correct organization for a legitimate, credentialed consumer session. What changed is that the slug alone no longer determines the HTTP response before any credential is checked.
Is this the same fix as the consumer-credential page?
No — that page covers how a consumer proves who they are to see their own balance. This page covers a separate issue: what the mere URL structure revealed about which businesses use Centriu Loop, independent of any consumer identity.
What does Centriu Loop cost?
It is sold by subscription with a published starting price — exact current values are on the central pricing page.
See how Centriu Loop protects business identity in its public URLs
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.
