Description technique

La fonction realIP() de la classe http de Clearbricks renvoie un contenu (censé être l'adresse IP du client) qui peut être modifié arbitrairement par le client en précisant les en-têtes HTTP CLIENT_IP ou X_FORWARDED_FOR sur son navigateur web (p.ex. en utilisant l'extension Modify Headers pour Firefox). De plus, il est possible d'assigner du code JavaScript à CLIENT_IP qui sera exécuté sur le navigateur de l'administrateur du blog au moment de la prévisualisation d'un commentaire ou de l'édition d'un article existant[1].

Correction rapide

Le moyen le plus simple de corriger cette faille de sécurité est d'éditer le fichier inc/clearbricks/common/lib.http.php. Il faut de remplacer la fonction realIP() (lignes 129 - 189) par celle-ci :

	public static function realIP()
	{
		if (isset($_SERVER['REMOTE_ADDR'])) {
			return $_SERVER['REMOTE_ADDR'];
		}
		else {
			return null;
		}
	}

Vous pouvez également télécharger le fichier lib.http.php joint à ce billet et le mettre à la place de l'ancien fichier.

Patch pour la version SVN

La correction rapide suffit parfaitement pour corriger cette faille de sécurité. Ce qui suit s'adresse donc à des personnes qui connaissent bien au moins les bases de la programmation et qui souhaitent faire une correction "plus propre". Si ce n'est pas votre cas, il est plus sûr d'opter pour la correction rapide, qui est équivalente.

Le patch se situe dans les documents annexes à ce billet.

Un exploit ?

Je ne montre pas ici la manière dont cette vulnérabilité peut être exploitée pour, par exemple, se connecter en tant qu'administrateur sur un blog vulnérable. Cependant c'est faisable sans trop de peine. Si je ne m'en suis pas occupé, c'est parce que mon temps libre est limité et j'ai autre chose à faire que de montrer les conséquences qu'une omission de cette correction peut avoir.

Notes

[1] La preuve, suite à un incident (involontaire de ma part), brol m'a poliment proposé d'utiliser mon propre blog pour mes essais de merde. Que brol soit rassuré, j'utilisais mon propre blog pour le faire, c'est juste que j'avais oublié de désactiver l'extension qui me permettait de faire ces essais quand je visitais son blog.