
Exemple de code d'exploit pour CVE-2021-33831
L'application est utilisée pour le suivi des personnes conformément à la législation allemande sur les infections afin de pouvoir retracer les chaînes d'infection Covid-19. Elle a été créée par un projet étudiant appelé iCampus et est utilisée non seulement à l'université de Wildau mais aussi à Cottbus-Senftenberg. Environ 10 000 personnes sont concernées. Les invités des universités sont tenus d'utiliser cette application.
L'application se compose d'un frontend Vue et d'un backend Laravel.
Le backend expose le point de terminaison d'enregistrement des utilisateurs invités /corona-app-backend/api/account/register
qui permet l'enregistrement des invités de l'université. Les membres de l'université peuvent se connecter en utilisant leur combinaison nom d'utilisateur/mot de passe d'authentification unique.
Ce point de terminaison d'enregistrement n'est pas protégé contre la création automatisée d'utilisateurs (par exemple via un captcha). Dès qu'un programme obtient un cookie csrf via /corona-app-backend/sanctum/csrf-cookie et un jeton de session via /corona-app-backend/account, il peut créer des utilisateurs. Autant qu'il le souhaite. Aussi longtemps qu'il le souhaite. Le trop grand nombre de faux utilisateurs rend pratiquement impossible pour une organisation de santé de retracer les chaînes d'infection, ce qui en fait une attaque par déni de service.
L'enregistrement d'un utilisateur est une requête POST vers le point de terminaison d'enregistrement, contenant le cookie csrf et le jeton de session, avec la charge utile JSON suivante :
{"first_name":"John","last_name":"Doe","telephone":"099182","email":null,"accept":true}
Le champ email ou le champ téléphone doit être renseigné. Aucun des deux n'est vérifié (hormis les contrôles de syntaxe).
Avec une session utilisateur valide, des visites (check-ins dans les salles) peuvent être créées via le point de terminaison /corona-app-backend/api/visit.
Une visite est une requête POST vers le point de terminaison de visite, contenant le cookie csrf et le jeton de session, avec la charge utile JSON suivante :
{"room":"15-K01","visited_on":"2021-05-09T22:01:00.000Z","exited_on":"2021-05-10T21:59:00.000Z"}')
La valeur du champ room peut être obtenue à partir d'une liste qui peut être récupérée depuis le point de terminaison des salles /corona-app-backend/api/rooms et qui fournit un JSON avec toutes les salles de l'université. Il suffit du cookie csrf et du jeton de session pour que l'appel aboutisse.
Le problème peut être comparé à CVE-2021-33840 mais va beaucoup plus loin.
De plus, l'application ne contient aucun chiffrement dans les parties frontend/backend (en dehors du chiffrement de transport via https). Le backend reçoit des données JSON non chiffrées et fournit des données JSON non chiffrées.
Le code d'exploitation entièrement automatisé, écrit en langage Perl, crée 500 utilisateurs (à partir de bases de données de noms aléatoires) avec des numéros de téléphone aléatoires mais d'apparence valide, et tous les utilisateurs sont enregistrés dans une seule salle. Entièrement automatisé. Un délai de 5 s/requête a été inséré afin de ne pas surcharger le serveur et de ne pas déclencher une protection qui aurait pu exister. L'exploit s'est exécuté entièrement automatiquement avec succès et j'ai signalé le problème, y compris les faux utilisateurs créés, à l'université le jour même.
Avant de choisir une salle, je me suis assuré que la salle n'avait pas été visitée ce jour-là. Cela est possible car l'application contient un compteur indiquant le nombre de personnes avec lesquelles on a été en contact dans une salle donnée. Ainsi, si l'on visite une salle et que ce compteur est à 0, personne d'autre n'était dans cette salle pendant cette période.
L'application était également affectée par une RCE issue de CVE-2021-3129, que j'ai signalée à l'université le 12.04.2021.
Le problème actuel a été signalé le 31.05.2021.
Pour les deux signalements, j'ai reçu un accusé de réception par courriel le lendemain de leur envoi. Je n'ai rien reçu d'autre par la suite.
Une demande d'accès au code source de l'application est en cours.