28.12.2010

majinboo.42

Afin de soutenir l’initiative du 42Registry, ce blog est désormais aussi accessible via l’URL http://majinboo.42/. L’extension .42 n’étant pas une extension officielle de l’ICANN, il faut utiliser un resolver avec une configuration spécifique (cf le site du 42Registry)

L’initiative est intéressante pour deux raisons :

  • L’ICANN a tendance à oublier la neutralité du réseau dans certaines des ses actions (par exemple : l’invalidation de certains noms de domaines sur de simples présomptions), l’émergence de modèles alternatifs à l’ICANN est donc important pour le bon fonctionnement d’un Internet libre et ouvert
  • C’est le premier TLD numérique, les RFC ne l’excluent pas mais certains développeurs n’ont jamais eu l’occasion de tester le bon fonctionnement de leur code avec ce type de domaines.

En particulier les développeurs de Lighttpd qui ont eu la bonne idée d’inclure un parsing supplémentaire pour le header Host de chaque requête HTTP traitée. Cette fonctionnalité n’est a priori pas nécessaire pour respecter les RFC et n’apporte pas grand chose d’un point de vue sécurité (si le parsing générique des headers HTTP contient une vulnérabilité, ce parsing ne protégera qu’un seul header et ne bloquera pas l’exploitation sur les autres headers). Par contre ce parsing renvoi une erreur sur TLD numériques : le parseur se prend les pieds dans le tapis quand il parse en commençant par les derniers caractères majinboo.42, il pense qu’il parse une IP alors qu’il est en train de parser un FQDN.

Comme je suis d’une humeur fainéante aujourd’hui et que je ne voyais pas l’intérêt de ce parsing, je me suis limité à un patch désactivant ce parsing. Voici donc le patch quick’n'dirty à déposer dans files/src-request.c si vous utilisez le port FreeBSD :


--- src/request.c.orig  2010-12-28 14:44:38.000000000 +0100
+++ src/request.c       2010-12-28 14:45:30.000000000 +0100
@@ -1102,23 +1102,23 @@
}

/* check hostname field if it is set */
-       if (NULL != con->request.http_host &&
-           0 != request_check_hostname(srv, con, con->request.http_host)) {
-
-               if (srv->srvconf.log_request_header_on_error) {
-                       log_error_write(srv, __FILE__, __LINE__, "s",
-                                       "Invalid Hostname -> 400");
-                       log_error_write(srv, __FILE__, __LINE__, "Sb",
-                                       "request-header:\n",
-                                       con->request.request);
-               }
-
-               con->http_status = 400;
-               con->response.keep_alive = 0;
-               con->keep_alive = 0;
-
-               return 0;
-       }
+//     if (NULL != con->request.http_host &&
+//         0 != request_check_hostname(srv, con, con->request.http_host)) {
+//
+//             if (srv->srvconf.log_request_header_on_error) {
+//                     log_error_write(srv, __FILE__, __LINE__, "s",
+//                                     "Invalid Hostname -> 400");
+//                     log_error_write(srv, __FILE__, __LINE__, "Sb",
+//                                     "request-header:\n",
+//                                     con->request.request);
+//             }
+//
+//             con->http_status = 400;
+//             con->response.keep_alive = 0;
+//             con->keep_alive = 0;
+//
+//             return 0;
+//     }

switch(con->request.http_method) {
case HTTP_METHOD_GET:
Partager cet article :
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • HackerNews
  • LinkedIn
  • Netvibes
  • Slashdot
  • Twitter
  • viadeo FR
  • Wikio FR

Commentaires

Réagissez