A shared attack-tree subtree no longer fits every consumer as their systems diverge - how do you keep the library honest?
answer
- consumers drift after you attach
- an edit for one hits all
- one-system changes go in the attachment
- fork when the shape diverges
- retire subtrees no system matches
basics
~10 sGive each shared subtree a named owner and a recorded consumer list, review it whenever a consumer's architecture changes, fork when branches diverge in shape, and retire subtrees no live system matches.
solid answer
~50 sReuse creates a dependency graph across models, so the library needs the hygiene of shared code. Every subtree gets an owner and an explicit list of consuming trees, so an edit can be traced to everything it lands in. Edits made for one consumer's sake are the dangerous case: raise a leaf's difficulty because one system added a control and every other consumer silently inherits a system that looks harder to attack than it is. So changes driven by one consumer belong in that attachment's values, not in the shared node, and a genuine change to the shared shape triggers re-confirmation by each consumer. Fork when a consumer's branches differ structurally rather than in value; delete a subtree once no live system matches it, because a stale entry is worse than an empty library - people trust it. The cost of getting this wrong is not a wrong diagram, it is a mis-ordered remediation backlog.
go deeper
Understand that a shared subtree can go out of date as systems change, and that a tree drawn last year may describe a system that no longer exists.
Be able to explain the coupling: one shared node has many consuming trees, so an edit reaches all of them, and a change caused by one system's controls belongs in that system's own values.
Show how you would detect drift - recorded consumer lists, per-attachment notes on which values rest on a specific control, and review triggered by architecture change rather than only by the calendar.
Own the tradeoff and the funding: reuse buys consistency and buys coupling, and coupling without a named owner produces models that are consistently wrong. Be ready to argue for a small library, forking over hedging, and retiring entries.
## Why drift is the defining risk of reuse A reusable subtree is a claim that several systems share the same decomposition of one sub-goal. Systems change; the claim quietly stops being true. Nothing in the model complains, because the tree still renders and still propagates a number. That is what makes drift the principal-level problem here: the failure is silent, and the artifact that goes wrong is not the diagram but the **priority order** people take from it. ## The propagation hazard, concretely An insurer shares an 'insider with legitimate read access walks out with a bulk extract' subtree between a CRM and the analytics warehouse fed from it. The adversary is a departing account manager; the asset is customer personal data. Later the warehouse gains row-level masking, so bulk extraction there yields far less. Someone updates the shared subtree's leaf to reflect the new difficulty. Now the CRM's tree - which got no masking - shows the same raised difficulty. The bulk-extract path looks harder than it is, its propagated value falls below other paths, and the CRM's real insider risk drops down the remediation list. Nobody made an error of reasoning; the edit was correct for the consumer who prompted it and wrong for the one who did not. This is the direction of failure to watch for: **a change made for one consumer lands in every consumer that shares the node.** The rule that prevents it is the same one that governs parameterisation: a change caused by *one system's* controls or architecture belongs in that system's attachment values, never in the shared shape. Only a change to what an attacker must fundamentally do belongs in the shared node - and that change should force every consumer to re-confirm rather than inherit quietly. ## Ownership, consumer lists, and review triggers Three pieces of governance do most of the work: - **A named owner per subtree.** Not the security team in general - a person. Unowned shared artifacts rot in exactly the way unowned shared code rots. - **A recorded consumer list.** Reuse only pays if you can answer 'which trees does this node hang under', because that is the blast radius of any edit and the worklist for any re-confirmation. - **Review triggers, not just a calendar.** A yearly sweep is fine as a backstop, but the real trigger is a consumer changing: a new authentication path, a segmentation change, a datastore gaining or losing a control, a workforce change in how people access the system. That last one produces the most embarrassing failure mode. A corporate library holds a 'phish a staff member into handing over a session' subtree written when everyone had laptops. It is re-attached to a warehouse application whose staff use only shared kiosk tablets, where the branch structure - personal mailbox, browser session, individual device - describes almost nothing that exists. The subtree is not merely mis-valued; it describes no consumer. The owner's job is to notice and either rewrite it against how those people actually work or retire it. ## Fork, parameterise, or retire The standing decision at every review: - **Parameterise** when the branches still hold and only the values moved. Cheapest option, keeps consistency. - **Fork** when the shape diverged. A payments company reusing a 'reach the signing-request path' subtree across card issuance and settlement will find one consumer sitting inside the audited cardholder-data segment with different reachable branches from the other. Bending one node to serve both makes it wrong for both. Two smaller, true subtrees beat one shared, hedged one - accept the duplication, it is the honest cost of a real difference. - **Retire** when no live system matches. Deleting a library entry feels like losing work, but a stale entry is worse than no entry, because people trust the library precisely because it is shared and reviewed. ## Making divergence visible rather than preventing it You cannot stop systems from diverging, so aim to make divergence loud. Practical moves: record per attachment which branches were pruned and which leaf values rest on a *specific existing control*, since those are the values that expire when the control changes; date each attachment and show that date next to the propagated result, so a reader can see the number is two years old; and treat any shared-node edit as a change request that notifies every consumer's owner rather than a silent save. A reasonable maturity signal is that the library shrinks sometimes. A library that only ever grows is one where nobody has been willing to say a subtree stopped being true. ## How to argue it in an interview The judgment being tested is whether you understand that reuse trades one problem for another. Un-shared trees are inconsistent but locally honest; shared trees are consistent but can be uniformly wrong. That trade is worth taking only if someone owns the shared side. If the organisation will not fund an owner, the correct principal-level answer is to keep the library small - two or three subtrees that genuinely recur - or not to run one at all, rather than to accumulate shared nodes that nobody can vouch for.
- What is the actual damage when a shared subtree carries one consumer's control into another's tree?The other consumer's path looks more expensive for the attacker than it is, so its propagated value falls and that work slides down the remediation backlog. The harm is a mis-ordered set of priorities, not a wrong picture - and because the tree still looks coherent, nobody re-examines it. That is why one-consumer changes must live in that consumer's attachment values rather than in the shared node.
- How do you decide the library is too small to be worth running?When no sub-goal has been independently derived in three or more trees, or when nobody will own the shared nodes. Reuse buys consistency at the price of coupling, and coupling with no maintainer produces trees that are consistently wrong. Two or three heavily reused subtrees with a real owner beat twenty unowned ones, and independent trees are the honest fallback.
- Someone objects that forking a subtree duplicates work you built the library to avoid. What is your answer?Duplication is the cheaper error here. A forked subtree costs one extra decomposition to maintain; a shared subtree bent to cover two different shapes is wrong for both consumers and wrong invisibly. The library's value is that a shared node is trustworthy, and that only holds if you fork the moment the shape genuinely differs rather than hedging one node to fit.
It is a shared dependency with no release notes. One maintainer's fix ships to every consumer, and the consumer who never read the change is the one it breaks.
saying these in an interview costs you the question
- Edits the shared subtree because one consumer added a control
- Runs a shared library with no named owner per subtree
- Cannot say which trees consume a given shared subtree
- Keeps a stale subtree because deleting it feels like lost work
- Treats duplication as a worse outcome than a wrong shared node
- Reviews the library on a calendar only, ignoring architecture changes