Introduction
Broken Object Level Authorisation (BOLA) all starts with an object. Objects should be looked at in the context of "Object Oriented Programming", what I mean with that is objects are the things you think about first in designing a program and they are also the units of code that are eventually derived from the process. This can be anything, ranging from an account to an invoice to a credit note and everything in between. Usually these objects are marked with an identifier because we need to address these objects directly and this is where issue can arise because we need to always check if the user is allowed to access that object. This might seem simple at first but i can assure you it's not, more about that later in the "testing" section of this article.
A broken Object issue occurs when the server does not properly check if the currently logged in user or if a logged out user can read, update or delete an object to which they do not have the rights.
There are two types of broken authorisation on object, these can occur because either a userID is passed on to the server or an objectID, we will look into both.
Sometimes a userID is passed on to the server, this can happen when we request all the resources for a certain user for example:
If we replace the userID with someone else's userID, we should not be able to get the search history of other users but when a Broken Object Level Authorization issue arises, we can view the search history of other users.
This issue is simple to solve as a developer. We simply need to check if the currently logged in user is allowed to access those objects. In this example we need to check if the userID from the GET parameter is the same as the userID of the object's owner.
Psuedo code:
This is the safest way to handle the exception, DO NOT USE THE FOLLOWING CODE AS IT IS NOT SAFE:
The data does not get rendered because of the redirect but a simple push of the back button can still enable the data to be displayed
This vulnerability type can also exist because objectID's are passed to the server when the server does not properly check if the user is authorised for that object. This can happen very easily for example when a developer needs to secure some resources and some not. They might forget to secure one of the objects which should be secured.
Whatever type we are dealing with, some properties are the same across both.
These issues can arise more easily in two situations but of course they can arise any time that a developer forgets to add authorization. We will zoom into two examples:
In this pseudo code example we can see the described vulnerability in action
An attacker can easily abuse this background call by passing any productID'
Detection
To detect these vulnerabilities we need to test read, update and delete actions on all objects that we authorised for. We can do this on two ways:
Whatever approach we decide to take, it is vital that we check all objects and that we check them for read, update and delete actions. We need to check every functionality that has access to these objects, even if it's via a secondary route (example importing products instead of adding them manually).
Prevention
We can form some general tips for preventing Broken Object Level Authorization defects. These will help prevent the vulnerability or will lower the impact if one occurs.
Broken Object Level Authorization defects are becoming ever more prevalent as functionalities of applications increase and more and more API's are built. This requires more and more ethical hackers as it can be a severe vulnerability and it can be very easy to notice, all someone has to do is replace a number in a request if the server has not been configured properly.
Every endpoint that handles objects and receives an ID should properly enforce Object Level Authorization. The Object Level Authorization should check that the user who is trying to read or manipulate an object has the correct authorisation for it.
It is really important to have proper authorization checks in place and we should always stop users from performing actions on objects they are not allowed to perform.
Read our OWASP Top 10 article and see where this vulnerability is now.
Subscribe for the latest news