The attacker accessed 9.8 million customer records through an API endpoint. The Australian government called it "not a sophisticated attack." Four technical details were present — all contributed. Which single factor turned this into an automated attack on 9.8 million records?
Express.js API endpoint. The user is logged in. One missing check lets them read anyone's data. Click the line.
The ID from the URL is user input. The ownership check is the authorization layer — without it, authentication alone means nothing.
In every resource query, bind to the authenticated user’s ID. If the ID comes from the URL, that’s user input — verify ownership before returning data.
Two Express.js endpoints return a user's profile. Which one prevents IDOR?
A user tries to access an order that exists but belongs to someone else. What should the server return?
In 2025, OWASP absorbed a previously separate category into A01 Broken Access Control. Which one?
Authentication proves who is asking. Authorization proves they're allowed to access this specific resource. They are two different checks. Both are required.
A01 · Broken Access Controlreq.user.id — enforce ownership at the data layerAND user_id = ? to every resource query. Use deny-by-default: if the ownership check fails, return 404 — not 403 (which leaks that the resource exists). Implement access control once and reuse it. Never rely on the client to enforce permissions.An API endpoint at /users/{userId} on an inactive subdomain was publicly accessible. A coding error introduced in September 2018 weakened the endpoint's access controls. Optus identified and fixed the error on its main domain in August 2021 — but failed to apply the same fix to the subdomain. The endpoint remained exposed, unmonitored, and vulnerable for over three years.
The attacker wrote a script that incremented the userId parameter: 1, 2, 3, 4... all the way to approximately 10 million. The API required no authentication and performed no ownership check — it returned the full customer record for any ID supplied. The attacker rotated through tens of thousands of IP addresses to evade detection, but the Australian Communications and Media Authority (ACMA) confirmed this was "not a sophisticated attack." The technique was basic IDOR enumeration.
A ransom of AUD $1.5 million was demanded on BreachForums, then rescinded with an apology. 10,000 customer records were published. A 19-year-old was arrested for separately extorting affected customers. The CEO resigned. Class actions were filed. The Australian government overhauled telecom data protection rules in direct response. ACMA confirmed: three security failures combined — public-facing API, no auth, sequential IDs.