### LEVEL 1 ##############################################################################
@router.put("/profile", response_model=UserUpdate, status_code=status.HTTP_200_OK)
def update_profile(
user: UserUpdate,
current_user: Annotated[User, Depends(get_current_user)],
db: Session = Depends(get_db),
):
db_user = get_user_by_username(db, user.username)
#adcionado um comparador para o id do usuário utilizador, e o usuário do banco.
if current_user.id == db_user.id:
for var, value in user.dict().items():
if value:
setattr(db_user, var, value)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
##################################################################################################
# LEVEL 2
@router.put("/profile", response_model=UserUpdate, status_code=status.HTTP_200_OK)
def update_profile(
user: UserUpdate,
current_user: Annotated[User, Depends(get_current_user)],
db: Session = Depends(get_db),
):
db_user = get_user_by_username(db, user.username)
if current_user.id == db_user.id:
for var, value in user.dict().items():
if value:
setattr(db_user, var, value)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
##################################################################################################
# LEVEL 3 (update_user_role_service)
# this method allows staff to give Employee role to other users
# Chef role is restricted
if user.role == models.UserRole.CHEF.value:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Only Chef is authorized to add Chef role!",
)
# * Verifica se o usuário atual tem o cargo de funcionário ou Chef, se sim, ele consegue alterar o cargo.
if current_user.role == models.UserRole.EMPLOYEE or current_user.role == models.UserRole.CHEF:
db_user = update_user(db, user.username, user)
return current_user
##################################################################################################
# LEVEL 4
from urllib.parse import urlparse
ALLOWED_DOMAINS = {"imgur.com", "unsplash.com", "images.unsplash.com"}
def is_valid_image_url(url: str) -> bool:
try:
parsed_url = urlparse(url)
domain = parsed_url.netloc.lower()
if domain.startswith("www."):
domain = domain[4:]
if domain not in ALLOWED_DOMAINS:
return False
response = requests.head(url, allow_redirects=True)
content_type = response.headers.get("Content-Type", "")
return content_type.startswith("image/")
except requests.RequestException:
return False
def _image_url_to_base64(image_url: str):
if not is_valid_image_url(image_url):
raise HTTPException(status_code=400, detail="Invalid image URL")
response = requests.get(image_url, stream=True)
encoded_image = base64.b64encode(response.content).decode()
return encoded_image
##################################################################################################
# LEVEL 5
import subprocess
def get_disk_usage(parameters: str):
if not parameters:
parameters = "/"
if not parameters.startswith("/"):
raise ValueError("Invalid parameters: must start with '/' to avoid shell injection.")
command = ["df", "-h", parameters]
try:
result = subprocess.run(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True
)
usage = result.stdout.strip().decode()
except subprocess.CalledProcessError as e:
raise Exception(f"Command failed with error: {e.stderr.decode().strip()}")
except Exception as e:
raise Exception(f"An unexpected error was observed: {str(e)}")
return usage
- Um usuário pode alterar as informações de outro usuário.
- A rota não verifica se o id do usuário atual é igual ao id do usuário que ele vai modificar
- Diretório: app/apis/users/services/update_user_role_service.py
- rota: /profile (PUT)
- Perda/Alteração de informações sensiveis de usuários
- Risco nivel 8.2 (Alto)
- Score temporal 7.2 (Alto)
- Um usuário com cargo cliente pode adcionar o cargo de funcionario para si mesmo, ou para outros usuários
- O usuário altera seu cargo (cliente), para o cargo (employee) e tem acesso a privilegios.
- Diretório: app/apis/auth/services/update_profile_service.py
- Rota: /profile (PUT)
- Usuários comuns podem realizar ações que apenas funcionários deveriam ter permissão
- Nivel do risco 8.0 (Alto)
- Nivel temporal 7.1 (Alto)
- Quando o usuário insere o role de employee no body da requisição, o sistema aceita e permite a alteração de informações de outros usuários
- Diretório: app/apis/users/services/update_user_role_service.py
- Rota: /users/update_role (POST)
- Usuários comuns adquirindo permissão de employee para editar outros usuários
- Nivel do risco 8.0 (alto)
- Nivel temporal 7.1 (alto)
O usuário pode inserir qualquer tipo de link ao adicionar imagem, e obter acesso ao endpoint de reset de senha do chef
- Um usuário com role de employee pode editar um item do menu, e inserir links com intenções maliciosas.
- A rota de reset de senha do chef é apenas acessada pelo localhost. Quando o usuário insere exatamente esse link, o sistema faz uma requisição para esse endpoint, resetando a senha do chef e retornando-a para o usuário.
- Diretório: app/apis/menu/utils.py
- Rota: /menu (PUT)
- Usuário pode resetar a senha do chef e obter acesso a ela, dando oportunidade para que ele acesse a conta do chef.
- Nivel do risco 6.8 (médio)
- Nivel temporal 6.1 (médio)
- Ao manipular parâmetros da rota que verifica o espaço no disco, o usuário pode injetar comandos de shell que são executados pelo sistema
- Diretório: app/apis/admin/utils.py
- Rota: /admin/stats/disk (GET)
- O usuário pode executar comandos maliciosos diretamente no terminal do servidor da API
- Nivel do risco 8.3 (Alto)
- Nivel temporal 7.4 (Alto)
