Your web app's admin console shares a hostname and session with the public site - how do you model it?
answer
- same host is not one surface
- boundary sits inside the process
- crossing is where rights are granted
- model the logged-in low-privilege user
- elevation leads, repudiation follows
basics
~20 sModel the privileged routes as their own surface, with a boundary drawn inside the process and crossed where a handler decides a session may act with elevated rights. Elevation of privilege dominates the result, and record-changing flows add repudiation.
solid answer
~50 sSharing a hostname and a session cookie does not make one surface. Draw a second boundary inside the process, around the handlers that act with elevated rights, and place the crossing exactly where code decides this session may act as an administrator. Then enumerate against that crossing: reaching a privileged route directly rather than through the menu, a role fact taken from somewhere the client can influence, one handler serving both audiences and branching on a request parameter, a privileged action whose only check is that the link was not rendered. On a university course-registration portal the attacker worth modeling is not an anonymous stranger but an enrolled student, and the asset is the record - a changed grade, a back-dated drop. So elevation of privilege leads. Repudiation follows: the model should demand that every privileged action is attributable, or nobody can later prove who made the change.
go deeper
Be able to say that privileged routes form their own surface even on one hostname, and that removing a link from the menu is rendering, not a control.
Explain where the boundary line goes inside a single process and why the crossing is the moment a handler grants rights, not the moment a page renders. Name the specific threats you enumerate against it.
Demonstrate that you model the authenticated low-privilege user by default, that you predict which categories dominate before anyone tests, and that you insist on attributable records for privileged actions.
Own whether privilege tiers deserve separate services, separate models and separate ratings, and be able to say what a team loses when it blends two attacker populations into a single risk number.
## One deployment, two surfaces A surface in a threat model is defined by **who can reach it and what it can do**, not by DNS. A university course-registration portal that serves students, faculty and a registrar back-office console from one server-rendered app on one hostname has at least two surfaces, because the population that can reach the registrar functions and the damage those functions can do are both different from the public ones. Collapsing them because the deployment is single gives you one blended threat list and one blended risk rating that describes neither. ## Where the boundary line goes The useful move is to draw a boundary **inside the process**. On the diagram it encloses the handlers that act with elevated rights, and the crossing is the exact point in the request lifecycle where a decision is made that this session may act as a registrar. That is a real boundary even though no network, container or hostname separates the two sides, because a boundary on a diagram is a claim that *something checks here*. If you cannot name the check, you have drawn a wish rather than a boundary - which is itself a useful finding to surface in a review. Drawing it forces the enumeration to be specific. Against that one crossing: - **Reaching a privileged route directly.** The link is not in a student's navigation, but navigation is rendering, not authorization. The request can be issued regardless. - **A role fact sourced from the wrong side.** Anything the client can influence - a parameter, a field the page round-trips, a value chosen by the client and echoed back - cannot be the input to the decision. The authority has to be server-side state or a server-verified assertion. - **A shared handler that branches.** One endpoint serving both audiences and deciding by request content is the classic place the check gets skipped on one path. - **A second-step gap.** The entry screen checks the role; the action that follows assumes the entry screen was passed. Each privileged action needs its own decision, because each is separately reachable. - **Read versus write asymmetry.** Listing views often get a weaker check than the mutating action next to them, and the listing is frequently where the sensitive record is exposed. ## Why elevation dominates, and what comes second STRIDE gives six categories, each violating one property: spoofing violates authentication, tampering violates integrity, repudiation violates non-repudiation, information disclosure violates confidentiality, denial of service violates availability, elevation of privilege violates authorization. On a privileged path inside an application the crossing you have just drawn is an **authorization** crossing, so elevation of privilege is what the diagram is asking about. It is worth being precise here: an authenticated student reaching a registrar function is not spoofing - the identity is genuine and correctly established. What went wrong is the rights attached to it. Repudiation comes second and is often underweighted. The asset behind a registrar console is not only the data but **the credibility of the record**. A grade change or a back-dated add/drop has value precisely because the institution can assert it happened, by whom and when. So the model should record an explicit requirement: every privileged action produces an attributable, tamper-evident entry naming the acting account, the target record, the before and after, and the time. Without it, the same defect produces an incident nobody can reconstruct. Information disclosure is real but usually downstream: it is what an attacker gets *after* crossing, which is why the crossing itself is the thing to rate. ## Modeling the right attacker The habitual failure is to model only the anonymous outsider. On this shape the interesting attacker is an **authenticated low-privilege user**: someone with a legitimate account, real credentials, unlimited patience and a genuine session. They can read every page the application serves to them, observe parameter names, and try any route. Writing that attacker down at the top of the model changes what gets enumerated, because a threat that starts from 'the user is already logged in' is not exotic - it is Tuesday. ## Does splitting the deployment fix it Moving the console to another hostname, another service, or behind an internal network is genuinely useful: it shrinks the population that can reach the routes at all and adds a prerequisite an outsider must satisfy first. It changes the **attacker set**, not the authorization decision. If the handler still grants rights on a wrong basis, the same request works from a position inside. Model network placement as exposure reduction and keep the authorization crossing where it is. ## Rating them apart Because the two surfaces have different attackers and different assets, rate them apart. A blended number - one score for 'the portal' - hides that the public flows are high-volume and low-value per event while the registrar flows are rare and high-consequence. Two rows, two attackers, two assets, two ratings. That is also what makes the model useful to whoever has one sprint and has to pick.
- Does moving the console to a separate hostname or an internal network remove the elevation threat?It shrinks the population that can reach the routes and adds a prerequisite, which is worth having. It does not remove the threat: the handler still decides what a session may do, and if that decision rests on the wrong input the same request succeeds from inside. Network placement changes exposure; the authorization crossing stays exactly where the model put it.
- Which STRIDE category attaches to that crossing, and which property does it violate?Elevation of privilege, which violates authorization: a subject obtains rights it was not granted. Note that it is not spoofing - the identity is genuine. The privileged flows additionally carry repudiation, violating non-repudiation, because the asset is a record whose history has to hold up when someone disputes it later.
- How do you show a reviewer that a boundary exists when nothing physical separates the two sides?Draw it around the set of privileged handlers and annotate the crossing with the concrete decision that grants the rights, then name what enforces that decision on every request rather than on the entry screen. A boundary is a claim that something checks there; if the check cannot be named, the finding is that the boundary is aspirational.
One building and one front door, but the vault room still has its own lock. The lock is the boundary; the street address is not.
saying these in an interview costs you the question
- Says a separate surface requires a separate deployment or hostname
- Believes an unlinked admin route is not reachable
- Rates the privileged path with the same blended score as public pages
- Calls unauthorized use of admin functions spoofing rather than elevation
- Models only anonymous outsiders, never the logged-in low-privilege user