skip to content

Why does a CAPEC-driven sweep of an airline loyalty-points API miss arbitrage between member accounts?

level: seniorimportance: must knowfreq 55%

answer

  1. Every request is authorised and well-formed
  2. Nothing is exploited; rules compose badly
  3. Reusable catalog, non-reusable business rules
  4. Floor of known patterns, not a ceiling
  5. Ask the asset question before the catalog

basics

~20 s

Points arbitrage is a chain of legitimate operations permitted by that system's own rules, and no catalog holds rules it never saw. A library sets a floor of known patterns; novel abuse comes from an asset-driven pass.

solid answer

~50 s

A library sweep answers "which known attacks apply here?" It found the injection, session-fixation and enumeration patterns because those are properties of the technology, not of the airline's rules. Points arbitrage - transferring, pooling and redeeming points across accounts and family pools to extract more value than was paid in - exploits no weakness at all. Every request is authenticated, authorised and well-formed; the loss comes from the rules composing in a way nobody priced. Catalogs do carry abstract categories like abuse of functionality, but an abstract category names the shape, not your specific rule combination. The fix is not a bigger catalog: run an asset-driven pass first - what is worth money here, and how could a legitimate user get it without paying? - with someone who knows the loyalty economics present, then sweep the library as a second pass.

go deeper

for a junior

Learn the distinction being tested: a catalogued attack pattern exploits a technical weakness, while business-logic abuse uses features exactly as built. Be able to give one example of each.

for a middle

Explain why the gap is structural rather than a missing entry. A pattern is reusable only because it is independent of any one product's rules, so rule-specific abuse can never be catalogued.

for a senior

Show how you actually run the session: asset and actor first, library second, domain experts in the room, and every catalogued pattern's prerequisites checked against the real design before it counts as a threat.

for a principal

Own the framing that a sweep is a floor, not a ceiling, and defend the extra session's cost with evidence - threat provenance tracked against which findings changed the design or later cost real money.

## The two elicitation styles **Library-driven** elicitation walks a catalog of known attack patterns and asks of each: does this apply to the system in front of me? **Design-driven** (or asset-driven) elicitation walks your own architecture - the assets, the actors, the flows, the trust boundaries - and reasons about what could go wrong here. They fail in opposite directions, and the loyalty-points case is the cleanest demonstration. ## What the sweep found, and why An airline loyalty-points redemption API gets a thorough pattern-library pass. It comes back with injection variants against the search and redemption endpoints, session fixation on the member portal, enumeration of member numbers through the lookup endpoint, and a set of parser and rate-limiting concerns. Every one of those is real and worth fixing. All of them share a property: they are consequences of the **technology and its implementation**, not of the airline's rules. Any HTTP API with a database behind it, a session mechanism and an identifier lookup exhibits the same candidate patterns. That is precisely what makes them catalogable - they recur across thousands of systems, so someone was able to write them down once and reuse them. ## What it missed, and why that is structural The threat that actually loses money is points arbitrage. An authenticated member - often working with a broker who aggregates accounts - exploits the fact that points can be transferred between accounts, pooled into a household or family account, earned through partner promotions, and redeemed against award inventory whose cash value varies wildly. Combine those rules in the right order and you extract more value than was ever paid in. Award seats leave the inventory, the partner settlement is real cash, and the loss lands on the balance sheet. Notice what is *absent* from that description. There is no weakness. No input is malformed, no authorisation check is bypassed, no session is stolen. Every single request is one the system was designed to serve, sent by someone entitled to send it. Nothing has been exploited; the **rules composed in a way nobody priced**. That is why the miss is structural rather than a gap someone will fill in the next catalog release. An attack pattern is reusable precisely because it is independent of any particular product's business rules. A threat that consists entirely of *this* product's rules cannot be reusable, so it cannot be in a reusable catalog. Catalogs do contain abstract entries about abuse of intended functionality, and a candidate who mentions that is being honest - but an abstract category names a **shape**, not a mechanism. It cannot tell you that transfers plus household pooling plus a partner promotion is the combination that costs money. Only someone who knows the economics can. ## Floor, not ceiling The useful formulation: **a library sweep sets a floor of known patterns, never a ceiling of possible threats.** "We achieved full CAPEC coverage" means every applicable catalogued pattern was considered. It says exactly nothing about threats that were never catalogued - and on a system whose value lives in its rules, that is where the money is. A reviewer who accepts a completed sweep as "the threat model is done" has confused an activity with an outcome. ## What you add, and in what order Add an **asset-driven pass**: name what is worth taking, then ask, for each actor position, how a person in that position could obtain it. On the loyalty API, the asset is points-as-currency and the actor positions include an ordinary member, a member cooperating with other members, and a broker running many accounts at once. The question that finds arbitrage is not "which attack pattern applies" but "how could someone entitled to use this system extract value without paying for it?" Complement it with **abuse cases derived from the business rules**: for every rule that creates, moves or converts value, ask what happens if it is invoked at scale, out of the expected order, or in combination with another rule. Ordering matters more than people expect. Running the library first **anchors** the room: once twenty concrete catalogued threats are on the board, the group starts triaging instead of imagining, and the divergent thinking that finds business-logic abuse never happens. Do the asset-driven pass first while the room is still open-ended, then sweep the library as a completeness check. You also need the right people: a security engineer alone cannot derive the arbitrage, because the threat is made of domain knowledge - somebody who understands loyalty economics has to be at the table. ## Proving the second pass was worth it A sceptical manager will ask why you spent a session on something a catalog pass would have covered. Record the **provenance** of every threat: which came from the library, which from the design pass. Then track which ones drove a design change and which were later confirmed by testing or by a real loss. The pattern that shows up is that library threats are numerous, cheap and mostly mitigated by a framework or a standard control, while design-driven threats are few, expensive and the ones that would have hurt.

  • Take an academic conference peer-review platform where reviewers bid on papers. What does a library give you there, and what must come from the design?
    The library covers the platform mechanics well: authentication, access control on unpublished submissions, file handling, enumeration of identifiers. What it cannot describe is reviewers colluding to steer assignments, or de-anonymising authors from bidding patterns - threats to research IP and to the fairness and audit truth of the process, composed entirely of the platform's own workflow rules. Those only surface from an actor-and-asset pass over the design.
  • Should the library sweep run before or after the design-driven session?
    After. Presenting a room with concrete catalogued threats first anchors it: people switch from imagining to triaging, and the divergent thinking that surfaces business-logic abuse never gets started. Run the asset-and-actor pass while the room is still open-ended, then sweep the library as a completeness check on what was forgotten. The one exception is a team completely new to threat modeling, where a short curated list is a better start than a blank page.
  • How do you demonstrate to a sceptical manager that the design-driven pass earned its time?
    Record where each threat came from - library or design pass - and then track outcomes: which threats changed the design, which were confirmed later by testing or by an actual loss, and which were already covered by an existing framework control. Library threats are typically numerous, cheap and largely pre-mitigated; design-driven threats are few and are the ones with real money attached. The provenance data makes that argument for you.

A pattern library is a checklist of the ways a shop gets burgled. It will not tell you that your loyalty card can be stacked with a staff discount and a returns policy to walk out ahead - that loss is made of your own rules, not of anybody's break-in.

saying these in an interview costs you the question

  • Claims a bigger or newer catalog would have found it
  • Calls points arbitrage a vulnerability or an exploit
  • Treats full catalog coverage as a finished threat model
  • Assumes attackers must be anonymous outsiders
  • Runs the library first and calls the session complete
  • Excludes domain experts from the threat-modeling session

context