You re-attach one 'obtain an operator credential' subtree to three internal consoles - how do you parameterise it per console?
answer
- shape travels, numbers do not
- prune branches this system lacks
- controls raise leaf cost, not delete leaves
- re-propagate: OR takes min, AND sums
- cheapest path differs per consumer
basics
~20 sShare the branch structure; set everything measurable per console - leaf cost, skill, detectability, feasibility. Prune branches a console lacks, raise leaves an existing control blocks, then re-propagate: the cheapest path can differ per console.
solid answer
~50 sThe subtree's shape is the shared part: the branches under 'obtain a working operator credential' and their concrete leaf actions. Everything system-specific is set at the attachment. For each console I prune branches it does not offer, then score its remaining leaves for this console - attacker cost, skill needed, whether it is detectable, or just feasible versus not. A console behind step-up authentication makes the session-theft leaf much more expensive; a console without it leaves that leaf cheap. Then I re-propagate: an OR node takes the minimum of its children because the attacker picks the cheapest branch, an AND node takes the sum because they must do all of them. Identical structure with different leaf values gives a different cheapest path per console - which is exactly the output I wanted. The one thing parameterisation cannot fix is a console whose branches differ in shape; that one gets forked.
go deeper
Recall that a reused subtree does not carry another system's numbers with it. The branches may be shared but each system gets its own scores.
Explain the split cleanly: structure and leaf actions are shared; applicability, leaf values and existing controls are per attachment, and values propagate upward by minimum at OR nodes and sum at AND nodes.
Demonstrate you have done it - pruning what a system does not offer, encoding an existing control as a raised leaf cost rather than a deletion, and showing how the cheapest path moved between two consumers of the same subtree.
Own the comparability question: leaders want one number per system, and per-consumer scoring is what makes those numbers mean anything. Be ready to defend ordinal, justified estimates over central scoring that manufactures false equivalence.
## The scenario An insurer has three internal consoles - claims adjudication, payments, and underwriting. Each has its own attack tree, and each root goal needs the same sub-goal met first: *obtain a working operator credential*. The adversary is a compromised or coerced operator, or someone who can take over an operator's session; the assets are the credential itself and the personal claims data sitting behind each console. That sub-goal is a textbook library subtree - so it is decomposed once and re-attached under all three roots. The interview question is what happens *at* the attachment. ## What is shared and what is local Shared: the sub-goal statement, the branch structure, the concrete leaf actions, and the AND/OR operators. Local, set per attachment: - **Applicability.** Prune branches this console does not offer. If underwriting has no self-service password reset, the branch that abuses reset flow comes out of that attachment. Leaving it in with a bad score is worse than pruning: it keeps a path in the tree that does not exist. - **Leaf values.** Whatever metric the tree carries - attacker cost, skill required, elapsed time, detectability, or a plain feasible/infeasible flag - is scored for *this* console. Pick one primary metric and stay consistent; mixed metrics in one tree make propagation meaningless. - **Existing controls.** A control the console already has does not delete a leaf, it raises that leaf's cost or drops its feasibility. Step-up authentication on the payments console does not make session theft impossible; it makes the stolen session insufficient on its own, which either raises that leaf sharply or turns the branch into an AND with a second child. ## Re-propagating, and why the answer differs Once leaves are scored per console, values propagate upward by the node operator. On a cost-like metric: ``` OR node -> min(children) the attacker chooses the cheapest branch AND node -> sum(children) the attacker must complete all of them ``` On a boolean 'is this achievable', an OR node is achievable if any child is, an AND node only if all are. Either way the attacker owns the choice at an OR node and the defender owns it at an AND node - which is why AND nodes are where a single added control can cut a whole path. Now the payoff. Suppose the shared subtree has three OR branches: phish a live session, abuse the password-reset flow, and get credentials from a shared workstation. On claims adjudication - no step-up authentication - the session-theft branch is cheapest and the OR node inherits that value. On payments, step-up authentication makes session theft cost far more, so the OR minimum switches to a different branch, and the whole tree's cheapest path to the root changes with it. Same subtree, same shape, different answer. That is the entire argument for parameterising rather than sharing values: **a shared structure with per-consumer values tells you the three consoles are not equally exposed**. A shared structure with shared values tells you they are, which is false, and it will quietly flatten your remediation ordering. ## Recording the parameters so they survive An attachment is worth writing down as more than a pointer. Useful to record, per consumer: which branches were pruned and why, the metric in use, each leaf value with a one-line justification, and which values came from a control that already exists (those are the ones that go stale first when the control changes). Values that are pure guesses should be marked as such - most attack-tree scoring is ordinal judgment, not measurement, and a tree that hides which numbers were guessed invites arguments it cannot win. ## Where parameterisation runs out Parameterisation handles *different values over the same shape*. It cannot handle a consumer whose branches are genuinely different. If one console is reached only through a jump host on a segmented network, its credential sub-goal has branches the others do not have and lacks branches they do. Bending the shared subtree to cover it - adding branches only one consumer uses, or scoring irrelevant branches as infeasible - degrades the subtree for everyone. Fork it. The signal to watch for is an attachment that prunes or neutralises most of the shared branches: at that point the consumer is not really a consumer. ## The common interview mistakes Scoring the subtree centrally 'so the numbers are comparable' is the big one - it produces comparability by fiat, not by measurement. Deleting a branch because a control exists is the second: the control belongs in the leaf's value, and if you delete the branch you lose the record of what happens when that control fails or is removed. Third is scoring in a mix of dollars, hours and vague high/medium/low within one tree, which makes the propagated minimum and sum meaningless.
- Why not just delete a branch when the console already has a control that blocks it?Because the branch still describes something the attacker can attempt - the control is what makes it expensive, and controls get misconfigured, bypassed or removed. Encoding it as a raised leaf cost keeps the path visible and makes the tree answer 'what happens if step-up authentication is disabled for a maintenance window'. Deleting the branch throws that away and makes the tree look structurally safer than the system is.
- One console's attachment prunes four of the shared subtree's six branches. What does that tell you?That it is probably not a real consumer. Parameterisation is for different values over the same shape; when most branches do not apply, the shape itself differs and the shared subtree is being bent to fit. Fork a console-specific subtree instead - it will be smaller, truer, and it stops future edits to the shared node landing in a tree they do not describe.
- How do you keep the per-console values defensible when they are all estimates?Use one ordinal metric across the tree, record a one-line justification per leaf, and mark which values rest on an existing control rather than on inherent difficulty. Then argue relative ordering, not absolute numbers: the tree's job is to say which path is cheapest for this console, and an ordering survives disagreement about magnitudes far better than a fabricated cost in currency.
The shared subtree is a route map; the per-console values are the traffic on each road. Same map, different fastest route, and only the traffic tells you which door to lock first.
saying these in an interview costs you the question
- Scores the shared subtree centrally so all consumers match
- Deletes a branch instead of raising its leaf cost when a control exists
- Forgets to re-propagate after changing per-consumer leaf values
- Mixes cost, time and high/medium/low within one tree
- Keeps inapplicable branches scored as infeasible rather than pruning them