Laravel regorge de petites fonctionnalités qui passent parfois inaperçues. Parmi elles, la classe Timebox
mérite toute notre attention, surtout pour ceux qui souhaitent renforcer la sécurité de leurs applications face aux attaques par timing.
Le problème des attaques par timing
Les attaques par timing exploitent les différences, même infimes, dans les temps d’exécution de votre code pour en déduire des informations sensibles. Cela peut concerner, par exemple, la validation des identifiants utilisateur : si une requête valide est traitée plus rapidement ou plus lentement qu’une autre, un attaquant patient et bien équipé pourrait en tirer parti.
Un type d’attaque particulièrement sophistiqué est le Timeless Timing Attack, qui utilise le multiplexage HTTP/2 pour envoyer plusieurs requêtes simultanément. Cela permet de comparer précisément les temps de réponse, indépendamment de la qualité du réseau ou des limitations habituelles (comme la limite de tentatives).
La solution : la classe Timebox
En septembre 2022, grâce à un travail remarquable de Jens Just Iversen (Ephort), Laravel a introduit la classe Illuminate\\Support\\Timebox
. Cette classe permet de garantir qu’une opération sensible prendra toujours au moins un certain temps défini, peu importe sa durée d’exécution réelle.
Le principe est simple :
- Vous passez un callback (la fonction contenant votre opération sensible) et une durée minimale d’exécution (en microsecondes).
- Si votre opération s’exécute plus rapidement que cette durée minimale,
Timebox
attend le temps restant avant de renvoyer la réponse. - Résultat : les temps d’exécution restent constants et rendent l’attaque par timing beaucoup plus difficile.
Exemple d’utilisation
Voici comment utiliser Timebox
dans votre code :
(new Timebox)
->call(function (Timebox $timebox) {
// Placez ici votre opération sensible
}, $minimumExecutionTime);
Un cas concret est la protection des identifiants lors de la connexion. Voici comment Laravel l’applique :
protected function hasValidCredentials($user, $credentials)
{
return $this->timebox
->call(function ($timebox) use ($user, $credentials) {
$validated = ! is_null($user)
&& $this->provider->validateCredentials($user, $credentials);
if ($validated) {
$timebox->returnEarly();
$this->fireValidatedEvent($user);
}
return $validated;
}, 200 * 1000);
}
Dans cet exemple, Laravel garantit un temps d’exécution minimal de 200 millisecondes, même si la validation est rapide. L’attaquant, de son côté, ne peut donc plus exploiter la différence de durée pour affiner ses attaques.
Un outil simple, une défense précieuse
La classe Timebox
n’est pas encore documentée officiellement, mais elle est facile à comprendre et à intégrer. Si vous développez votre propre système d’authentification ou gérez des zones sensibles dans votre application, c’est une solution à envisager sérieusement pour ajouter une couche supplémentaire de sécurité.
Ecrit par
Alyson Paya
Partager l'article :
Un site vitrine ? e-commerce ? une application ?