Aunque por suerte ya casi todos los sistemas GNU/Linux actuales no se ven afectados por el exploit local que se conocía como la bomba fork(), sí todavía sigue siendo algo de mucho interés: cómo una simple línea capaz de causar una denegación completa de servicio y terminar con los recursos de una máquina.
:(){ :|:& };:
La verdad, es que si vemos la línea tal que así, puede resultar cuanto menos confuso comprender lo que hacer. Es lo bueno de la ofuscación. Así que vamos a desglosarla un poco para poder explicarla, pero sin cambiarle el significado.
bomba_fork() { bomba_fork | bomba_fork & }; bomba_fork
Empleando nombre más descriptivos y usando más de una línea, creo que la cosa ya mejora algo. Esta última función y la anterior son la misma y tiene el mismo efecto, pero una está un poco más clara que la otra y por lo tanto, es más sencilla de explicar.
- bomba_fork()Es el nombre de la función y cómo se define ésta en bash.
En el código ofuscado, el nombre de la función es ":". - bomba_forkEs la llamada a la función. Cada vez que escribimos esto, lo que hacemos es una llamada a la función previamente definida y por lo tanto ejecuta lo que hay dentro de la misma.
Recordar que en el código ofuscado, el nombre de la función es ":". - bomba_fork | bomba_forkEsta en una llamada a la función y puesto que está dentro de la función es recursiva. Acordaros lo que vimos en el punto anterior, bomba_fork es el nombre de la función, cada vez que la llamemos se ejecuta la función.
Con el pipe, "|", lo que conseguimos es que en cada llamada a la función se llame a la misma dos veces. - &Esto hace que la función quede en segundo plano y no se muera, consumiendo recursos de la máquina.
Quizás así ahora esté ya más claro de por qué este código tan simple hace tanto daño. Como vemos, consume recursos infinitamente hasta que estos se agotan, ya que las llamadas recursivas nunca terminan.
Muy bueno tu blog, has conseguido interesarme.
ResponderEliminarMe alegro :-)
Eliminar