GCP - Cloudfunctions Privesc
cloudfunctions
Mais informações sobre Cloud Functions:
GCP - Cloud Functions Enumcloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Um atacante com esses privilégios pode criar uma nova Cloud Function com código arbitrário (malicioso) e atribuí-la a uma Service Account. Em seguida, vazar o token da Service Account a partir dos metadados para escalar privilégios para ela. Alguns privilégios para acionar a função podem ser necessários.
Scripts de exploração para este método podem ser encontrados aqui e aqui e o arquivo .zip pré-construído pode ser encontrado aqui.
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Um atacante com esses privilégios pode modificar o código de uma Function e até mesmo modificar a service account anexada com o objetivo de exfiltrar o token.
Para implantar funções em nuvem, você também precisará de permissões actAs sobre a service account de computação padrão ou sobre a service account que é usada para construir a imagem.
Alguns privilégios extras, como a permissão .call
para a versão 1 de cloudfunctions ou o papel role/run.invoker
para acionar a função, podem ser necessários.
Se você receber o erro Permission 'run.services.setIamPolicy' denied on resource...
é porque você está usando o parâmetro --allow-unauthenticated
e não tem permissões suficientes para isso.
O script de exploração para este método pode ser encontrado aqui.
cloudfunctions.functions.sourceCodeSet
cloudfunctions.functions.sourceCodeSet
Com esta permissão, você pode obter uma URL assinada para poder fazer o upload de um arquivo para um bucket de função (mas o código da função não será alterado, você ainda precisa atualizá-lo)
Não tenho certeza de quão útil apenas esta permissão é do ponto de vista de um atacante, mas é bom saber.
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
Dê a si mesmo qualquer um dos .update
ou .create
privilégios anteriores para escalar.
cloudfunctions.functions.update
cloudfunctions.functions.update
Ter apenas permissões de cloudfunctions
, sem iam.serviceAccounts.actAs
, você não poderá atualizar a função, ENTÃO ISTO NÃO É UM VÁLIDO PRIVESC.
Permissões de Escrita no Bucket
Você pode pensar que um atacante com permissões de escrita sobre o bucket onde o código das Cloud Functions está armazenado poderá modificar o código sobrescrevendo o function_code.zip
e então fazer a função executar código arbitrário.
No entanto, isso não é verdade, apenas sobrescrever o código dentro do bucket não modificará o código que está sendo executado.
Referências
Last updated