Safeguard
Application Security

Your Admin Panel Has the Most Access and the Least Review

It can read every customer's data because that is its job, it was built quickly for an audience of colleagues, and it has never been part of a release anyone examined closely.

Aman Khan
AppSec Engineer
5 min read

Your admin panel has the most access of anything you run and the least review of anything you ship. It was built quickly, by whoever needed it, for an audience of colleagues, and it has never been part of a release anyone examined closely.

It can read every customer's data, because that is its job. Which makes the question of who can reach it, and what it records, considerably more important than the code quality of the feature that prompted it.

This post is what to get right in internal tooling. For whoever maintains the thing support uses.

It usually bypasses your authorisation layer

The product has a repository layer, tenant scoping, permission checks. The admin panel frequently does not, because it was written to see across tenants and the easiest way to do that was to go around the layer that prevents it.

Once it does, every guarantee you rely on elsewhere stops applying inside it. A bug in an admin view is not bounded by tenancy, because nothing in that path enforces tenancy.

The better shape is for the admin tool to use the same data access layer with an explicit, logged escalation, rather than a separate path with no constraints. That way the scoping is present by default and crossing it is a recorded act rather than the normal mode.

Authentication is often weaker, not stronger

The pattern to look for: a shared login because it predates individual accounts, no second factor because it is internal, an IP allowlist as the primary control, and a session that lasts a week.

Every one of those is backwards for the tool with the most access. It needs individual accounts, mandatory hardware-backed second factor, short sessions, and the same identity provider as everything else so that deprovisioning works. An IP allowlist is a useful layer and not a substitute, particularly now that "on the office network" describes a laptop on a home connection through a VPN.

Distinguish looking from acting

Three capabilities that get bundled and should not be:

Aggregate views. Counts, status, whether something happened. Low risk, most of the daily need.

Reading a specific customer's data. Needed for support, and it is access to their information. It should require a reason, be logged with that reason, and ideally be scoped to the customer who raised the ticket.

Acting as a customer. The most powerful and the one that should be rarest. Logged on both sides, recorded on every resulting row so the audit trail shows the real actor, and time-bounded.

Most support questions are answerable from the first two. Bundling all three behind one role means every support engineer holds the third permanently.

Injection in an admin panel is worse

Cross-site scripting in your customer-facing application runs with a customer's privileges. The same bug in your admin panel runs with an operator's, which can read any customer's data and often change it.

And admin panels are full of unescaped user content by design: they display what customers submitted so an operator can look at it. A support view rendering a customer's profile field, ticket body or uploaded filename is rendering attacker-controlled data to a highly privileged viewer.

That makes output encoding in internal tooling more important than in the product, which is the opposite of how it is usually prioritised. Render customer content as text, never as markup, and if you must display HTML, sandbox it.

Log everything, and make it reviewable

Every view, every action, every impersonation, with the operator, the customer, the reason, and the time. This is the tool where an audit trail is most likely to be needed and least likely to exist.

Then actually read it. A monthly sample of impersonation events, checking each against a ticket, takes twenty minutes and is the control that makes the rest credible. An audit log nobody reads deters nobody, because deterrence requires the belief that someone looks.

Expose it narrowly

It should not be on the public internet at a guessable hostname with only a login form in front of it. Behind your identity-aware proxy, or requiring a network position, or at minimum with the login rate limited and alerting on failures.

And check what your admin hostname reveals. admin.yourproduct.com in certificate transparency logs tells an attacker exactly where to look, which is an argument for an obscure hostname as a small additional layer rather than as a control.

The concession

Internal tools are built quickly because the alternative is that support cannot do their job, and a company that applies its full release process to an internal panel will ship it late and support will use the database directly instead. That outcome is worse in every respect.

So the proportionate position is to be strict about four things and relaxed about everything else: individual authenticated accounts with a second factor, tenant scoping present by default, customer content rendered as text, and every access logged with a reason. Those four are compatible with building quickly. Code review depth, test coverage and interface polish can stay lower than the product's, because they are not what makes this tool dangerous.

The implication

The admin panel is where your security model has an official exception, and exceptions are where things go wrong.

Ask who can reach yours, what happens if one of those accounts is phished, and whether anyone would be able to reconstruct what was viewed. Those three answers describe your actual exposure to customer data far better than anything in your product's threat model.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.