GCP - Cloudfunctions Privesc
cloudfunctions
Más información sobre Cloud Functions:
GCP - Cloud Functions Enumcloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Un atacante con estos privilegios puede crear una nueva Cloud Function con código arbitrario (malicioso) y asignarle una Service Account. Luego, filtrar el token de la Service Account desde los metadatos para escalar privilegios a ella. Algunos privilegios para activar la función pueden ser requeridos.
Los scripts de explotación para este método se pueden encontrar aquí y aquí y el archivo .zip preconstruido se puede encontrar aquí.
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Un atacante con estos privilegios puede modificar el código de una Function e incluso modificar la cuenta de servicio adjunta con el objetivo de exfiltrar el token.
Para desplegar funciones en la nube también necesitarás permisos actAs sobre la cuenta de servicio de cómputo predeterminada o sobre la cuenta de servicio que se utiliza para construir la imagen.
Algunos privilegios adicionales como el permiso .call
para la versión 1 de cloudfunctions o el rol role/run.invoker
para activar la función pueden ser requeridos.
Si obtienes el error Permission 'run.services.setIamPolicy' denied on resource...
es porque estás usando el parámetro --allow-unauthenticated
y no tienes suficientes permisos para ello.
El script de explotación para este método se puede encontrar aquí.
cloudfunctions.functions.sourceCodeSet
cloudfunctions.functions.sourceCodeSet
Con este permiso puedes obtener una URL firmada para poder subir un archivo a un bucket de función (pero el código de la función no se cambiará, aún necesitas actualizarlo)
No estoy realmente seguro de cuán útil es solo este permiso desde la perspectiva de un atacante, pero es bueno saberlo.
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
Dáte cualquiera de los privilegios anteriores .update
o .create
para escalar.
cloudfunctions.functions.update
cloudfunctions.functions.update
Solo tener permisos de cloudfunctions
, sin iam.serviceAccounts.actAs
, no podrás actualizar la función ASÍ QUE ESTO NO ES UNA ESCALADA DE PRIVILEGIOS VÁLIDA.
Permisos de Escritura en el Bucket
Podrías pensar que un atacante con permisos de escritura sobre el bucket donde se almacena el código de Cloud Functions podrá modificar el código sobrescribiendo el function_code.zip
y luego hacer que la función ejecute código arbitrario.
Sin embargo, esto no es cierto, simplemente sobrescribir el código dentro del bucket no modificará el código que se está ejecutando.
Referencias
Last updated