Learn
What is access control?
Access control (or authorization) is the application of constraints on who (or what) can perform attempted
actions or access resources that they have requested. In the context of web applications, access control is
dependent on authentication and session management:
- Authentication: identifies the user and confirms that they are who they say they are.
- Session management: identifies which subsequent HTTP requests are being made by that same user.
- Access control: determines whether the user is allowed to carry out the action that they are
attempting to perform.
Broken access controls are a commonly encountered and often critical security vulnerability. Design and
management of access controls is a complex and dynamic problem that applies business, organizational, and
legal constraints to a technical implementation. Access control design decisions have to be made by humans,
not technology, and the potential for errors is high.
Description
Access control enforces policy such that users cannot act outside of their intended permissions. Failures
typically lead to unauthorized information disclosure, modification, or destruction of all data or performing
a business function outside the user's limits. Common access control vulnerabilities include:
- Violation of the principle of least privilege or deny by default, where access should only be granted for
particular capabilities, roles, or users, but is available to anyone.
- Bypassing access control checks by modifying the URL (parameter tampering or force browsing), internal
application state, or the HTML page, or by using an attack tool modifying API requests.
- Permitting viewing or editing someone else's account, by providing its unique identifier (insecure direct
object references)
- Accessing API with missing access controls for POST, PUT and DELETE.
- Elevation of privilege. Acting as a user without being logged in or acting as an admin when logged in as a
user.
- Metadata manipulation, such as replaying or tampering with a JSON Web Token (JWT) access control token, or
a cookie or hidden field manipulated to elevate privileges or abusing JWT invalidation.
- CORS misconfiguration allows API access from unauthorized/untrusted origins.
- Force browsing to authenticated pages as an unauthenticated user or to privileged pages as a standard
user.
How to prevent?
Access control is only effective in trusted server-side code or server-less API, where the attacker cannot
modify the access control check or metadata.
- Except for public resources, deny by default.
- Implement access control mechanisms once and re-use them throughout the application, including minimizing
Cross-Origin Resource Sharing (CORS) usage.
- Model access controls should enforce record ownership rather than accepting that the user can create,
read, update, or delete any record.
- Unique application business limit requirements should be enforced by domain models.
- Disable web server directory listing and ensure file metadata (e.g., .git) and backup files are not
present within web roots.
- Log access control failures, alert admins when appropriate (e.g., repeated failures).
- Rate limit API and controller access to minimize the harm from automated attack tooling.
- Stateful session identifiers should be invalidated on the server after logout. Stateless JWT tokens should
rather be short-lived so that the window of opportunity for an attacker is minimized. For longer lived JWTs
it's highy recommended to follow the OAuth standards to revoke access.
Example Attack Scenarios
Scenario: The application uses unverified data in a SQL call that is accessing account information:
pstmt.setString(1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
An attacker simply modifies the browser's 'acct' parameter to send whatever account number they want. If not correctly verified, the attacker can access any user's account.
https://example.com/app/accountInfo?acct=notmyacct