skip to content

Flaws Needing No Exploit

A missing permission check needs no exploit at all - the advisory text is the procedure - while a memory-safety flaw may never reach a working one. Interviewers use it to test patch-clock instincts.

on this pageshow

explore

questions

4

Why can a missing server-side permission check be attacked with no exploit code at all?

level: juniorimportance: must knowfreq 70%

answer

  1. distance from description to working attack
  2. the request is completely well-formed
  3. server checks the session, not the owner
  4. no build step, no version dependence
  5. description and working attack are the same thing

basics

~20 s

Because the attack is an ordinary, well-formed request. If the server never checks who owns the record, any account holder simply asks for someone else's identifier and is served it. Nothing is malformed, so nothing needs exploiting.

solid answer

~40 s

A weakness class sets the distance between a flaw's description and a working attack, and for a missing authorization decision that distance is zero. Take a SaaS reporting export where an authenticated user asks for report `84213` and gets the file: reports are numbered sequentially across all tenants and the server only checks that the session is valid, never that the report belongs to the caller's tenant. Asking for `84212` returns another tenant's export. The identifier is a valid integer, the session is genuine, and the intended code path runs exactly as written. There is nothing to build, nothing to make reliable across versions, and no privileged position to reach first. Everyone who can log in is already a capable attacker, and the flaw is repeatable one identifier at a time.

go deeper

for a junior

Be ready to say plainly that some flaws need no exploit: a valid session plus a changed identifier is the whole attack. Recall that the server checked who you are and never checked what you may read.

for a middle

Explain the mechanics of why nothing needs building here: no memory state, no version dependence, no reliability work, so the attack behaves identically on every deployment and can be repeated per record.

for a senior

Show that you rank findings by distance to a working attack as well as by impact, and that you can tell a stakeholder why a flaw with no exploit at all can be the most urgent item on the list.

for a principal

Own the argument that weakness class predicts which adversaries can afford you. A flaw usable on reading widens the attacker population to everyone with an account, which is a different strategic exposure from one only a funded crew can use.

## Two things get called "an exploit" One is a *weakness* — the property of a system that lets something go wrong. The other is the *working attack* — the concrete thing an adversary runs to make it go wrong on purpose. The distance between those two is not a constant. It is largely a property of the **weakness class**, and it is the most useful thing that class tells you. For a memory-safety defect, the distance is exploit development: weeks of specialist work that frequently fails. For a **missing authorization decision**, the distance is zero. The description of the flaw *is* the working attack. Reading the sentence "the export endpoint does not check which tenant owns the report" hands you everything you need. ## The worked case A SaaS product exposes a reporting export. An authenticated user requests report `84213` and receives the file. Two facts combine: - Report identifiers are sequential integers allocated across the whole platform, so a neighbouring number is very likely another customer's document. - The server verifies that the caller holds a valid session and stops there. It never asks whether the report belongs to the caller's tenant. A user of tenant A requests `84212` and is served tenant B's export. Notice what is *not* happening. The request is not malformed. The integer is in range and parses fine. The session is genuine — it is the attacker's own. No memory is corrupted, no parser is confused, no timing window is hit. The intended code path runs to completion and does precisely what it was written to do; what it was written to do is the flaw. ## What the attack costs the adversary Nothing they do not already have. No exploit-development capability, no target-specific research, no reliability engineering. And crucially, **no version dependence**: there is no memory layout, allocator state, compiler version or operating-system build standing between the description and the result, so the same three-second action works against every deployment of that product at once. It is also enumerable — each increment is another customer's document, so the flaw scales linearly with patience rather than with skill. That is why the market of people who can use this class of flaw is *everybody who can create an account*, while the market for a memory-corruption defect is the small set of people or crews who can fund exploit development. Distance to a working attack is, in practice, a statement about **which adversaries can afford you**. ## The classes that behave this way Weaknesses usable on reading share a shape: the system's decision logic is absent or wrong, and the input that triggers them is legitimate. - An ownership or tenancy check that was never written. - An identifier treated as if possessing it were proof of entitlement. - A multi-step workflow whose later step can be requested directly. - A function that was assumed unreachable because the interface does not offer a button for it. - A default left as shipped, granting more than anyone intended. Weaknesses on the far side of the scale need something built before they do anything: memory corruption, type confusion, a race window measured in microseconds, a cryptographic weakness that needs computation. ## Two things this is not **It is not a claim that the missing check is always more damaging.** Impact is a separate axis. Code execution on a server can be worse than reading one tenant's export. The point is that impact is what happens *if* someone gets there, and distance is *whether they can*. **It is not solved by making the identifier hard to guess.** An unpredictable identifier raises the cost of finding a target; it does not restore the absent authorization decision, and identifiers travel — through shared links, exports, and other endpoints that legitimately hand them out. The flaw is still that possession of a number is being accepted as entitlement. ## Why this matters for exposure For exploit-required classes, publication of a flaw and the existence of a usable attack are separated by real work, sometimes by months, sometimes forever. For this class they are the same moment. The instant the behaviour is described to anyone — in a bug report, in a public write-up, in a conversation at a conference — every account holder on the platform has been handed a working attack. There is no head start to plan around.

  • Does switching those report identifiers to unguessable random values fix the flaw?
    No. It raises the cost of finding a target, so casual enumeration stops working, but the authorization decision is still absent — anyone who obtains an identifier by any means is still served the file. Identifiers leak routinely through shared links, exports and other endpoints that hand them out legitimately. Treat unguessability as a delay, never as the fix.
  • Why does this class of flaw not care how skilled the attacker is?
    Because the required capability is an account and the ability to change one value in a request. There is no primitive to construct, no mitigation to defeat and no reliability to engineer, so skill buys the attacker nothing extra. Skill matters exactly where a weakness class puts distance between the flaw and the working attack; here there is no distance to shorten.
  • Is a flaw like this the same thing as a vulnerability that has a public exploit?
    No, and the difference matters. A public exploit is an artefact someone built and released for a flaw that needed building. Here nothing was ever built, so there is no artefact to appear or to track. The flaw is usable from the moment it is described, which is why waiting to see whether an exploit shows up is the wrong instinct for this class.

A lock that has been picked is one kind of failure. A door the receptionist opens for anyone who names any room number is another — nobody picked anything, and nobody needed a tool.

saying these in an interview costs you the question

  • Calls an ordinary well-formed request an exploit payload
  • Assumes an unguessable identifier removes the flaw
  • Believes special tooling is required to use it
  • Thinks the attack needs a privileged or administrative account
  • Treats it as low risk because nothing was technically broken

context

open as a page

Why does a memory-safety defect often stop at a crash rather than reach code execution?

level: middleimportance: should knowfreq 50%

basics

~20 s

A crash proves memory was corrupted, not that the corruption can be steered. Reaching execution needs a controlled write or read primitive plus defeat of non-executable data pages, address randomisation, stack cookies and control-flow integrity. Many defects never get there.

open as a page

A team says "we are fully patched, so we are fine" — what does patch level not cover?

level: seniorimportance: should knowfreq 58%

basics

~20 s

Patch level is a claim about third-party code someone else shipped a fix for. It says nothing about first-party authorization decisions, identifiers accepted as entitlement, workflow logic or configuration — flaws that never carry a version number at all.

open as a page

A guessable cross-tenant report identifier or a critical parser memory bug — which gets the one remediation slot you can fund this quarter against commodity criminals?

level: principalimportance: nice to knowfreq 30%

basics

~20 s

Fund the identifier. It is usable on reading by every account holder, so a crew with no exploit-development budget can use it today, while converting the parser defect needs funded research they would have to buy. Severity ranks impact, not distance.

open as a page