Un fin de semana desvelado

vicm3@hotmail.com (Víctor Martinez)
Tue, 22 Dec 2009 22:49:24 -0600

Y bueno por ahí salio una advertencia de seguridad, para Moodle, bueno mas bien fue como un anuncio publicitario, ya que en un blog por ahí hicieron mucho ruido de un problema que se tenia ubicado hace algún tiempo pero que no se había decido muy bien como resolver (bueno en realidad dos, el de el password salting en MD5 y que los backups de los cursos incluyeran información sobre la contraseña del usuario), al parecer la politica en estos dos ahora es incluir el salting en las instalaciones nuevas y deshabilitar que en los cursos vaya incluida información que no necesariamente se requiere (esto se ha discutido si es un feature o realmente un bug, en todo caso desde ya al migrar usuarios entre instalaciones de moodle ahora habrá que utilizar la herramienta de contraseña perdida para obtener una nueva). En fin que cuando este despapaye sucedió si me preocupo extremadamente, primero por que lo publicitaron cono una falla grave de seguridad… y de hecho yo también la considere así… al principio es decir cuando me enteré por el correo de las listas de Moodle del mismo, sin embargo he de decir que una vez viendo el video completo no es tan grave la cosa y especialmente uno debe tener una contraseña realmente débil para que sea tan problemática la cosa (en el video tal cual lo que hacen es preparar un escenario donde todo parece indicar que es trivial obtener las contraseñas, debo admitir que en md5 ha habido algunos avances en cuanto a como se puede atacar, pero no son tan graves ni tan sencillas, todavía, al respecto existe una discusión interesante sobre SHA y MD5 en la creación de llaves públicas pero eso ya va por otro lado)

En fin que me intereso la cosa y también me pico curiosidad si esto se arreglaría rápido en Debian por lo mismo le dí a reportbug moodle para ver si ya lo habían reportado y no aún cuando ya tenía varios días y la cosa ya estaba en algunos portales de noticias y bueno lo reporte.

Desgraciadamente no apareció de manera rápida un arreglo de este y otros problemas que finalmente fue publicado en los release notes de la versión 1.8.11 (y de la 1.9 stable también) , ahora según veo en la instalación que utilizamos no tengo tanto problema por la mayoría de estos problemas, sin embargo me quede con la duda y le escribí a Gunnar que aunque se que no es ni el mejor momento ni quien esta a cargo de esto en Debian pues si es con quien normalmente platico de cosas como esta y además está mucho mas enterado que yo del asunto en fin que después de un ir y venir de correo con algunos desarrolladores mas, lo único que me queda es que o no se ha considerado grave estos problemas o nadie se ha puesto ha moverlos, bueno pues ahí mas o menos como he escuchado un montón de veces, si te importa pues arréglalos.

Y eso fue lo que intente, he de decir que aunque mas de una ocasión se me ha presentado para aprender a empaquetar en Debian, y al menos lo intente una vez con Claroline (intento detenido en gran parte por un correo de Moritz Muehlenhoff que correctamente mencionaba todos los problemas de seguridad que había tenido Claroline) en fin le di una re leída rápida al New Maintaner’s Guide al Pragmatic Guide to create a simple Debian Package y me encontré este mensaje en la lista de desarrolladores Dev-es.

Para no complicar con mi instalación de unstable que uso en la lap, me cree un chroot con lenny usando debootstrap y ahí utilzando apt-get source moodle, empezando a ver como viene el código fuente… ahí empezaron los problemas por que y bien pude haber entendido mal viene el paquete original + los diffs de debian que finalmente es lo que se convierte en el paquete, bueno decidí dejar esto para después e instalar en mi chroot el paquete, a primera vista lo primero que se me ocurrió fue descargar el fuente del 1.8.11 y hacer un diff del directorio de este contra el 1.8.2 de Debian, lo cual me mostró la cantidad de cambios entre uno y otro mas de 160 archivos modificados.

De hecho para probar hice lo que normalmente se puede hacer con muchos paquetes en php agarre revise que no hubiera conflictos de directorios y simplemente remplace los archivos de la vieja versión con la nueva, descargue la base de datos de mi maquina de pruebas y lo arranque… no demasiado sorprendido me anuncio que necesitaba actualizarse ya que detectaba cambios en la BD y en los archivos… tal cual escrito no demasiado sorprendido pero si recordando algo por ahí de que esto rompe con la filosofía de paquetes de Debian es decir es brincar varias versiones en lugar de arreglar solo los problemas, es decir aplica nuevas funcionalidades (features) a la vez que corrige los problemas (fix issues), sin demasiado problema esto quedo funcionando pero no es lo que se requería.

Lo bueno de usar un chroot y más un respaldo del servidor de pruebas fue que no tuve mas que purgar el paquete y volver a cargar la base de datos para volver a intentar… esta vez a localizar en el change log de 1.8.11 los fixes hechos… mhhh, primer problema, los tickets de Moodle llevan al tracker y el tracker no permite ver directamente el código, en el CVS http://cvs.moodle.org/moodle/ están los cambios, pero realmente no quiero verlo contra el actual (1.9.x) buscando me encontré con que también hay un git http://git.moodle.org/gw el cual me dio mayor “facilidad” para buscar por su numero el MSA (Moodle Security Advisory supongo) contra los commits, esto al menos me llevo a encontrar lo siguiente:

Bug MDL-20932 FIXED Get rid of user->secret in backup files (and ignore it on restore) Major Resolved

http://git.moodle.org/gw?p=moodle.git;a=patch;h=306e851f93d67c6919f11d7c8910af301c57bbbf

CVE-2009-4303[2]:

Moodle 1.8 before 1.8.11 and 1.9 before 1.9.7 stores (1) password hashes and (2) unspecified "secrets" in backup files, which might allow attackers to obtain sensitive information.
Improvement MDL-20941 FIXED Store hashed username into user->email field for deleted users Major Resolved

(no tocado ya que es un feature)
Bug MDL-13952 FIXED "enrol_ldap_autocreate" create courses, even if "enrol_ldap_autocreate" is set to "no" Minor Resolved

http://git.moodle.org/gw?p=moodle.git;a=commit;h=29bd2be123a23a6ae699af8bbd58c0551f9edb07

enrol/ldap/enrol.php
Bug MDL-20288 FIXED $url cannot be null for Oracle in datalib.php add_to_log Minor Resolved

http://git.moodle.org/gw?p=moodle.git;a=commit;h=d217bcf1a8c5417db18ae07172d0a4dba5b1f6f3

lib/datalib.php
Sub-task MDL-20916 FIXED MDL-19303

Apply sesskey() mechanism to all the actions in the XMLDB Editor Minor Resolved

http://git.moodle.org/gw?p=moodle.git;a=commit;h=5aa2b2e9430e8ecdc6e4fcb8694d9b8d8440d033 (este no lo arreglo involucra 36 archivos... fuera de mi liga)
Bug MDL-18989 FIXED Improper Course Creation in LDAP sync Minor Resolved

(Fixed by MDL13952)
Bug MDL-20638 FIXED Smarty vulnerabilities may affect QTI2 export Minor Resolved

(demasiados archivos 69 modificados y se pide que no se use smarty ya que sera abandonado para la version 2...)
Bug MDL-20890 FIXED Upgrading Moodle database (1.9.6+) results in 8 identical
notices Minor Resolved

(no lo pude encontrar en el git probablemente renumerado)
Bug MDL-20927 FIXED incorrect require_login check Minor Resolved

http://git.moodle.org/gw?p=moodle.git;a=commit;h=afc9bd4ea34ddf281d0442012d245c8245ce3136

No demasiado seguro ha cambiado mucho entre versiones.
SCORM MDL-20955 fix bad use of update_record - thanks Petr

http://git.moodle.org/gw?p=moodle.git;a=commit;h=ad97538d8aa71cbb66108a8cc086b0a8d831b25e
mod/scorm/datamodels/aicclib.php
CVE-2009-4305[0]:

SQL injection vulnerability in the SCORM module in Moodle 1.8 before 1.8.11 and 1.9 before 1.9.7 allows remote authenticated users to execute arbitrary SQL commands via vectors related to an "escaping
issue when processing AICC CRS file (Course_Title)."

Claro esto ya es una tablita que quiero creer se puede leer de hecho si revisan mi diff ahí viene que archivo y que cosa se hizo, entre 1.8.2 y 1.8.11 encontré que muchos archivos cambian y que algunas cosas que venían en los commits de git dependen de cambios hechos anteriormente es decir posteriormente a 1.8.2 probé hasta donde pude los cambios que hice y con grandes reservas puedo decir que no rompen 1.8.2dfsg claro que tampoco solucionan todos los MSA en fin que fue realmente un par de noches largas (11 y 12 de diciembre) después de todo esto me cayo el veinte de que me sería mas visual si esto lo metía a mi propio control de versiones (yo sigo usando subversión) así que le hice al revés de cómo debi haber hecho, agarre y metí como commit inicial el 1.8.2.orig luego el 1.8.2dfsg lo metí como segundo commit y finalmente sobre este hice diff de lo que había modificado para ver que no estuviera mas perdido de lo que esperaba y entonces copie los archivos modificados a 1.8.2dsfg e hice el tercer commit por lo mismo el diff que posteo es mis cambios contra 1.8.2dsfg en fin que creo que esto es más útil.

Aunque pensándolo mejor el añadir saltos al sistema de contraseñas es mucho mejor y con solo arreglar dos archivos, es decir eliminar el problema de que vaya el MD5 con el usuario en el backup.

vicm3_at_avalon:~$ svn diff -r3:4 moodle/backup/backuplib.php
Index: moodle/backup/backuplib.php

--- moodle/backup/backuplib.php (revision 3)
+++ moodle/backup/backuplib.php (revision 4)
@@ -1126,7 +1126,6 _atat_
                 fwrite ($bf,full_tag("LASTLOGIN",4,false,$user->lastlogin));
                 fwrite ($bf,full_tag("CURRENTLOGIN",4,false,$user->currentlogin));
                 fwrite ($bf,full_tag("LASTIP",4,false,$user->lastip));
-                fwrite ($bf,full_tag("SECRET",4,false,$user->secret));
                 fwrite ($bf,full_tag("PICTURE",4,false,$user->picture));
                 fwrite ($bf,full_tag("URL",4,false,$user->url));
                 fwrite ($bf,full_tag("DESCRIPTION",4,false,$user->description));

vicm3_at_avalon:~$ svn diff -r3:4 moodle/backup/restorelib.php
Index: moodle/backup/restorelib.php

--- moodle/backup/restorelib.php        (revision 3)
+++ moodle/backup/restorelib.php        (revision 4)
@@ -4670,9 +4670,6 _atat_
                         case "LASTIP":
                             $this->info->tempuser->lastip = $this->getContents();
                             break;
-                        case "SECRET":
-                            $this->info->tempuser->secret = $this->getContents();
-                            break;
                         case "PICTURE":
                             $this->info->tempuser->picture = $this->getContents();
                             break;

Pero bueno en el proceso he aprendido todo lo que implica hacer un parche… de seguridad y me alegra un poco no haber empaquetado del todo Claroline, darle mantenimiento sería en este momento una pesadilla bien ganada… curiosamente preguntando a un par de usuarios de moodle resulta que usan la versión 1.9.x stable y no la de Debian (claro que eso no es concluyente).

Lo que no me da demasiada gana es reescribir esto en ingles en versión resumida y enviarla al reporte de bugs, pero supongo que lo tendré que hacer tarde o temprano.