Create Secure Coding - Broken Object Property Level Authorization.md
This commit is contained in:
parent
53ae9cdab0
commit
3965799286
203
Secure Coding - Broken Object Property Level Authorization.md
Normal file
203
Secure Coding - Broken Object Property Level Authorization.md
Normal file
@ -0,0 +1,203 @@
|
||||
# Broken Object Property Level Authorization (API3:2023)
|
||||
In this vulnerability, the attacker has the possibility of extracting or CRUD operations on the relevant methods due to the lack of checking the data models in the request and response.
|
||||
This issue is due to the inaccuracy of the validation of the access permission to the properties of the objects, and as a result, it causes the disclosure of information or disruption of requests.
|
||||
|
||||
* Example
|
||||
|
||||
A `PUT` request to update an attribute of an item:
|
||||
|
||||
```html
|
||||
PUT /api/items/{item_id}
|
||||
|
||||
Body:
|
||||
{
|
||||
"name": "Updated Item Name",
|
||||
"price": 10.99,
|
||||
"is_available": true
|
||||
}
|
||||
```
|
||||
|
||||
### Non-compliant code (.NET)
|
||||
```c#
|
||||
[Route("api/items")]
|
||||
public class ItemController : ControllerBase
|
||||
{
|
||||
private readonly IItemService _itemService;
|
||||
|
||||
public ItemController(IItemService itemService)
|
||||
{
|
||||
_itemService = itemService;
|
||||
}
|
||||
|
||||
[HttpGet("{itemId}")]
|
||||
public IActionResult GetItem(int itemId)
|
||||
{
|
||||
// Retrieve the item from the database
|
||||
Item item = _itemService.GetItem(itemId);
|
||||
|
||||
// Return the item without any authorization check
|
||||
return Ok(item);
|
||||
}
|
||||
|
||||
[HttpPut("{itemId}")]
|
||||
public IActionResult UpdateItem(int itemId, [FromBody] Item
|
||||
updatedItem)
|
||||
{
|
||||
// Retrieve the existing item from the database
|
||||
Item existingItem = _itemService.GetItem(itemId);
|
||||
// Update only the allowed properties
|
||||
existingItem.Name = updatedItem.Name;
|
||||
existingItem.Price = updatedItem.Price;
|
||||
existingItem.IsAvailable = updatedItem.IsAvailable;
|
||||
// Save the changes to the database
|
||||
_itemService.UpdateItem(existingItem);
|
||||
// Return a success response
|
||||
return Ok();
|
||||
}
|
||||
// Other methods...
|
||||
}
|
||||
```
|
||||
|
||||
### Compliant code (.NET)
|
||||
```c#
|
||||
[Route("api/items")]
|
||||
public class ItemController : ControllerBase
|
||||
{
|
||||
private readonly IItemService _itemService;
|
||||
|
||||
public ItemController(IItemService itemService)
|
||||
{
|
||||
_itemService = itemService;
|
||||
}
|
||||
|
||||
[HttpGet("{itemId}")]
|
||||
public IActionResult GetItem(int itemId)
|
||||
{
|
||||
// Retrieve the item from the database
|
||||
Item item = _itemService.GetItem(itemId);
|
||||
|
||||
// Check if the user is authorized to access the item
|
||||
if (!IsUserAuthorized(item))
|
||||
{
|
||||
return Forbid();
|
||||
}
|
||||
|
||||
// Return the item
|
||||
return Ok(item);
|
||||
}
|
||||
|
||||
[HttpPut("{itemId}")]
|
||||
public IActionResult UpdateItem(int itemId, [FromBody] Item
|
||||
updatedItem)
|
||||
{
|
||||
// Retrieve the existing item from the database
|
||||
Item existingItem = _itemService.GetItem(itemId);
|
||||
|
||||
// Check if the user is authorized to update the item properties
|
||||
if (!IsUserAuthorized)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## General prevention suggestions:
|
||||
* When creating or updating objects, ensure that the property access permission is set to the correct level.
|
||||
|
||||
* Validating users' input data and only accepting them if they have authorized access to the relevant features.
|
||||
|
||||
* Using strong and secure mechanisms to determine and manage permissions and roles in the system, such as Role-Based Access Control (RBAC).
|
||||
|
||||
* Limiting users' access to object features based on business needs and Least of Privilege principles
|
||||
|
||||
* Perform regular security tests on APIs and systems to ensure that all required permissions and validations are properly implemented.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user