Skip to content

[Segurança] Autorização: permissão exigida escolhida pelo cliente (CheckDataFromKey/OpenTrunk) #53

Description

@ggfto

Contexto

Auditoria de bugs (ver BUGS_AUDIT.md). Vários handlers de servidor derivam a permissão exigida do dataKey que o cliente envia, em vez de fixá-la. CheckDataFromKey(key) (server/utils.lua:151) faz lookup do action no Config e devolve seu .perms; o handler roda CheckPerms(source, actionData.perms).

Impacto

Um admin de baixo escalão envia o dataKey de qualquer ação cuja permissão ele possua (ex.: remove_stress) e o handler executa a operação privilegiada. A permissão de fato exigida vira a mais baixa que o atacante escolher.

Locais

  • server/inventory.lua:81OpenTrunk usa actionData.perms cru do payload (client/inventory.lua:31 passa data). Envia {perms='qadmin.open'} e abre porta-malas de qualquer placa.
  • server/players.lua:471SetPerms (concede rank QBCore via AddPermission)
  • server/players.lua:507RemoveStress
  • server/inventory.lua:127GiveItemAll
  • server/misc.lua:156UnbanPlayer
  • server/misc.lua:249verifyPlayer
  • server/vehicle.lua:355UpdateVehicleStock

Referência do padrão correto: server/misc.lua:74 (BanPlayer) já usa nó fixo qadmin.action.ban_player.

Correção sugerida

Fixar o nó exigido em cada handler (como em BanPlayer), ou validar que o dataKey corresponde à ação correta antes de aceitar seu .perms.

Severidade: 🔴 Alto — IDs: S-02, S-03, S-04

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingluaLua (server/client) codesecuritySecurity / authorization issue

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions