SRC: Control de versiones para proyectos de un solo archivo

Tiempo atrás consulté con mis amigos cual sería la forma adecuada de mantener el histórico de versiones de distintos proyectos que están conformados por un único archivo de código fuente; o alternativamente, si alguno conocía un sistema de control de versiones tal como subversion, mercurial o git, que permitiera mantener esa información sin tener que crear todo el proyecto en un nuevo directorio y sin el overhead de trazar cambios en jerarquías de carpetas y similares. La idea es sencilla: muchas veces hago scripts sueltos que no merecen estar alojados en un repositorio de código particular -están todos juntos en un directorio “scripts”-, pero de los que me interesa mantener un historial de cambios y revisiones.

Tomás me recomendó GistBox, que parece bastante piola puesto que en cierta forma está destinado a mantener esa “biblioteca” de código variado que uno va acumulando con el tiempo. Además los Gists siguen siendo repositorios git, por lo cual tienen todas las ventajas de un control de versiones. Pero aquí ya uno depende un poco de los servicios en la nube y además sigue siendo necesario mantener los archivos fuente en directorios aparte.

Salvando GistBox, hasta el momento no había encontrado ningún software que realice tal tarea, e incluso estuve tentado a comenzar un proyecto propio para tal fin.

Sin embargo, recientemente di con un post de Eric Raymond en el cual menciona la creación de un nuevo proyecto denominado SRC o “Simple Revision Control”, basado en RCS y definido como “Revision control with a modern UI for single-file solo projects kept possibly more than one to a directory”. En palabras sencillas, justo lo que estoy buscando.

Según el sitio web del proyecto -que al involucrar múltiples archivos, está mantenido en git, pun intended!-, Simple Revision Control es:

RCS recargado -un pequeño y cómodo sistema de control de versiones para proyectos de único archivo, único desarrollador, tal como todos esos pequeños scripts en el directorio ~/bin. Cuenta con operación libre de bloqueo, una interfaz de usuario limpia y moderna similar a la de subversion, documentación integrada, y los archivos de historia son archivos sencillos de RCS.

A primera vista tiene tres ventajas: a) cumple con lo que yo había solicitado; b) está desarrollado en python; y c) por el propio autor de “The Art of UNIX Programming”. Más no se puede pedir.

Mientras estaba leyendo el artículo, en los comentarios aportan otra utilidad similar (que también desconocía): Zit, the git-based single file content tracker. Por ahora voy a probar SRC y ver si se ajusta a mi forma de trabajo. En un tiempo les comento que tal fue.

El mejor consejo que recibí sobre programación

Vía Hacker News leo un viejo artículo de Russ Olsen en el que comenta cual fue el mejor consejo que recibió sobre programación.

Por motivos que resultarán evidentes, yo no coincido con el consejo, sino con lo que afirma el autor en el último párrafo, que sin su permiso transcribo a continuación:

Años más tarde, en la medida que me encontré construyendo y gestionando equipos de desarrollo, advertí que había en aquel antiguo proyecto probablemente una docena de programadores que sabían por qué el sistema andaba tan lento, y cómo resolverlo. Lo sabían, pero se mantuvieron en silencio ya que en esa organización había ciertas cosas que eran más importantes que mejorar el sistema. [La frase] En el futuro, no te metas en el código ajeno* asume que habrá un futuro. Pero la mejor manera de tener un futuro es ser parte de un equipo que valora el progreso por sobre la política, las ideas por sobre el territorio y la iniciativa por sobre el decoro.

Impecable.

* por no elegir una traducción más explícita.

Analizando ejecutables de Windows con software libre

Tras haber repasado durante la creación de gpefile.py las estructuras internas del formato Portable Executable (PE) que describe a los ejecutables de Windows, otro de los pet projects en los que he picado código es un sencillo generador de gráficos de flujo de control (control flow graphs) para comprender el flujo de ejecución de los binarios de dicha plataforma.

Haciendo uso de pefile, pygraphviz y principalmente pymsasid, con unas 400 líneas de python es posible partir de un ejecutable cualquiera y obtener un gráfico como el siguiente.

autochk-fragment2autochk – full image (big!) – dot file


Desde luego este es un ejemplo extremadamente sencillo y trivial, analizando el binario
autochk.exe de ReactOS 0.3.16, un sistema operativo binary-compatible con Windows. El gráfico de flujo de control para un ejecutable moderno crece rápidamente a raíz de los distintos caminos que el compilador debe generar para representar las instrucciones presentes en el código fuente original de la utilidad (autochk.c).

El diagrama siguiente fue construido a partir del ejecutable hideflag.exe, que es un código histórico en este blog. He marcado en amarillo el bucle principal que se puede apreciar en el código fuente de la aplicación (en pascal, esta vez).

hideflag-fragment2hideflag – full image (big!) – dot file


Para el despliegue de los gráficos, dado que los visores en Debian se mambean con imagenes de varios megapíxeles (bugs
581891 y 163090 ya reportados en varios lugares), les recomiendo descargar los archivos .dot originales y visualizarlos directamente con la excelente utilidad xdot (también hecha en python, de paso).

En el diagrama, cada bloque básico inicia con un punto de entrada (primera instrucción a ejecutar, EIP, o destino de un salto) y finaliza con otro salto, una instrucción de retorno (ret), o bien abruptamente como resultado de un límite impuesto arbitrariamente por mí (esto último para evitar generar gráficos grandes con los cuales dot se marea, y créanme que algunos tardan más de diez minutos en desplegarse).

El bloque marcado en verde es comúnmente el primero en ejecutarse. Las flechas de colores indican, obviamente, el flujo de ejecución posible. Los códigos son los siguientes:

  • Flechas azules salto incondicional;
  • Flechas negras  continuación/fall-thru (instrucción que sigue directamente a la actual);
  • Flechas violetas llamada a función (sólo la ida, se asume que la llamada a función retorna a la instrucción siguiente);
  • Flechas verdes bloque a ejecutar en un salto condicional si la condición evaluada resulta verdadera;
  • Flechas rojas bloque a ejecutar en un salto condicional si la condición evaluada resulta falsa;
  • Flechas celestes callback al que apunta algún argumento del código (no implica que la función sea llamada en ese momento)

Las flechas punteadas representan saltos encadenados (JMP-to-JMP) que suelen verse en los binarios y que el script trata de reducir a fin de simplificar las secuencias en los gráficos generados (de ahí que el destino no coincida con las dirección del salto original, pero a la larga termina allí).

En algunas instrucciones, si el operador es una dirección de memoria válida y refiere a la sección de datos del ejecutable, el script añade el contenido de dicha dirección como comentario a la instrucción desensamblada (útil para ver cadenas de formato pasados como parámetro a llamadas a impresión en pantalla); si en cambio refiere a la sección de código, interpreta que se trata de un puntero a función utilizada como callback. De forma similar, trata de interpretar las llamadas a funciones de bibliotecas (resumiendo CALL y CALL-to-JMP) mediante información existente en la IAT si estuviera disponible.

Desde ya, el código que genera estos gráficos tiene innumerables errores y limitaciones (ej, evaluación de saltos indirectos, mejor detección de callbacks, interpretación de loop/loopX y muchas más cosas). En resumen, es sumamente borrador, por eso no lo puse en línea con esta entrada. En realidad lo estoy utilizando como preprocesador para una fase siguiente de decompilación. En cuanto lo tenga mas o menos prolijo lo subo a una cuenta de github, por si a alguno le interesa. También me va a servir a mí para acostumbrarme a usar ese servicio, hehe.

Lo curioso de todo es lo cómodo que resulta Debian para hacer análisis de ejecutables de Windows, jaj.

Antipatrones de SQL

Así lo describen en el sitio web

Bill Karwin ha ayudado a miles de personas a escribir mejor SQL y construir bases de datos relacionales más fuertes. Ahora él comparte su colección de antipatrones – los errores más comunes que ha identificado en esas miles de peticiones de ayuda.

El libro al que me refiero es “SQL Antipatterns: Avoiding the Pitfalls of Database Programming” y a mi juicio debería ser de lectura obligada para que todo desarrollador que toca bases de datos conozca lo que NO debe hacer. Al menos en mi experiencia, he visto estos antipatrones implementados demasiadas veces.

Estas slides algo viejas, de la MySQL Conference & Expo 2009, les darán una idea de lo que trata el texto:

Sql Antipatterns Strike Back from Karwin Software Solutions LLC

Jornada de Python en Luján: PyDay Luján 2012

Replico FYI:

PyAr, el grupo de usuarios de Python Argentina, está orgulloso de presentar una nueva Jornada del lenguaje Python 2012 (PyDay) en la Universidad Nacional de Luján, el día Sábado 5 de Mayo de 2012 de 11Hs a 18Hs.

Durante el Python Day se darán pequeños cursos y charlas relacionadas a este lenguaje, creando un espacio en donde cualquier persona interesada pueda acercarse para preguntar, aprender y experimentar con esta herramienta.

Python es un lenguaje moderno, sencillo de aprender pero muy poderoso en cuanto a la cantidad de aplicaciones en las que es usado profesional y académicamente: en sitios web, en juegos, aplicaciones de escritorio y en scripting en general, etc…

El publico al que nos dirigimos es de todos los niveles, pero estamos muy interesados en acercar Python a quienes solo lo conocen de oído o directamente no saben de que tipo de lenguaje se trata. Tendremos charlas especiales para ellos.

Con esta misma invitación damos por iniciado el Call For Charlas; aquellos interesados ya pueden proponer nuevas charlas y son bienvenidos los colaboradores y empresas/entidades interesadas en participar y auspiciar la jornada.

Cualquier duda o consulta, el mail de contacto es pydaylujan@gmail.com
El encuentro se llevará a cabo en el pabellón 400 de la sede central de la UNLu http://www.unlux.com.ar/como-llegar/

La entrada libre y gratuita (previa inscripción web), ¡los esperamos!

Open Security Training, CS:APP y gPEFile

Finalizando las vacaciones, antes de reincorporarme al trabajo diario, dediqué unos días a seguir uno de los cursos de análisis de malware que tenía agendado desde hace tiempo, en este caso, el de Open Security Training.

La gente de OST provee el material, los ejemplos y los videos en línea para que uno vaya, a su tiempo, incorporando conocimientos repartidos en las siguientes clases:

Beginner Classes

Intermediate Classes

Advanced Classes

La primera clase sirve como base para las siguientes y discurre sobre los conceptos iniciales, describe el hardware sobre el que se programa en lenguaje ensamblador, describe con varios ejemplos las instrucciones del lenguaje más comunes, y muestra cómo seguir la ejecución de un programa con en Windows con Visual Studio Debugger (u OllyDbg, que no es tan distinto) y en GNU/Linux con gdb. Como bien hace mención el instructor, con conocer algunas pocas instrucciones ya es posible leer la mayoría de los programas.

La clase finaliza dejando como tarea el análisis y la resolución del clásico ejercicio de “bomba binaria” de la asignatura Arquitectura de Computadores de la Carnegie Mellon University, la cual requiere conocer técnicas básicas de ingeniería inversa para progresar a traves de las diferentes fases de la bomba, dando las respuestas correctas y evitando “explotarla”. Sin duda es un ejercicio que me ha entretenido mucho, me ha hecho pensar bastante, y que realmente debo recomendar como un buen inicio al arte de la ingeniería inversa.

Buscando información sobre el tema dí con el libro de cabecera de tal asignatura: Computer Systems: A Programmer’s Perspective, cuya edición 2011 es altamente recomendable. Está escrito en un lenguaje claro pero detallado, con ejemplos concretos (casi diría “palpables”) para explicar las abstracciones de sistema, y con un amplio conjunto de ejercicios para realizar. El sitio web contiene algunas secciones de ejemplo que sirven como preview, así como también material adicional al texto en papel. En retrospectiva, es el libro que me tendrían que haber recomendado cuando cursé las materias de arquitectura.

La clase “The Life of Binaries” trata efectivamente sobre “la vida de los ejecutables”, desde su creación: parsing del código fuente, abstract syntax trees, estrategias de compilación, lenguajes intermedios, enlazado del binario final; hasta su carga en memoria por el loader del sistema operativo y posterior ejecución en el computador. Se dan descripciones detalladas sobre los formatos binarios Portable Executable (PE) de Windows y Executable and Linkable Format (ELF) de Linux. El recorrido por el formato PE y su estructura, basado en el trabajo realizado por Ero Carrera, es muy completo y esclarecedor. La clase abarca también algunas de las técnicas que de ocultamiento y hooking utilizadas comúnmente en el malware, cómo funcionan realmente los virus de computadora, y qué técnicas es posible utilizar fácilmente para brindar mayor seguridad a los binarios que se generan.

A partir de esta clase se me ocurrió aprovechar el excelente trabajo realizado por Carrera con la biblioteca pefile y desarrollar con python-gtk2 un visor de archivos PE para interfaz gráfica, inspirado en el utilizado en los videos de entrenamiento. Dejo algunas capturas de la primera versión que no da vergüenza mostrar. El código, como siempre, se puede descargar desde el link que sigue y las correcciones y sugerencias serán bienvenidas.

Descargar: gpefile.py (v0.19, 78 KB)

Último cambio: Agregado despliegue de recursos RT_BITMAP, RT_GROUP_CURSOR, RT_GROUP_ICON, RT_STRING, GIF y PNG.

Me queda pendiente continuar con las clases siguientes, en cuanto el tiempo me lo permita. A la gente detrás del proyecto de Open Security Training, mi sincero agradecimiento por la dedicación y por el material brindado generosamente a la comunidad.

(Mayormente) útiles reglas de desarrollo de software

Se fue junio como por un tubo, y si bien han habido varias noticias en el entorno open source, muchos ya se han encargado de ellas. La salida de Mozilla Firefox 3.5, VirtualBox 3.0, y recientemente VLC 1.0 y algunas más que no recuerdo.

Aviso, de paso, que si alguno quiere tener Firefox 3.5 en Debian amd64, puede obtener el fuente y compilarlo, o bien aprovechar los paquetes pre-release de Iceweasel 3.5 que Mike Hommey tuvo la delicadeza de poner a nuestra disposición.

Pero lo de hoy es una breve traducción de un post que ayer publicaron en Pingdom titulado “Quirky but (mostly) useful software development rules“, recordando reglas con las cuales adhiero bastante.

Regla del noventa-noventa

El primer 90% del código ocupa el 90% del tiempo de desarrollo. El 10% restante del código ocupa el otro 90% de tiempo de desarrollo. (puede parecer equivocada, pero es así)

Ley de Hofstadter

Siempre lleva más tiempo del que uno espera, incluso si se tiene en cuenta la Ley de Hofstadter.

Ley de Brooks

Agregar gente a un proyecto atrasado, lo atrasa aún más.

Ley de Lister

La gente, presionada por el tiempo, no piensa más rapido.

Método MoSCoW

Una técnica para priorizar la entrega de requerimientos durante el desarrollo. MoSCoW significa:
MUST have this. — DEBE tener esto.
SHOULD have this if at all possible. — DEBERÍA tener esto si es posible.
COULD have this if it does not affect anything else. — PODRÍA tener esto si no afecta otra cosa.
WON’T have this time but WOULD like in the future. — NO tendrá esto ahora pero PODRÍA tenerlo en el futuro.

Principio KISS

«Manténgalo breve y simple» («Keep It Short and Simple»), en la forma más educada.

Ley de Gall

Un sistema complejo que funciona es siempre una evolución de un sistema simple que funcionó.

Peor es mejor, o estilo Nueva Jersey

Describe como un producto “inferior” puede ser mejor desde la perspectiva del usuario. Un software limitado pero fácil de usar puede ser más popular entre los usuarios que un software “mejor”, pero más abarcativo.

Décima regla de Greenspun

Cualquier programa C o Fortran lo suficientemente complicado contiene una implementación ad-hoc, informalmente especificada, lenta y llena de errores de la mitad de Common Lisp.

Ley de Zawinski

Cada programa intenta expandirse hasta que puede leer mail. Aquellos programas que no pueden expandirse de esta manera se reemplazan por otros que sí pueden.

Ley de Linus

Dado un número suficientemente elevado de ojos, todos los errores se convierten en obvios.

Ley de Murphy

Clásica: Si algo puede salir mal, saldrá mal.

Ley de Sutton

Ve a donde está el dinero.
Es decir, al diagnosticar un problema, uno debería confirmar primero si se trata del diagnóstico mas común, p.ej. probando la solución más evidente. Toma su nombre del ladrón Willie Sutton, que atracaba bancos “porque ahí es donde está el dinero.”

Ley de Wirth

El software se ralentiza más deprisa de lo que se acelera el hardware.

Ley de Conway

Una pieza de software refleja la estructura organizacional de la organización donde se produjo.

Principio de Hollywood

No nos llame, nosotros lo llamaremos.
En vez de que el programa ejecute al sistema, el sistema ejecuta su programa.

Principio de Dilbert

Los trabajadores más incompetentes son promovidos sistemáticamente al lugar donde pueden hacer menos daño: la administración.

Fuente: Quirky but (mostly) useful software development rules (Pingdom) y Wikipedia

Adios a un maestro

Me entero por Tech Source from Bohol (y por reddit, pero no por slashdot, curiosamente) de una triste noticia: Fravia+ nos ha dejado tras una difícil enfermedad.

Para quienes hemos hecho andanzas en cracking y en la ingeniería inversa, Fravia ha sido mucho más que un maestro. Por mi parte, alrededor del año 98 tuve acceso por primera vez (y con un viejo módem Zoltrix de 33,6kbps) a la web [http://fravia.com] que mantuvo hasta su muerte y que es uno de los más completos repositorios de documentación sobre ingeniería inversa, con excelentes artículos de su autoría y de varios contribuyentes. Su web, replicada en varios mirrors por el mundo, es por así decirlo una especie de portal del tiempo, lo podrán ver por el estilo que conservó desde su creación; y a la vez un acervo muy completo de conocimiento, pero sólo para aquellos que saben encontrarlo.

Fiel a su estilo, antes de partir nos dejó un mensaje de despedida: Sour ‘n Sweet Swan Song.

Desde este humilde espacio vayan mi agradecimiento y mis más sinceros respetos. Y como rezaba en los artículos, recuerden:

There is a crack, a crack in everything.
That’s how the light gets in.

Mirar para adentro

El aviso de seguridad de Debian DSA-1571-1 arranca así… “Luciano Bello descubrió que el generador de números aleatorios en el paquete openssl de Debian es predecible. Esto es causado por un cambio realizado al paquete openssl particular de Debian. Como resultado, el material de clave criptográfica puede ser comprometido.”

… y con ese primer párrafo se desencadena el apocalipsis criptográfico, como bien lo denomina Luciano en su blog.

La falla descubierta por Bello es crítica al extremo. Permite comprometer un sistema en cuestión de minutos u horas y afecta desde hace 2 años a miles de hosts en el mundo que corren Debian y sus derivados. Estamos hablando de que es posible vulnerar los controles de acceso a virtualmente cualquier host con un servicio openssh que esté utilizando claves públicas. Ya hay scripts como para entretenerse bajando servers por todos lados.

Como debianero/debianita (near fanatic) que soy, esto me preocupa, y mucho. Si bien la solución fue bastante trivial (yo ya hice lo debido en cada host), así como también lo es la falla original, creo que es momento de plantearse seriamente el proceso de aplicación de parches en el proyecto. Luciano lo deja más que claro en su blog: “… necesitamos un proceso de auditoría real en los parches específicos de Debian. Es difícil, pero necesario.

En la red ya hay un cúmulo de repartijas de responsabilidades, en ./ en inglés, en ./ en castellano. Lo que yo saco en limpio es más o menos lo siguiente:

  • Muchos de nosotros como desarrolladores de software libre tenemos una parte de responsabilidad ya, por el mínimo hecho de no auditar código por nuestra propia seguridad (y me incluyo entre los que no lo han hecho). Obviamente en los casos donde uno pueda, ya que leer código no es para cualquiera y cada paquete tiene lo suyo.
  • El responsable del paquete también tiene lo suyo por realizar la modificación sin interiorizarse un poco más en el algoritmo subyacente (sepa Ud. que aquí hablo por tener boca y con autoridad nula). Aunque su responsabilidad no es tanta como se le ha atribuído originalmente, pues…
  • Los desarrolladores de openssl (a quien debo mis respetos) sí fueron consultados originalmente respecto del parche, pero la respuesta no fue lo suficientemente explícita. Muchos ya han expresado su opinión respecto de que quizá deberían documentar un poco más el código fuente.

Mas allá de lo malo que ésto ha sido (digo, la vulnerabilidad), rescato dos tres cosas:

  • La transparencia en los procedimientos de publicación y tratamiento de la vulnerabilidad. Un fallo de estas características en un producto privativo podría implicar una pérdida importante para su empresa proveedora, que en su intento de minimizar el impacto podría optar por ocultar no sólo el fallo sino su reparación. Los más conspirativos pueden pensar, incluso, que esto ocurre constantemente en muchos productos de software. Debian, por las características del proyecto y por cómo es llevado a cabo tiene la clave en el punto 3 del contrato social: No ocultaremos los problemas. Sólo esto, para mí, es fantástico.
  • La celeridad con que actuó la comunidad. Para calcular esto deberíamos saber con exactitud cuándo se contactó Luciano con la gente de security, pero el hecho es que al momento de la publicación de la falla ya estaba en los mirrors la version de openssl arreglada.
  • Y el hecho de que haya sido un propio Debian Developer (y argentino para colmo, tras que no somos agrandados) el que lo haya detectado. De acá es donde viene el título del post, él hizo lo que muchos debemos hacer: mirar para adentro.

Para finalizar:

  • Mis felicitaciones a Luciano por su primer DSA que ha sido impactante.
  • Cayendo se vuelve a andar, así dicen…
  • Ah, y aprovechen iptables que para algo está.

Saludos!

La única métrica válida de calidad de código

La única métrica válida de calidad de código…

… es WTF/minuto.

Visto en OSnews Comics.

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress