Imágenes Docker Sin Sistema

  • August 20, 2018
  • tuxotron
  • Docker

    Docker

    Una de las buenas prácticas a la hora de crear imágenes en Docker es hacer que estas sean lo más pequeñsa, en tamaño, posible.

    Por popularidad, Alpine es la distribuciión Linux preferida a la hora de crear imágenes de tamaño reducido (poco menos de 5MB), a menos que, por requerimientos de certificacion o algún otro motivo, sea necesario usar alguna distribución certificada en particular, algo común en el entorno empresarial y gubernamental.

    El proyecto Google Container Tools aloja una serie de imágenes Docker orientadas a ciertos lenguajes de programación sin sistema, es decir, no tienen ninguna distribución dentro, todo lo que contienen las imágenes son los ficheros necesarios (intérpretes) para ejecutar dicha aplicación, no contiene ni siquiera una shell. Los lenguajes de programación para los que dispones de dichas imágenes son: * Java * Python 2.7 / 3 * Go * Node.js * .Net

    Para ver alguna de las diferencias entre estas imágenes y las oficiales de cada plataforma basdas en Alpine, podemos ejecutar los siguientes commandos:

    Imagen con Python 3:

    docker pull gcr.io/distroless/python3
    ...
    
    docker pull python:alpine
    ...
    
    docker image ls
    REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
    python                         alpine              a5f497d596f5        2 weeks ago         79.4MB
    gcr.io/distroless/python3      latest              22491e3c6cda        48 years ago        50.4MB
    

    Casi 30 MB de diferencia.

    En cuanto a Java:

    docker pull gcr.io/distroless/java
    ...
    
    docker pull java:alpine
    ...
    
    docker image ls
    REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
    java                           alpine              3fd9dd82815c        17 months ago       145MB
    gcr.io/distroless/java         latest              d53055d7a4da        48 years ago        118MB
    

    Unos 27MB de diferencia.

    Como se puede ver la diferencia no es enorme, pero sí considerable. Esto no sólo nos ahorra espacio en disco y tráfico de red, sino que también mejora la seguridad. El hecho de no tener librerías o servicios que no necesitemos, reducimos riesgos de seguridad y alertas innecesarias de escaneadores de imágenes por versiones obsoletas o vulnerables.

    Las imágenes disponibles actualmente son:

    • gcr.io/distroless/python2.7
    • gcr.io/distroless/python3
    • gcr.io/distroless/nodejs
    • gcr.io/distroless/java
    • gcr.io/distroless/java/jetty
    • gcr.io/distroless/cc (contiene una versión mínima de glibc para lenguajes estáticamente compilados como D o Rust)
    • gcr.io/distroless/dotnet

    El hecho que de estas imágenes no contengan una shell no es de gran importancia, a menos que por algún motivo necesitemos saltar dentro del contenedor para depurar o inspeccionar alguna cosa. Para ello, existen las mismas imágenes con la etiqueta debug, la cual incluye busybox. Evidentemente será un poco más grande.

    Por ejemplo, si necesitamos depurar un contenedor basado en una aplicación en Java, podemos usar la imagen gcr.io/distroless/java:debug, y una tengamos el contenedor creado, podríamos saltar dentro sobre escribiendo el punto de entrada. Veamos un ejemplo:

    docker run -it --rm --entrypoint sh gcr.io/distroless/java:debug
    ...
    / # ls
    busybox  dev      etc      home     lib      lib64    proc     sys      tmp      usr      var
    / #
    

    Para terminar un último apunte, como hemos dicho las imágenes, por defecto, no contienen una shell por lo que CMD o ENTRYPOINT deben ser expresados en modo vector: ENTRYPOINT [‘myapp’].

    Para saber más sobre las distintas formas de expresar los comandos que definen una imagen como ENTRYPOINT, CMD, etc, o sobre Docker en general, este recurso es genial! :)

Presentaciones Usenix 2018

Hack para convertir Karateka a dos jugadores

  • August 18, 2018
  • tuxotron
  • Karateka 2 jugadores

    Karateka 2 jugadores

    Karateka fue un juego publicado en 1984 originalmente para Apple II. Más tarde el juego fue portado a muchos otros sistemas de la época como Commodore 64, Amstrad CPC, MSX, etc, así como a sistemas más modernos. Fue escrito por Jordan Mechner, creador también del mega popular Prince of Persia, Karateka era un juego donde el jugador tenía que luchar (Karate) contra sus enemigos para rescatar a la princesa Mariko del castillo de Akuma. Presta atención al detalle de el jugador, y digo esto porque esta es la miga de esta entrada, el juego era de un sólo jugador.

    A Charles Mangin hace un par años le llamó la antención la idea de una versión de Karateka con dos jugadores. Y tal y cómo ha publicado, dicha idea, la ha hecho realidad.

    Lo impresionante de esto, no es que éste haya reescrito el juego, sino que ha creado un parche de tan sólo 42 bytes para convertir el juego en multijugador.

    La imagen parcheada del juego la puedes descargar desde aquí (es la versión original para Apple II).

    Los controles son los siguientes:

    PLAYER 1 CONTROLS:

    • Q,A,Z puñetazo
    • W,S,X patada
    • C,V moverse/correr
    • SPACE cambia a posición de combate

    PLAYER 2 CONTROLS:

    • N patada
    • M puñetazo
    • < moverse a la izquierda

    Estas son las direcciones de memoria a cambiar:

    $6C11: D0 1C C5 21 D0 18 A9 00 85 29 A9 D7 -> AD 00 C0 C9 CD D0 02 A9 D7 8D 10 C0 (M to punch, clears strobe)
    $6C20: 20 95 6C C5 D7 B0 08 20 71 6C A9 C5 -> AD 00 C0 C9 CE D0 02 A9 C5 8D 10 C0  (N to kick, clears strobe)
    $6B9B: A6 33 E0 0C 90 03 4C 52 6C E0 07 B0 02 -> AD 00 C0 EA EA EA C9 AC D0 03 4C 52 6C  (<  to move player 2)
    
    $6EA9: 8D 10 C0 -> EA EA EA (keep from clearing keyboard strobe)
    
    $6e8e: 88 -> C3 (C to move left instead of ctrl-H/left arrow)
    $6e98: 95 -> D6 (V to move right instead of ctrl-U/right arrow)
    
    $b9a8: A5 C4 D0 00 -> A9 01 85 C4 (default to keyboard control, ignores joystick)
    

    Si quieres más detalles sobre el parche, no dudes en visitar en enlace original.

    ¡Esto es Hacking en su más puro estado!