skip to content

In a white-label banking app, each partner assumes the other runs fraud checks - how do you close that gap?

level: principalimportance: nice to knowfreq 31%

answer

  1. both diagrams right, jointly incomplete
  2. each draws the control on the far side
  3. per control, not per layer
  4. name the system and the log
  5. duplication is visible, a gap is not

basics

~20 s

Neither model covers the seam, because each stops at its own edge and draws the missing control on the far side. Close it by modeling the shared boundary jointly and naming exactly one owner for every control on it.

solid answer

~50 s

This is the characteristic failure of a boundary shared by two organisations: both diagrams are individually defensible and jointly incomplete. The fintech front-end's model ends where it hands a payment to the licensed bank; the bank's model starts at its API and treats the front-end as an authenticated caller. Each side draws fraud checking on the other's territory, so an anonymous fraudster walks through a control that exists on two diagrams and in zero systems. As a lead I would insist on three things. Every boundary in a model must show both sides, even if the far side is an external entity with its responsibilities stated rather than assumed. The shared interface gets one joint modeling session whose output is a control-by-control responsibility list, not a layer-by-layer one, because gaps hide in specific behaviours rather than in tiers. And any control at that boundary with no single named owner blocks release, because a control owned by two parties is owned by neither.

go deeper

for a junior

Take away the shape of the problem: when two companies each model only their own half, the controls that belong at the join can end up owned by nobody, and each side's diagram still looks complete.

for a middle

Be able to run the check. For one attack path, ask which concrete system stops it and which log proves it, and recognise that both sides pointing at each other means the control does not exist.

for a senior

Show you would build the per-control responsibility list rather than a layer split, get the far side represented on your own diagram, and add compensating controls when ownership cannot be agreed.

for a principal

Own the policy: no boundary drawn with one side missing, no un-owned control at a shared interface shipping, ownership versioned in the interface contract, and a clear stance that duplication is the cheaper error.

## Why the seam is where the loss happens When one product is delivered by two organisations, each one threat-models what it operates. That is correct and it is not enough. A model has a scope, and scope has an edge, and at the shared interface the two edges meet - usually without overlapping. Everything that should be enforced *at* the boundary is exactly the material each side is most tempted to place on the far side of it, because from either point of view the other party looks better positioned to do it. The white-label banking case makes it concrete. A fintech builds and brands the app; a licensed bank holds the licence and moves the money. Ask each side who runs fraud checks on a new payee and an unusual first transfer: - The fintech says the bank does, because the bank is the regulated institution and owns the ledger. - The bank says the fintech does, because the fintech owns the customer relationship, the device signals and the session context. Both answers are reasonable. The result is that an anonymous fraudster with stolen credentials meets a control that appears in two architecture documents and runs in no system. Money leaves. Then each side's post-incident review finds its own model correct - which it was. ## The structural fix: no half-drawn boundaries The first rule to impose across an organisation is that **a trust boundary must show both sides**. If the far side is another company, it still appears - as an external entity whose responsibilities are written out explicitly. The point is not to model their internals; it is to force the sentence *the control on the far side of this line is X, owned by Y* to be written down. Assumptions that are never written are never checked, and this failure mode is nothing more than two unwritten assumptions pointing at each other. ## Enumerate at control granularity, not layer granularity The usual attempt at this is a responsibility matrix split by layer: network, platform, application, data. It reliably misses the fraud gap, because fraud detection is not a layer. Gaps live in named behaviours: - velocity limits on a newly added payee - device reuse seen across brands or tenants - step-up authentication on a first transfer above a threshold - reconciliation that would notice the pattern the following day So the matrix has to be written one control at a time, each tied to a threat someone actually stated, with one owner and one place the evidence lives. It is longer and duller than a layer diagram, and it is the artifact that finds the hole. A compact form that works on a whiteboard: threat: fraudster adds a payee and drains a balance control: velocity limit on new payees owner: bank evidence: rule log control: device-reuse signal across brands owner: fintech evidence: risk score control: step-up on first transfer owner: ??? evidence: none The third row is the finding. It is visible only because ownership was demanded per control. ## The naming test A fast diagnostic for a shared boundary, usable live in an interview or a design review: take one concrete attack path, then ask both sides to name **the exact system that stops it and the exact log that proves it stopped**. Three outcomes: - Both name their own system: duplication. Wasteful, sometimes deliberate defence in depth, and it is *visible*, which makes it cheap. - One names a system, the other names the first: covered, assuming the claim is true and testable. - Each names the other: a gap. This is the outcome that produces no error, no alert and no ticket until it is exploited. Asymmetric cost is the whole argument: duplication is expensive in effort and obvious; a gap is free until it is catastrophic. That is why, when the boundary cannot be resolved, the correct default is to double up rather than to negotiate. ## When the partner will not engage A principal-level answer has to survive the case where you cannot get the other organisation into a room. Then: 1. Model their side as an external entity with responsibilities **stated**, and send them the list of threats you believe they own. A statement they have seen is a different thing from a hope you never voiced. 2. Treat silence as an unmitigated threat, not as agreement, and escalate it on your own risk path. 3. Add compensating controls on your own side where you can, accepting duplication as the cheaper error. 4. Where you cannot compensate, change the product: lower a limit, delay a first transfer, reduce what the feature can do until the ownership question is answered. ## Keeping it true over time The seam decays faster than either side's interior, because each side ships independently and neither release process consults the other's model. Two habits keep it alive: the shared boundary is re-modeled whenever either side changes what crosses it, and the responsibility list is versioned as part of the interface contract rather than living in a slide from the integration project. If ownership of a boundary control is not in the contract, it will be relitigated during an incident - which is the worst possible moment to discover both parties disagree.

  • Why does a layer-by-layer responsibility matrix fail to catch this gap?
    Because fraud detection is not a layer. Splitting by network, platform, application and data lets both sides claim their tiers while the specific behaviours - velocity limits on new payees, device reuse across brands, step-up on a first transfer - belong to no tier at all. Enumerate one control at a time, tied to a named threat, with one owner and one evidence source.
  • The partner will not join a modeling session. What do you do instead?
    Model their side as an external entity with responsibilities stated rather than assumed, and send them the list of threats you believe they own. Treat silence as an unmitigated threat and escalate it internally. Then add compensating controls on your side, and where you cannot, shrink the feature - lower limits or delay first transfers - until ownership is answered.
  • How do you distinguish a real gap from harmless duplication at a shared boundary?
    Pick one concrete attack path and make both sides name the exact system that stops it and the log that proves it. If both name their own, you have duplication - visible and usually affordable. If each names the other, you have a gap, which produces no signal at all until it is exploited. When in doubt, duplicate.
  • How do you stop the seam from decaying after the integration project ends?
    Version the per-control ownership list as part of the interface contract, not as a slide from the launch, and re-model the shared boundary whenever either side changes what crosses it. Otherwise ownership gets relitigated during an incident, which is the worst moment to learn the two parties never agreed.

Two crews maintain a bridge from opposite banks. Each inspects to the middle and assumes the other checks the centre span. Every report is honest and nobody has ever looked at the join.

saying these in an interview costs you the question

  • Assumes the regulated or larger partner owns anything ambiguous
  • Accepts a layer-by-layer split as sufficient at a shared boundary
  • Treats partner silence as agreement that they own a control
  • Draws a boundary with only one side represented
  • Argues duplicated controls are as costly a mistake as gaps

context