What Is Broken Access Control?
Broken access control is often misunderstood because people confuse what an application displays with what the application actually permits. A user may not see an administrative button, a record link, or an option to edit a field, yet the underlying function may still accept a request from that user. The practical question is not whether the interface makes an action easy to find. The question is whether the application checks permission at the moment the action is requested. That difference affects how developers design features, how testers evaluate them, and how defenders judge the seriousness of a flaw. In this episode, we will establish what broken access control means, why interface restrictions are not security controls by themselves, and how an application should protect both functions and individual records. By the end, you should be able to explain where authorization must occur and recognize the difference between hiding an action and preventing it. Access control is the set of rules and enforcement mechanisms that determine who may perform an action on a particular resource. Authentication answers who the user is, while authorization answers what that authenticated user is allowed to see or do. Broken access control occurs when the application fails to apply those authorization rules correctly, consistently, or at all. The failure may expose another user’s data, allow a normal account to reach an administrative function, or permit an action that should be limited by ownership, role, location, account status, or another condition. The central distinction is simple. The interface can guide the user, but the trusted application layer must make the security decision. People confuse these ideas because a hidden menu item feels inaccessible during ordinary use. Security cannot rely on ordinary use, because every request must be evaluated according to policy regardless of how that request was created. Most modern applications separate what runs in the user’s browser or mobile device from what runs on a server. The client presents screens and sends requests, while the server or Application Programming Interface (A P I) receives those requests and performs the underlying work. Anything controlled by the client can be changed, omitted, replayed, or replaced, so a client-side restriction cannot be the final authority. Disabling a button may improve usability, and hiding an option may reduce confusion, but neither proves that the server will reject the same action. The server must examine the authenticated identity, the requested action, the target resource, and any relevant conditions before completing the request. That check must occur every time the protected function is used. When an application assumes that a request is valid merely because the normal interface would not have offered it, the application has placed trust in the least trustworthy part of the transaction. One major form of broken access control appears when an application protects the type of action but fails to protect the specific record being requested. A user may be allowed to view account information, documents, messages, or orders, but only the records connected to that user or organization. The authorization decision must therefore verify both the permission to use the function and the relationship to the requested object. A record identifier by itself does not prove ownership. Insecure Direct Object Reference (I D O R) is a term often used when an application exposes a direct reference to an object and fails to confirm that the requester is authorized to access it. The deeper issue is object-level authorization, not the format of the identifier. Random-looking identifiers can make guessing harder, but they do not replace a permission check. The server must decide whether this subject may perform this action on this exact resource. A second major form involves access to functions reserved for more privileged roles. An ordinary user may be permitted to update personal settings but not manage other accounts, approve transactions, change security policy, or view administrative reports. Removing administrative links from the user interface does not enforce that boundary if the underlying endpoint remains available without a role check. This is sometimes described as vertical privilege escalation because the user reaches an action associated with a more powerful role. The flaw may exist in one route, one alternate request method, one export feature, or one older version of an A P I even when the main screen behaves correctly. Function-level authorization must be applied at the protected operation itself. A role name stored in the browser, a disabled control, or a page that is absent from navigation cannot serve as proof that the user lacks access to the function. Effective authorization usually depends on more than a single role. The decision can involve the user’s identity, assigned permissions, organizational membership, ownership of the resource, the action being attempted, the current state of the resource, and other trusted context. A useful model asks who is acting, what action is requested, which resource is affected, and which conditions must be true. These elements should be evaluated by a consistent policy that denies access when the application cannot establish permission. That approach is called deny by default. It prevents new routes, new actions, or incomplete policy mappings from becoming available merely because no rule explicitly blocked them. Access control becomes fragile when each developer writes a different check in a different place. It becomes stronger when the application has a clear authorization model and applies it through shared, testable enforcement points close to the protected resource or operation. Broken access control often develops through inconsistency rather than one obviously missing control. One page may verify ownership while an export route does not. A single-record request may be protected while a bulk action trusts identifiers supplied by the client. The primary A P I may enforce role checks while an older endpoint remains exposed. An application may validate access when a page loads but fail to repeat the decision when data is modified. Other failures come from trusting client-supplied role values, accepting an organization identifier without comparing it to the authenticated account, or treating an unrecognized permission state as allowed. These weaknesses share the same underlying problem: the application is not enforcing one reliable rule at every path to the protected capability. Reviewers therefore have to look beyond the main screen and ask whether all routes, methods, background actions, and data operations apply the same authorization policy. Before we continue, a brief promotional message. This episode is brought to you by the Bare Metal Cyber Academy. The Academy provides a place for people who want to continue developing practical cybersecurity knowledge through clear, structured education. Topics such as authorization become easier to apply when the underlying concepts are explained carefully and connected to real defensive decisions. Visit Bare Metal Cyber dot com to explore the Academy and see the learning opportunities currently available. The goal is steady development of useful knowledge without exaggerated promises or shortcuts. Now, let’s return to broken access control and examine why strong login security does not correct a weak authorization decision. A common misunderstanding is that strong authentication automatically prevents broken access control. Multifactor Authentication (M F A), secure passwords, and protected sessions can make it harder for an unauthorized person to assume someone else’s identity. They do not determine what a legitimate account may do after authentication succeeds. A user can be correctly authenticated and still receive access to another user’s record, another organization’s data, or an administrative function because the application applies the wrong authorization rule. This distinction also explains why a stolen session and broken access control are different problems. A stolen session misuses an authenticated identity, while broken access control grants that identity actions or resources outside its permitted scope. Both can increase harm, but they require different controls. Authentication protects the establishment of identity. Authorization must still evaluate every sensitive request made under that identity, including requests created through approved interfaces and requests submitted in other ways. The impact of broken access control is broader than unauthorized reading. Access rules govern whether data can be viewed, created, changed, deleted, approved, exported, shared, or used to trigger another process. A read failure can expose confidential information. A write failure can damage integrity by allowing unauthorized changes. A delete or shutdown function can affect availability. An approval failure can bypass a business separation that was intended to require a different person or role. Even metadata can be sensitive when it reveals relationships, identifiers, account status, or the existence of protected records. The correct impact analysis therefore asks what the unauthorized action actually enables, not merely which page was reached. Two flaws that both appear to involve a missing permission check can have very different consequences because the affected resource, permitted action, and business process are different. Authorization findings should be described in terms of the capability improperly granted and the consequence that capability creates. Testing access control requires both positive and negative evidence. Positive testing confirms that an authorized user can perform the intended action. Negative testing confirms that users without the required permission are rejected, even when they request the function directly rather than reaching it through the normal interface. Reviewers should compare different roles, different ownership relationships, and different organizational boundaries in an authorized test environment. They should examine read, update, delete, export, and administrative operations separately because permission for one action does not imply permission for another. Automated tests can preserve these expectations whenever the application changes. Manual review is still valuable for finding alternate routes, unusual state changes, and inconsistencies that automated coverage missed. A successful screen display is not proof of correct authorization, and a hidden control is not proof of denial. The strongest evidence is a server response that consistently rejects a request when the authenticated subject lacks permission for that exact action and resource. Good design reduces the number of places where authorization can be forgotten. Shared middleware, policy components, or centralized authorization services can apply consistent decisions across protected functions, although centralization does not remove the need for careful policy design. The application should derive trusted identity and organizational context from the authenticated session rather than accepting those facts from editable client input. Resource ownership and tenant membership should be verified on the server. Sensitive operations should require explicit permission, and uncertain or incomplete decisions should fail closed rather than continue. Least privilege should shape roles and permissions so that accounts receive only the access needed for their purpose. Developers should also separate presentation logic from enforcement logic. The interface may hide unavailable actions for clarity, but the server must independently reject them. Clear authorization rules, reusable enforcement, and automated negative tests make the control easier to understand, review, and maintain as the application grows. Monitoring supports access control, but it cannot compensate for a policy that grants the wrong access. Useful audit records identify the authenticated subject, the requested action, the resource, the authorization result, and enough context to support review without exposing unnecessary sensitive data. Repeated denied attempts, cross-organization access patterns, unexpected use of administrative functions, and unusual export activity may warrant investigation. However, a request approved by a faulty rule may look successful rather than suspicious, which is why monitoring must be combined with design review and testing. Incident responders also need to determine whether a flaw exposed only the tested record or a broader class of resources. They should identify affected identities, actions, time periods, and data boundaries, then correct the policy and verify every related path. Logging helps establish what occurred. It does not create the missing authorization decision, so prevention still depends on correct server-side enforcement. A practical way to evaluate any sensitive application action is to ask five connected questions in ordinary language. Who is making the request, what action is being attempted, which exact resource is involved, what trusted conditions define permission, and where is that decision enforced? Then test the rule from the opposite direction in an authorized environment. Use an account that should not have the permission, request the same function, and verify that the server denies it regardless of whether the interface displays the control. Change the ownership or organizational relationship and confirm that the result changes according to policy. Review alternate routes and related actions so that view permission is not accidentally treated as edit, delete, approve, or export permission. Finally, capture the expected denial in an automated test. This method turns a vague statement such as users should not access other data into a precise, repeatable authorization requirement. Broken access control occurs when an application does not reliably enforce what an authenticated subject is permitted to do with a specific function or resource. Hiding a button is not the same as protecting the underlying operation because the button belongs to the presentation layer, while the security boundary must exist at the trusted server-side decision point. Correct protection requires the application to evaluate identity, action, resource, ownership, role, organizational scope, and other relevant conditions for every sensitive request. It should deny access when permission is not established, apply the same policy across every route, and verify the result with negative testing. Authentication may establish who the user is, but authorization still has to decide what that user may do. The practical standard is direct and testable: when a user lacks permission, the server must reject the action even if the request reaches the function without using the visible interface.
