domingo, diciembre 31, 2017

¡Feliz año 2018!

¡Qué tengáis todos una buena salida y entrada de año!. ¡Qué disfrutéis de esta noche en compañía de los vuestros!.

...
Que es mi barco mi tesoro,
que es mi Dios la libertad;
mi ley, la fuerza y el viento;
mi única patria, la mar.
...

Prueba del generador de gas de un RocketDyne F1

Como parte del proyecto Space Launch System, la NASA decidió probar uno de los elementos del motor RocketDyne F1, el generador de gas, el cual generaba el chorro de gas caliente que movía la turbina encargada de accionar las turbo bombas de combustible y oxidante del motor. En el año 2013, en el NASA's Marshall Center, se arrancó durante 30 segundos un generador de gas, cuyo flujo de gases es capaz de mover la turbina de las bombas de combustible con una potencia aproximada de 55000 caballos en el eje. Una fracción de la potencia que es capaz de desarrollar el motor F1 en su conjunto. Aunque la propuesta de RocketDyne - F1B - no se ha escogido para el Space Launch System - se van a usar versiones modificadas del RS-25 que usaba el Space Shuttle, merece la pena ver el vídeo de la prueba del generador de gas.

Reconozco que poder ver una prueba de un F1 original hubiera sido espectacular, pero según cuenta en How NASA brought the monstrous F-1 “moon rocket” engine back to life, hubiesen tenido que rehacer la estructura de test de estos motores - con un coste prohibitivo , aparte que su cercanía a la ciudad de Huntsville, se hubiese llevado por delante todos los cristales de la zona.

sábado, diciembre 30, 2017

Rocketdyne F1 engine

El Rocketdyne F-1 es un motor cohete que se empezó a desarrollar a finales de los años 50 por RocketDyne y que acabó siendo usado en la primera etapa del Saturno V, S-IC. Con unas dimensiones aproximadas de 5.79 metros de altura y 3.76 metros de diámetro era capaz de producir un 1.5 millones libras (0.680 millones Kg) de empuje al nivel del mar. La primera etapa del Saturno V usaba cinco de estos motores para unas 7.4 millones de libras (3.4 millones de Kg) de empuje al nivel del mar. El motor usa como comocumbustible RP-1 - un queroseno muy refinado - y oxígeno líquido como oxidante a un ritmo de 3945 lb/s de oxígeno líquido y 1738 lb/s de RP-1.

Para poder inyectar tal cantidad de combustible y oxidante en la cámara de combustión con la presión y caudal necesarios, el motor disponía de una turbo bomba: Dos bombas, una para inyectar el oxidante y otra para inyectar el combustible que se movían gracias a una turbina que producía cerca de 55000 caballos de potencia. Un generador de gases producía el chorro de gases calientes que se encargaba de mover la turbina.

El combustible y el oxidante se mezclan en la cámara de combustión, quemándose para producir el chorro de gases a alta velocidad que produce el empuje deseado. Antes de llegar al sistema de inyección, parte del combustible se usa para refrigerar las parades de ésta, retornando después a los inyectores que lo introducen en la cámara. Para poder arrancar el motor se usaba un cartucho de con un líquido inflamable que arde espontáneamente en contacto con el oxígeno en cualquier forma, que entra mezclado en la cámara de combustión cuando aumenta la presión del combustible. La temperatura de funcionamiento es de casi 3300 ºC.

Los gases resultantes de la combustión son expulsados a gran velocidad por la tobera, produciendo el empuje necesario. Para refrigerla, se usa tanto el combustible como parte de los gases de escape del generador de gas que mueve la turbo bomba, ya que está a una temperatura inferior, entorno a los 800 ºC.

Cinco de estos motores se usan en la primera etapa del Saturno V, para conseguir un empuje cercano a los 7.5 millones de libras. Su distribución en la primera etapa es de un motor central - fijo - y cuatro rodeándolo (Quincunx , que permitían cierto movimiento para controlar el cohete. Estos motores funcionaban durante unos 150 segundos, lo suficiente para elevar al Saturno V hasta unos 60 km de ascenso.

En el siguiente vídeo se puede ver la secuencia de encendido de los motores del Saturno V que lanzó al Apollo 11, la primera misión espacial que llevó al ser humano a la Luna.

Referencias

jueves, diciembre 28, 2017

Secuencias de escape de ssh

Cuando se está utilizando el cliente de ssh de manera interactiva y por tanto, su entrada y salida está conectada a un pseudoterminal, ssh es capaz de interpretar ciertos códigos de control para ejecutar algunas acciones. Por defecto el caracter de control que utiliza ssh es ~, que siempre debe ser introducido después de introducir una nueva línea - es decir, pulsar el enter. Tras él se puede introducir alguno de los caracteres de la siguiente tabla

~.Termina la conexión actual
~ˆZPasa a segundo plano el cliente ssh
~#Lista las conexiones
~&Pasa el ssh a segundo plano cuando se está esperando a que las conexiones que han sido tunelizadas por ssh
~?Muestra la ayuda
~BManda un BREAK al sistema remoto
~CAbre la línea de comandos que permite el control de las redirecciones de puertos.
~RRegenera la clave de sesión, si los extremos de la conexión soportan esta opetración
~VIncrementa el nivel de logs del cliente (equivalente a las opciones -v)
~vReduce el nivel de logs del cliente

El caracter que se usa para mandar la secuencia de escape puede cambiarse pasando en la línea de comandos -e o con la opción EscapeChar.

La opción más interesante que permite es ~C, ya que el cliente de ssh mostrará un prompt desde el cual se podrán gestionar los túneles que normalmente se lanzan en la línea de comandos, sin necesidad de salirnos de la conexión. Las opciónes que se permite son -L, -D o -R. De igual manera, se pueden cerrar los túneles si estas opciones se les pone el prefijo K, es decir -KL, -KD y -KR. Estas opciones se comportan igual que los parámetros que se le pasan a la línea de comandos de ssh. Por ejemplo, si se quiere redirigir el puerto local 5000 a la máquina remota 8443, se haría de la siguiente manera:

ssh> -L 5000:localhost:8443
Forwarding port.

El reenvío podría cancelarse con ayuda del comando -KL

ssh> -KL 5000
Canceled forwarding.

Si se está conectado a un sistema remoto, y se necesita mandar un BREAK, por ejemplo porque se está ejecutando un emulador de terminal conecvtado a la línea serie de la máquina remota, se puede usar ~B

lunes, diciembre 25, 2017

¡Feliz Navidad!

Pasad una Feliz Navidad en compañía de los vuestros. Disfrutad de las fiestas.

viernes, diciembre 08, 2017

Reenviar las claves en el ssh-agent

A pesar de los años que llevo usando openssh, desconocía que existía la posibilidad de reenviar las claves que esta almacenadas en el ssh-agent a un agente remoto. Si se está ejecutando en local, basta con activar la opción ForwardAgent a la hora de conectarse a la máquina remota.

ssh -oForwardAgent=yes remote_host

Cuando se activa esta opción, todas las claves que se tengan cargadas en el ssh-agent local, serán reenviadas a través del canal ssh hacia el agente remoto. Cualquier clave que se añada al agente local con ssh-add, será automáticamente enviada al agente remoto. Eso si, como bien apunta la información sobre esta opción en ssh_config, hay que tener en cuenta que cualquiera que tenga permisos para acceder al socket Unix que utiliza el agente en el sistema remoto, podrá acceder al agente local a través de la conexión d reenvío que se ha reenviado, pudiendo realizar ciertas operaciones sobre el agente.

¿Para qué es útil?. Pues para no tener la necesidad de añadir claves privadas a ordenadores remotos para poder saltar desde ellos a otras máquinas.

jueves, noviembre 30, 2017

Charla sobre Minix 3 de Tanembaum

Minix es un clónico de Unix que el profesor Andrew S. Tanenbaum comenzó a desarrollar a finales de los años 80 como apoyo a las clases de sistemas operativos. La particularidad del mismo es que utiliza una arquitectura de microkernel para su implementación. Las primeras versiones fueron pensadas para ilustras los conceptos a implementar en un sistema operativo, mientras que Minix 3 está más orientado a obtener un sistema robusto.

En la jornadas de la FOSDEM del año 2010, el profesor Tanenbaum dio una charla sobre Minix 3. Os dejo el vídeo:

martes, noviembre 21, 2017

Uber ha sufrido un robo de datos que puede afectar a 57 millones de personas

Bloomberg acaba de publicar que Uber ha sufrido un robo de datos en el octubre del año pasado que afecta a 57 millones de personas. A cambio de que la información no se hiciese pública y que borraran los datos obtenidos, pagó un rescate de 100000 dólares a los autores del mismo los cuales se pusieron en contacto con Uber pidiendo un rescate después de la intrusión. En teoría, la ley estadounidense obligaba a Uber a comunicar este robo de datos a las autoridades, cosa que no hizo.

Por supuesto, nada garantiza que los autores del robo de datos hayan destruido la información y no la estén usando para atacar otros servicios. Es má que probable que esos datos robados hayan servido de base para atacar otros servicios on line. El pago del rescate por parte de Uber sienta un precedente nefasto: Otros ciberdelicuentes intentarán lo mismo.

La pregunta del millón de dólares es cuantas compañían han seguido este camino de pagar un rescate y se ha ocultado a sus usuarios.

lunes, noviembre 20, 2017

No hay ningún impuesto nuevo a las ventas en Wallapop o Ebay

A mediados de la semana pasada se publicaron varias noticias sobre la voracidad de Hacienda con el cobro de un nuevo impuesto a las transacciónes comerciales de segunda mano realizadas a través de plataformas como Ebay, Vibbo o Wallapop. La realidad, es que lo único que hizo Hacienda fue recordar que ese impuesto ya existe desde hace mucho y es el impuesto de transmisiones patrimoniales y actos jurídicos documentados, que se encuentra cedido al 100% a las comunidades autónomas en España. Para liquidarlo se hace a través del Modelo 600. Además, en caso de que haya existido ganancias, es necesario declarar la misma en el IRPF.

Ahora, ¿existe alguna manera relativamente sencilla de pagar este impuesto?. Es el mismo que se paga cuando se vende un coche de segunda mano. La ley dice que es necesario pagarlo cuando vendemos por 5 euros ese router de segunda mano que tenemos por ahí, aunque en este caso sólo serían 20 céntimos si usamos el tipo normal del 4%. Sin embargo, me temo que poca gente se va a meter en el lío de realizar el modelo 600. Muchos por desconocimientos, otros muchos porque no quieren pagar a Hacienda ni 20 céntimos.

La única manera sencilla que veo de liquidar este impuesto es que las mismas plataformas de segunda mano se conviertan en pasarelas de pago y liquiden ante Hacienda. Exáctamente igual que pasa con el IVA ahora mismo. Supongo que no tardarían en mudarse a otros países y ponerse de perfil. Aunque también reconozco, que cada día más los Estados están legislando más sobre estos temas.

lunes, noviembre 06, 2017

Opciones ssh con git

No sé si habéis tenido la mala suerte de tener que depurar algún problema de git que usa ssh para interactuar con el repositorio remoto. Para poder depurar este tipo de problemas o bien pasar opciones especiales al comando ssh, dentro de las variable de entorno que se pueden configurar en git está GIT_SSH_COMMAND, dependiendo de la versión. Por ejemplo, si queremos ver cual es la conexión ssh, se puede llamar a git así:

env GIT_SSH_COMMAND="ssh -vvv" git fetch

El ejecutar este comando se podrá ver una salida similar a la siguiente - en este ejemplo conectándose al git de SourceForge

...
OpenSSH_7.4p1, LibreSSL 2.5.0
debug1: Reading configuration data /Users/terron/.ssh/config
debug1: /Users/drizzt/.ssh/config line 91: Applying options for git.code.sf.net
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolving "git.code.sf.net" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to git.code.sf.net [216.34.181.155] port 22.
debug1: Connection established.
...

Otro ejemplo de uso, si se quiere especificar la clave se puede usar la siguiente orden:

env GIT_SSH_COMMAND="ssh -i ~/.ssh/clave.pem" git fetch

martes, octubre 31, 2017

Los nacionalismos arrasaron Europa

Esta mañana he estado leyendo un poco sobre la rueda de prensa que el cesado presidente de la Generalidat de Cataluña ha dado esta mañana desde Bruselas. Aparte de hacerse la víctima y seguir con el teatro me he parado en este tuit publicado por Europa Press cuya captura reproduzco:

Es uno de los mayores disparates que se puede decir dentro de la Unión Europea ya que ésta se fundó para evitar que los nacionalismos volviesen a arrasar el continente como ocurrió con las dos guerras mundiales. Ir a Europa a llorar por los nacionalismos es olvidar este pilar básico que sirvió para fundar la CEE y posteriormente la Unión Europea.

Si hay algo que ha destruido Europa, como hemos visto en los dos Guerras Mundiales o más recientemente en los Balcanes son los nacionalismos secesionistas excluyentes como el catalán. Sería cuestión de no olvidarlo jamás.

Las teóricas VPNs sin logs

Supongo que muchos hemos visto proveedores de redes privadas virtuales, que entre sus servicios publicitan que no guardan registros de las conexiones de sus usuarios. Claro, hasta que que aparece el Estado con una orden de registro. Entonces, el proveedor de servicio entrega lo que supuestamente no tiene a los representantes del Estado.

Un proveedor de servicio sin un gran músculo financiero y legal, tiene dificultades para hacer frente de casos: Llegado el momento, si no quiere entregar los registros o no los tiene, tendrá que enfrentarse a la justicia si sus servicios se han utilizado para realizar un acto delictivo. Aparte, llegado el momento, ¿quién garantiza que el proveedor está cumpliendo con lo que promete?

No descartemos, en el futuro próximo, cambios legislativos para este tipo de cosas: Exactamente igual que en España en el caso del carnet de conducir por puntos, nos llevamos la sanción sino identificamos al conductor que iba al volante al cometer una infracción y el vehículo está a nuestro nombre.

Rama de git en el prompt

Cuando trabajo en un repositorio que está bajo el control de git, me gusta tener en el prompt del terminal cual es la rama de git que estoy usando:

terron@menzoberrazan:deployaws (master)$

¿Cómo se puede conseguir esto?. Originalmente usaba mi propio script en el $HOME/.profile:

parse_git_branch() {
       shopt -s checkwinsize
       if [ $(which git) ]; then
        branch=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' -e 's/^ +//g' -e 's/\n//g')

        /bin/echo -n "$branch" 
       else
               echo -n ""
       fi

}
export -f parse_git_branch
export PS1="\h:\w \u\[\033[33m\]\$(type -t parse_git_branch > /dev/null && parse_git_branch)\[\033[00m\]\$"

Básicamente este script lo que hace es comprobar si el git está en el path. Si ese es el caso, se comprueba si el directorio actual es un repositorio git, y llegado el caso, lo imprimimos. Esta función se llama desde el prompt, que se define en la variable PS1. Se usan códigos de control para que el path salga en amarillo.

Como curiosidad, uso export -f a la función para que esté disponible en otros shell.

Sin embargo, los desarrolladores de git han preparado un script que podemos usar directamente. El script se llama git-prompt y está en el código fuente del git. En OS X, por ejemplo está en /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh. Se puede obtener desde el repositorio de git (git-prompt.sh)

¿Como se configura?. Pues se copia el git-prompt.sh a nuestro $HOME como .git-prompt.sh, hacemos un source del fichero desde el .profile - si usamos bash - y modificamos el prompt

source ~/.git-prompt.sh
export -f __git_ps1
export PS1='\u@\h:\W\[\033[33m\]$(__git_ps1 " (%s)")\[\033[00m\]\$'

sábado, octubre 28, 2017

China quiere medir el crédito social de sus "ciudadanos"

La dictadura china está dispuesta a aplicar las técnicas de big data para intentar saber cómo de buen ciudadano son las personas que viven en su régimen. Al igual que existe los sistemas de credit score, el gobierno chino quiere implementar un sistema de crédito social que permita valorar la confianza que se pueda tener un ciudadano.

La idea que hay detrás de este proyecto es recolectar todos los datos posibles para elaborar un indicador que mida el tipo de ciudadanos que eres. Las entradas a este sistema serían las compras que hacen, las horas a las que accede a internet, si juegas online, las redes sociales a las que accedes, los tipos de comentarios que haces, los libros que lees, tu intereacción con tus amigos o incluso si copiaste en el colegio.

Actualmente se están haciendo pruebas con el sistema donde ciudadanos - que me cuesta usar esta palabra con una dictadura -, encargando a varias empresas para hacer el sistema de obligatorio uso en el año 2020.

Y aunque parezca mentira, millones de ciudadanos chinos se han enrolado en las pruebas. ¿Por qué?. Fácil, porque le dan privilegios especiales si llegan a ciertos niveles en los indicadores. Y eso sabiendo que el gobierno chino ya almacena en su Dang'an un historial que incluye, entre otras cosas, el historial político. Básicamente, ejercer el control para que la obediencia sea como un juego.

Y por supuesto, tiene todo un sistema de penas para quien tenga un "rating" bajo:

For instance, people with low ratings will have slower internet speeds; restricted access to restaurants, nightclubs or golf courses; and the removal of the right to travel freely abroad

Enlaces

lunes, octubre 23, 2017

Powermock: Notas rápidas para interceptar (mock) llamadas estáticas

Powermock es una librería que añade nuevas capacidades de test a algunas librerías de test, usando su propio cargador de clases y reescribiendo el bytecode de las clases que están siendo probadas. De esta manera se pueden probar métodos estáticos, probar clases saltándose bloques de inicialización estáticos o acceder al estado interno de un objeto. Por defecto extienden las funcionalidades de mockito y EasyTest

Si estamos usando maven, se puede añadir una referencia a powermock automáticamente para que se baje de los repositorios que se tenga configurado. Si se está usando Mockito 1.x y JUnit 4.4 se puede usar la siguiente configuración en las dependencias del pom. Si se consulta en enlace, veréis que es diferente dependiendo de si es JUnit 4.4 o una versión anterior. Notar que el uso de JUnit 3.x está desaconsejado por obsoleto. Una vez añadido a nuestro pom.xml y maven está configurado correctamente, se bajará las dependencias necesarias.

<properties>
    <powermock.version>1.7.1</powermock.version>
</properties>
<dependencies>
   <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>${powermock.version}</version>
      <scope>test</scope>
   </dependency>
   <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-mockito</artifactId>
      <version>${powermock.version}</version>
      <scope>test</scope>
   </dependency>
</dependencies>

Puesto que uso JUnit 4 junto con PowerMock, es necesario configurar la ejecución de los test para que haga uso de la infraestructura de Powermock cuando se ejecuten. Eso se consigue anotando la clase que implementa los test con @RunWith(PowerMockRunner.class). Además, para que Powermock sepa qué clases debe de preparar, es necesario especificar con otra anotación qué clases deben de transformarse. Esta anotación es @PrepareForTest. Se ve mejor con el siguiente ejemplo. Supongamos que queremos verificar la funcionalidad de la siguiente clase que sólo tiene dos métodos estáticos:

package org.menzoberrazan.maven;
public class StaticClass {
    static public String metodo1(){
        return "Método 1 llamado";
    }
    static public String metodo2(){
        return "Método 2 llamado";
    }
}

La clase que se va usar para probar está al final del párrafo. En ella hay tres tests:

  • Un primer test normal, que nos muestra lo que devolvería los métodos estáticos son mocks
  • Un segundo test, donde se mockea toda la clase, por lo tanto hay que dar en el test una implementación de cada método que se llame, cosa que se hace con when
  • Un último test, donde vemos un mock parcial de uno de los métodos de la clase estática.
package org.menzoberrazan.maven;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;

@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticClass.class})
public class AppTest
{
    @Test
    public void test1(){
        assertEquals("Método 1 llamado",StaticClass.metodo1());
        assertEquals("Método 2 llamado", StaticClass.metodo2());
    }
    @Test
    public void test2(){
        PowerMockito.mockStatic(StaticClass.class);
        PowerMockito.when(StaticClass.metodo1()).thenReturn("Método 1 mockeado");
        PowerMockito.when(StaticClass.metodo2()).thenReturn("Método 2 mockeado");
        assertEquals("Método 1 mockeado", StaticClass.metodo1());
        assertEquals("Método 2 mockeado", StaticClass.metodo2());
    }
    @Test
    public void test3(){
        PowerMockito.stub(PowerMockito.method(StaticClass.class, "metodo1")).toReturn("Método 1 parcial");
        assertEquals("Método 1 parcial", StaticClass.metodo1());
        assertEquals("Método 2 llamado", StaticClass.metodo2());
    }
}

Los puntos claves a tener en cuenta en este ejemplo son:

  • Las anotaciones en la clase que implementa los test.
  • Las anotaciones que se usan para indicar que un determinado método es un test (@Test)
  • El uso de las diferentes funciones assert* que nos provee junit para poder comparar los valores.
  • El mock total o parcial de la clase.
  • El uso de las versiones correctas de los paquetes en el pom.xml

domingo, octubre 15, 2017

21 años del proyecto KDE

Ayer, 14 de Octubre, el Proyecto KDE cumplió 21 años. Fundado por Matthias Ettrich, comenzó siendo un entorno de escritorio escrito en C++ usando como base las librerías Qt. Fue el primer escritorio medio serio que usé en Linux, prácticamente desde sus primeras versiones hasta la versión KDE 3.x que se publicó en el año 2002. Posteriormente me pasé a OS X, donde descubrí el entorno de escritorio que siempre debió tener Linux.

Cuando he visto por mi TL hoy la referencia a la creación de KDE, me he encontrado un enlace al libro 20 años de KDE, donde se cuentan historias de varios de los desarrolladores que forman parte de la comunidad de KDE, animándome a escribir esta pequeña entrada sobre este proyecto de software libre. A a partir de algunos de sus componentes se han desarrollado proyectos tan importantes como webkit, que son corazón del navegador Safari en OS X e iOS y del Chrome de Google.

Si tuviese que volver a usar un escritorio en Linux, probablemente, volvería a mirar KDE, en su actual versión Plasma Desktop

sábado, octubre 14, 2017

¿Estonia ayuda oficialmente a Cataluña para una administración electrónica?

Me ha llegado a través de Twitter la noticia de que la Generalidad de Cataluña está duplicando las estructuras de estado usando Internet y con base el modelo usado en Estonia. Esto no tendría la mayor importancia si el gobierno catalán siguiera cumpliendo la ley y buscara una mayor eficiencia y funcionalidad para sus ciudadanos. El problema es que no es así: El desleal gobierno catalán - que no olvidemos que emana de la Constitución Española -, lleva años intentando romper España de manera unilateral.

Lo interesante de la noticia está en el subtítulo:

El Govern levanta desde hace dos años una Administración digital con ayuda de Estonia

Si el gobierno estonio está ayudando oficialmente a la administración catalana para tener estructuras de estado con el objeto de llegar a la independencia, estaría bien recordar que España ha sido uno de los participantes en la misión de la OTAN Polícia Aérea del Báltico, donde se han mandado varias veces a destacamentos españoles con Mirage F1, F/A-18 y Eurofighter para establecer el servicio de QRA para dar cobertura aérea a las tres repúblicas bálticas. ,concretamente, en la base aérea de Ämari, en Estonia.

Sería bastante interesante que la diplomacia española investigara este asunto.

martes, octubre 10, 2017

Abecedari de la independència (Abecedario de la independencia)

No deja de ser curioso hasta que punto la sociedad catalana ha sido corrompida por el nacionalismo más xenófobo. La publicación Abecedari de la independència, en el año 2014, es un ejemplo de ello: para enseñar a los niños las letras, se usan términos del imaginario independentista. Supongo, que como muchas otras cosas de los separatistas, no se le dio la suficiente importancia a su debido tiempo, aunque algunos ciudadanos denunciaban con resistencia numantina lo que estaba pasando con la educación en Cataluña.

En la mejor línea de la dictadura franquista, la editorial describe el libro así - negritas mías -:

Un llibre perquè els nens i les nenes aprenguin les lletres de l'abecedari. Amb illustracions de Roser Calafell. Cada lletra té un motiu identificable amb el procés sobiranista (Assemblea, Burro català, Consulta, etc.). Un llibre que farà les delícies dels nens i les nenes (i adults) i els aproparà al moment històric que estem vivint.

Lo más divertido es que pertenece a la colección Tradicions: supongo, que en el fondo, hay detrás de todo esto un fuerte rechazo a la la sociedad abierta, donde el pluralismo y la diversidad de opiniones existen. Una sociedad así no tiene cabida ninguna en la Cataluña separatista. De pretender ser una de las regiones más modernas y abiertas de Europa - aunque en realidad, eso es el mensaje averiado que hemos comprado muchos -, a una de las más reaccionarias de la mano del separatismo identitario, probablemente siendo Barcelona, la única excepción a esto.

martes, octubre 03, 2017

Los primeros pasos del fascismo catalán

Hay escenas, que retratan perfectamente al nacionalismo catalán. Lo que son, lo que siempre han sido. Lo único que ha ocurrido es que se lo han tenido callados mientras preparaban su golpe de estado. Esta tarde he visto el siguiente vídeo en la cuenta de SER Cataluña . Si parece un pato, anda como un pato y hace cuac, lo mismo es que un pato:

Fascistas catalanes from drizzt.blog on Vimeo.

Pensaba apartarme algo del tema catalán en el blog. Pero, dentro de mis limitadas posibilidades y sabiendo que allí hay personas que no comulgan con el fascismo independentista y que las van a machacar, creo que es necesario, que aquellos que creemos en un Estado de Derecho, reflejemos lo que está ocurriendo: No se le puede dejar la batalla de la propaganda a los totalitarios.

domingo, octubre 01, 2017

Como "sufren" en Cataluña los jugadores del FC Barcelona

La cosa del fútbol no sería más que una anécdota sino fuera porque es un engranaje más en ese nacionalista xenófobo catalán. Hoy se ha disputado en el Camp Nou el partido que enfrentaba al FC Barcelona frente a la Unión Deportiva las Palmas. Este partido se ha disputado a puertas cerradas porque la Junta Directiva del Barcelona lo ha decidido así, ya que los Mozos de Escuadra no habían emitido ningún informe en contra. Realmente, lo que querían era haber suspendido el partido, pero la LFP se ha negado, con buen criterio desde mi punto de vista. El presidente de la entidad blaugrana realizó las siguientes declaraciones:

"La Liga no nos ha dado permiso para suspender el partido. Hubiéramos perdido seis puntos (los tres del encuentro frente a Las Palmas, más otros tres adicionales). Ante tal negativa, decidimos jugar el encuentro de una manera excepcional. Para que (las personas) vean cómo estamos sufriendo"

Vamos a realizar algunas tablas con datos del FC Barcelona, para que seamos capaces de calibrar dicho sufrimiento

AñoIngresos en millones de €Fuente
Temporada 2016 - 2017708Fuente 2016 - 2017
Temporada 2015 - 2016679Fuente 2015 - 2016
Temporada 2014 - 2015608Fuente 2014 - 2015
Temporada 2013 - 2014530Fuente 2013 - 2014
Temporada 2012 - 2013491Fuente 2012 - 2013

Es decir, en los últimos cinco años los ingresos de estos apenados sufridores han aumentado en casi 217 millones de €. No está mal.

Pero Vamos a repasar las fichas de algunos de sus jugadores. Por ejemplo, aquí podemos ver alguna de las fichas de sus jugadores, correspondiente a datos del año 2016

  • Gerard Piqué, entre 12 y 14 millones de euros.
  • Leo Messi, unos 40 millones de euros.
  • Andres Iniesta, 15 fijos, que pueden alcanzar los 18 con incentivos

Y todo esto por no hablar de los más de 222 millones de euros recibidos este año por la venta de Neymar o los 150 millones de euros pagados por Dembelé.

Esto es necesario contarlo para poner en perpestiva el supuesto sufrimiento de estos millonarios.

No, no es una sorpresa lo de Cataluña

A estas alturas, no se puede sentir tristeza por lo que está ocurriendo en Cataluña, resignación si acaso ya que el guión de hoy lleva escrito muchos años. Probablemente, los ciudadanos españoles no hemos exigido la suficiente altura de miras a los políticos para que señalaran lo que es el cáncer nacionalista y por el no meterse en política hemos hecho la vista gorda ante situaciones que en otros países hubieran causado una gran polvareda.

Cuando uno repasa lo que ha ocurrido, exigido y dicho los nacionalistas los últimos quince años, entiende perfectamente lo que ha ocurrido este último año, empezando por el esperpento en el Parlamento Catalán en Septiembre y acabando con la jornada de hoy, donde se introducen papeles en unos contenedores como si pudieran tener algún valor.

Si se pone una identidad tribal por delante de ser un ciudadano, el camino que se recorre es el que hemos visto estos últimos quince años y su colofón es saltarse la ley, porque el sentimiento y la pertenencia a la tierra está por encima de ser ciudadano de un país donde hay que respetar leyes. Una de esas identidades, conviene recordar que a los españoles nos ha costado casi mil muertos.

También habría que empezar a plantearse el papel que han tenido los medios de comunución, los que han ejercido de la Radio Televisión Libre de las Mil Colinas ruandesa alentando contra toda persona que no estuviera a favor del régimen que se capitaneaba desde la Generalidad de Cataluña, desde medios públicos a medios generosamente regados con subvenciones. Y por supuesto, los tontos útiles que llevan haciéndole el caldo gordo a los nacionalistas desde hace décadas.

Pero, ¿Sabéis que ocurriría si las Fuerzas de Seguridad del Estado no estuviesen hoy allí?. Lo que ha ocurrido en todos los países donde el cáncer del nacionalismo no se corta de raíz. Por eso, me alegro que hoy estén allí la Policía Nacional y la Guardia Civil para hacer cumplir la ley, porque son ellos los que garantizan los derechos civiles de una parte importante de la población catalana que le ha sido usurpados por otros catalanes que piensan que si no eres de su cuerda, no mereces ser ciudadano.

sábado, septiembre 30, 2017

Mañana no se celebra un referéndum en Cataluña

Aunque se depositen papeles en unos contenedores y se pueda contar, lo que se va a intentar escenificar mañana en Cataluña es un golpe de estado orquestrado por unos separatistas xenófobos. Por los siguientes motivos:

  • Una serie de ciudadanos españoles que se creen que por el hecho de haber nacido en una parte de España llamada Cataluña los hace especiales.
  • Dejar sin derechos a la inmensa mayoría de los españoles, porque ellos creen que sólo los que votan a favor de ese referéndum tienen derechos políticos. Como muestra, las sesiones del Parlamento de Cataluña, del 6 y 7 de Septiembre, donde incluso se saltaron el propio Estatuto de Autonomía y toda la reglamentación de la cámara.
  • Desobedecer todas las leyes que no le convegan y los tribunales encargados de aplicarlas - ahora, bien que se amparan en dichas leyes y tribunales cuando les ha convenido -
  • Vender como democracia la simple votación, cuando si hay algo que tiene una democracia es el respeto a la ley y la protección de aquellos que piesan diferente. La prueba de que España es una democracia es que hasta permitos partidos que se quieren cargar esa misma democracia.
  • Usar la lengua catalana para levantar barreras entre personas: Para establecer quien es de aquí y quien es de fuera
  • Han robado los datos personales de los ciudadanos que viven en Cataluña, saltándose múltiples leyes de protección de datos que están, entre otras cosas, para limitar el abuso por las administraciones públicas. Han subido esos datos a diversos servidores fuera de España y que con un poco de mala suerte, puede dar lugar a una fuga de datos cuyas consecuencias podrían ser catastróficas para esos ciudadanos.
  • Llevan mintiendo sobre todo el proceso meses.
  • Las garantías de todo este golpe de estado son las que tienen cualquier suceso de este tipo: La arbitrariedad que deseen los que están al mando del mismo.

Esta lista se puede resumir perfectamente en una frase: saltarse la ley de infinidad de maneras con el objetivo de privar de derechos a una gran parte de la ciudadanía española.

Y faltaría por hablar, de lo que ha traído en el último siglo el nacionalismo en Europa: Desde las Guerras Mundiales al desastre de Yugolasvia

Por lo tanto mañana hablar de resultados, participación o datos es seguirles el juego a los golpistas. Lo único que se debe hablar es del cumplimiento de la ley. Y de la comparecencia ante los tribunales de aquellos que se la han saltado a la torera.

martes, septiembre 19, 2017

Tutorial de uso de funciones en Bash

Una de las funcionalidades que tiene la shell Bash es la posibilidad de usar funciones las cuales no son más que una agrupación de comandos con un nombre, que se ejecutará cuando se utilize dicho nombre para involcarlas. Esto permite construir librerías de funciones que realizen operaciones que interesan.

Definición de funciones

En Bash se pueden declarar funciones de varias maneras:

#!/bin/bash

function func1(){
    echo "Function 1"
}
func2(){
    echo "Function 2"
}
# Debe haber un espacio entre el nombre
# y la llave
function func3 {
    echo "Function 3"
}

La manera más portable - y la que recoge POSIX - es la segunda, definir el cuerpo de la función usando los paréntesis.

A la hora de definir los bloques de comandos que forman el cuerpo de la función se puede hacer usando las llaves { ... body ... } o los paréntesis (... body ...). La diferencia es que en el segundo caso la función se ejecutará en una subshell. Si se usa la versión 4 de bash se puede ver con en este ejemplo el comportamiento de cada manera definir la función: Si se hacen dos ejecuciones del mismo: La llamada a func1 siempre devolverá el mismo PID que corresponde con el del shell desde donde se está llamando, mientras que en el segundo caso variará, ya que el comando se ejecuta en otra subshell.

#!/bin/bash
function func1() {
    /bin/echo "FUNC1 $BASHPID"
}
function func2() (
    /bin/echo "FUNC2 $BASHPID"
)
func1
func2

La salida de ejecutar un script con ese contenido usando source es la siguiente:.

$ source script.sh
func 1 31238
func 2 31329
$ source script.sh 
func 1 31238
func 2 31338

Se ve como func1 tiene el mismo PID (el del shell desde donde se ejecuta el source), mientras que cambia el de la subshell. Recordar que pare que bash defina la variable $BASHPID debe ser la versión cuatro.

Alcance de variables

Una cosa particular de las funciones es que las variables que se definan en ellas, tienen alcance global por defecto del script que se está ejecutando, a menos que explicitamente se les añada el modificador local. Por ejemplo, el siguiente script la llamada a func1 asignará un valor a TEMPFUNCVAR1 que se verá tras la ejecución, cosa que no pasará con TEMPFUNCVAR2 de la segunfa función.

#!/bin/bash
func1() {
    echo "Func 1"
    FUNCVAR1="You can see me"
}
func2() {
    echo "Func 2"
    local FUNCVAR2="You can't see me"
}

func1
echo "FUNCVAR1=$FUNCVAR1"
func2
echo "FUNCVAR2=$FUNCVAR2"

Si se ejecuta el script anterior, se ve que la variable que ha sido declarada con local no muestra el contenido tras ejecutar la función:

$ script.sh
Func 1
FUNCVAR1=You can see me
Func 2
FUNCVAR2=

Parámetros de la función

Cuando se llama a una función con parámetros, estos pasan a ocupar los parámetros posicionales de la shell:

  • $* se expande a todos los parámetros posiciones ($1,$2,...), con la particularidad que sigue unas reglas de expansión si está entre dobles comillas.
  • $@ Exactamente igual que el anterior, pero los parámetros se expanden cada uno a una palabra distinta.
  • $# Es el número de parámetros de la función.
  • $1,$2,...$9 son los 9 primeros parámetros de la función. Si se necesitan más, estos se numera con ayuda de las llaves, es decir ${10}, ${11}, etc
  • .

El siguiente ejemplo de código coge todo los parámetros que se le pasa a la función, imprime el número de parámetros y luego cada parámetro en una línea distinta, con usando el comando interno shift para desplazar la lista de parámetros a la izquierda al irlos consumiendo.

#!/bin/bash
func1() {
    echo "Number of parameters: $#"
    while [ ! -z "$1" ]; do
        echo "$1"
        shift
    done
}
func1 You can see five parameters
func1 two parameters
func1

Al ejecutar el script anterior la salida es la siguiente:

$ ./script.sh
Number of parameters: 5
You
can
see
five
parameters
Number of parameters: 2
two
parameters
Number of parameters: 0

Si aprovechamos la expansión del parámetro $@ la anterior función tb se puede implementar de la siguiente manera. La ejecución de este script da el mismo resultado que el anterior:

#!/bin/bash
func1() {
    echo "Number of parameters: $#"
    for param in $@;do
        echo "$param"
    done
}
func1 You can see five parameters
func1 two parameters
func1

Valores de retorno de la función

El valor de retorno de la función se devuelve por defecto en la variable $?. Las reglas que definen el valor que tomará dicha variable a la salida de la función son las siguientes:

  • Si no existe ninguna llamada a return, el valor de retorno de la función será el valor del último comando que se ha ejecutado.
  • Si se usa return sin argumento numérico, ocurre igual que en caso anterior, el valor de retorno es el de último comando ejecutado.
  • Si se usa un valor numérico, ese es el valor de retorno de la función.

Hacer notar los siguientes dos puntos:

  • Por convención en Unix, los comandos suelen devolver un valor de cero en caso de que la ejecución del mismo haya tenido éxito.
  • El mecanismo de retorno de valores de ejecución de Bash nada más que permite valores numéricos. Para devolver cadenas, hay que usar otras construcciones.

Veamos un ejemplo de todo lo anterior

#!/bin/bash
RANDOM_NAME="/tmp/$(cat /dev/urandom | LC_ALL="C" tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)"
func1() {
    cp -f  "$RANDOM_NAME" "$RANDOM_NAME_1" 2> /dev/null
}
func2() {
    cp -f  "$RANDOM_NAME" "$RANDOM_NAME_1" 2> /dev/null
    return
}
func3() {
    return 10
}
func1
echo $?
func2
echo $?
func3
echo $?

El script anterior va a generar un nombre aleatorio y se definen tres funciones:

  • func1 va a realizar una operación que va a fallar, copiar un fichero que no existe. Como es el último comando que se ejecuta en la función, su valor de retorno será lo que devuelva la función a través de $?.
  • func2 Utiliza un return sin parámetros, en este caso el valor de retorno será el del comando anterior, que vuelve a ser el cp que falla y es lo que retorna.
  • func3 Por último, la función en este caso, retorna directamente el valor 10.

Resumen

Este es un tutorial muy básico sobre el uso de funciones en bash que permite empezar a usar las mismas en nuestros scripts. He dejado algunos puntos sin tocar, para los que tengáis curiosidad, se puede consultar el manual de bash y el enlace sobre shell scripting de la sección referencia. Para una próxima entrada me gustaría tratar de:

  • Como definir las funciones con una sola línea.
  • Como devolver cadenas desde una función.
  • Cuál es la mejor manera de agrupar funciones para usarlas como una librería.
  • Redirección de la salida de una función

Referencias

sábado, septiembre 16, 2017

Tutorial de arrays - vectores - en Bash

Bash es un shell - intérprete de órdenes de consola , interfaz clásica en modo texto - que fue desarrollado bajo el paraguas del proyecto GNU. Es compatible con Bourne Shell, la interfaz de comandos que traía la versión 7 de Unix. Además, tiene muchas mejoras y extensiones. Una de ellas es la posibilidad de usar arrays.

Un array puede declararse de cuatro maneras diferentes en Bash. La manera más sencilla es la siguiente, se muestra las órdenes y la salida de los echo:

$ my_array=("cadena 1" "cadena 2" "cadena 3")
$ echo ${my_array[@]}
cadena 1 cadena 2 cadena 3
$ echo ${!my_array[@]}
0 1 2
$ echo ${my_array[1]}
cadena 2
$ echo ${my_array[10]}

$ echo ${my_array} 
cadena 1
$ echo ${#my_array[@]}
3
$ declare -p my_array
declare -a my_array='([0]="cadena 1" [1]="cadena 2" [2]="cadena 3")'

Del ejemplo anterior se pueden ver los siguientes puntos sobre la sintaxis que usa Bash para gestionar los arrays:

  • La construcción ${nombreArray[@]} devuelve el array completo.
  • Para obtener la longitud del array se usa ${#nombreArray[@]}.
  • Se accede a cualquier elemento del array con ${nombreArray[indice]}, donde indice es un entero mayor o igual a cero. Si el elemento que se pide no existe, no se devuelve nada.
  • La construcción ${!nombreArray[@]} devuelve un array con los índices de cada elemento. Bash permite que el índice de cada elemento no sea correlativo ni tenga que empezar en 0.
  • Por último con ayuda de declare -p nombreArray pueden verse los atributos del array.

Otra manera de declarar una variable con un subíndice determinado, se crea autmáticamente un array. En el siguiente ejemplo creará un array llamado my_array donde el elemento número 11 tendrá el valor Número 11

$ my_array[10]="Número 11"
$ my_array[11]="Número 12"
$ echo ${my_array[@]}
Número 10 Número 11
$ echo ${!my_array[@]}
10 11
$ declare -p my_array
declare -a my_array='([10]="Número 10" [11]="Número 11")'

Otra manera de declarar un array es hacerlo explícitamente con declare y añadir elementos:

$ declare -a my_array
$ my_array[0]="Cero"

Un array puede ser borrado usando el comando unset nombreArray o unset nombreArray[@].

$ my_array=(1 2 3 4 5)
$ echo ${my_array[@]}
1 2 3 4 5
$ unset my_array
$ echo echo ${my_array[@]}} # Sólo salto de línea

$ my_array=(1 2 3 4 5)
$ echo ${my_array[@]}
1 2 3 4 5
$ unset my_array[@]
$ echo  ${my_array[@]} # Sólo salto de línea

Por último, hacere referencia a las dobles comillas. Como se ha visto a lo largo de los ejemplos anteriores, se usa ${nombreArray[@]} para referirse a todos los elementos del array. También se puede usar el asterisco (*) en vez del símbolo at (@): ${nombreArray[*]}. El comportamiento es el mismo execepto cuando se emplea dentro de comillas dobles. Si se usa el asterisco (*) , la expansión se realizará a una sóla palabra separada por el primer caracter del IFS - internal field separator. Mientras que si se usa el símbolo at (@), expande a varias palabras:

$ my_array=(1 2 3 4 5)
$ echo ${my_array[@]}
1 2 3 4 5
$ echo ${my_array[*]}
1 2 3 4 5
$ echo "${my_array[@]}"
1 2 3 4 5
$ echo "${my_array[*]}"
1 2 3 4 5
$ IFS=";"
$ echo "${my_array[@]}"
1 2 3 4 5
$ echo "${my_array[*]}" 
1;2;3;4;5

Un pequeño ejemplo de lo anterior es este shell script de ejemplo con todo lo anterior

#!/bin/bash
# Declarar el array
cities=("Menzoberrazan" "Waterdeep" "Neverwinter" "Baldur's Gate")

# Imprime cada elemento
for city in "${cities[@]}"; do
    echo "$city"
done
# Imprime los índices
for index in "${!cities[@]}"; do
    echo "$index ${cities[$index]}"
done
# Imprime el tamaño
echo "Longitud array: ${#cities[@]}"

Referencias

viernes, septiembre 15, 2017

BlueBorne: Vulnerabilidades en la pila bluetooth de varios sistemas

Bluetooth es un pila de protocolos de comunicaciones de corto alcance que utiliza ondas de radio como medio físico para transmitir información. Esta pila de protocolos está implementada en millones de dispositivos de todo tipo: teléfonos, ordenadores, sensores, tables, ... Esta semana se ha hecho público un conjunto de ataques contra la implementación bluetooth de diversos sistemas operativos que se agrupan bajo el nombre de BlueBorne. Los autores de esta investigación han sido Ben Seri y Gregory Vishnepolsky que trabaja para Armis

Lo más interesante de los ataques descritos es la posibilidad de realizarlos sin necesidad de tener pareados dos dispositivos bluetooth o de que éstos estén en modo de descubrimiento. De estos ataques, tres pueden considerarse críticos puesto que permiten la ejecución de código controlado por el atacante:

  • CVE-2017-1000251 Es un desbordamiento de pila (buffer overflow) clásico en la pila bluetooh the Linux, BlueZ, que permite ejecutar código de manera remota.
  • CVE-2017-0781 Este bug permite ejecutar código de manera remota en cualquier hardware que utilice Android como sistema operativo. Aunque Android deriva de Linux, usa una pila bluetooth propia desarrollada por Google.
  • CVE-2017-0782 Igual que el anterior, otro bug que permite la ejecución remota de código.

Aunque existen varias pruebas de concepto, dada la naturaleza de las vulnerabilidades más graves, sería posible programar un gusano que las aprovechara y que pudiese ir extendiendose de un dispositivo con conectividad bluetooth a otro. Además, el código de la pila se suele ejecutar con privilegios elevados, así que un ataque podría usarse para robar información. Y haciendo algo tan sencillo como poner un dispositivo malicioso en el rango de alcance de los dispositivos bluetooth que se quieran atacar.

Aunque los fallos han sido notificados a los diferentes fabricantes y mantenedores, existiendo parches para los sistemas, el problema vendrá de aquellos dispositivos para los cuales no se hacen actualizaciones o fabricantes que tardan mucho en sacarlas.

Referencias

jueves, septiembre 14, 2017

Cosas curiosas de Tesla

Hace unos días leía una curiosa noticia en Ars Tecnica: Tesla había aumentado el rango de ciertos vehículos de su modelo 60D de manera temporal y sin coste para que pudiesen salir de la zona del huracan Irma en el Estado de Florida. ¿Por qué?. Porque en realidad esos vehículos venían equipados con baterías de 75 kwh pero por software están capadas a 60 kwh. Previo pago de la correspondiente licencia (2000 dólares), Tesla te desbloquea esa capacidad. Es probable, que , una vez pasado el hurancán, una nueva actualización de software deje de nuevo las bataría cargar hasta los 60 Kwh.

Este es un modelo de negocio del que oí hablar por primera vez hace años en el mundo de los mainframes de IBM: El hardware que te ponía IBM era el mismo pero en función de lo que se pagara de licencia, se podía aprovechar a completo o solo una parte de él. Probablemente, veamos este modelo de negocio, tan común por otra parte en el mundo de la TI extenderse.

Pero quizás, lo que más me llama la atención es el grado de monitorización que puede tener Tesla sobre los coches que ha vendido. Por una parte, es bueno que llamen a casa para poder mandar información de diagnóstico sobre el estado general del coche y permita avisar a sus usuarios. Por otra parte, imaginad la cantidad de información que puede recoger Tesla de la conducción de sus coches. Una auténtica mina. Y desde mi punto de vista, al menos en EEUU, el tablero del coche es un lugar donde se puede mostrar publicidad. Y si hay algo que las grandes tecnológicas nos han enseñado estos últimos años, es que su auténtico valor añadido está en los datos que recoje y procesa. Se avecinan tiempos muy interesantes para temas de privacidad.

miércoles, septiembre 13, 2017

Robo de datos en Equifax

Equifax es una empresa americana que recaba información sobre los hábitos de pagos de deudas y facturas de individuos, elaborando un perfil que permite conocer el comportamiento crediticio de los mismos, lo que en EEUU se llama credit score - calificación crediticia -. Las entidades que prestan dinero utilizan esta calificación para saber la probabilidad que tiene una persona de pagar sus deudas y, por tanto, para saber si le conceden un crédito.

Estados Unidos es un país donde las redes de seguridad que tiene el Estado para sus ciudadanos no se encuentran tan desarrolladas como en Europa. Esto hace, según algunos economistas, como Raghuram Rajan, el crédito en Estados Unidos viene a jugar el papel de parte del Estado de Bienestar europeo. Estas calificaciones de crédito algo básico en el sistema financierop americano, dada la importancia que tiene el crédito.

La semana pasada se publíco la noticia que Equifax había sufrido un robo de datos que afecta a unos 143 millones de ciudanos americanos. Entre los datos que robaron de la compañía están números de la seguridad social, fechas de nacimiento, nombres de las personas, direcciones e incluso números de permisos de conducir, información que es extremadamente sensible en un sistema como el americano.

El uso de estos datos por parte de criminales de todo tipo puede dar lugar a fraudes o suplantación de identidades, siendo esto último lo más grave, ya que estos datos pueden usarse para obtener receta médicas, abrir cuentas corrientes, usar los números del carnet de conducir para saltarse las normas de tráfico y cargar a otro las multas, etc.

¿Y dónde se ha producido el fallo de seguridad?. Parece ser que uno de los servicios web de Equifax usaba Apache Struts, un framework usado para crear aplicaciones web usando java. Parece ser que el ataque se realizó el pasado mes de julio aprovechando un problema de seguridad desconocido por los desarrolladors - zero day -. Este software es usado en multitud de productos, lo cual ha obligado a diversos fabricantes de software a repasar sus programas. Por ejemplo Cisco ha publicado un boletín de seguridad de los productos afectados por este fallo. Los desarrolladores de Struts han publicado una carta hablando del este robo de datos.

Por otra parte si es posible hacer software más seguro contra fallos. Se ve todos los días funcionando programas en sistemas de misión crítica como aviónica o sistemas que tienen que estar certificados por diversar autoridades para poder usarse en el entorno crítico para el cual han sido diseñados. Ahora, se puede imaginar el dinero y tiempo que costaría hacer un simple servidor web siguiendo los criterios que se utilizan en otras industrias y teniendo en cuenta que el mundo de internet, muchas veces no importa llegar con un producto completo y pulido, sino con un producto que de una funcionalidad atractiva al usuario y poder alcanzar la suficiente masa crítica que permita a la empresa sobrevivir: La seguridad, muchas veces, puede pasar a un segundo plano, a pesar que cada vez hay más normativa que obliga a cumplir una serie de estándares.

El caso de Equifax con Apache Strut tiene otro punto de vista que hay que estudiar: Cuando en un producto se integra software de terceros, siempre hay que estar atentos al desarrollo y mantenimiento del mismo, especialmente en todo lo relacionado con la seguridad y si ese software manipulará directamente contenido que llegue de los usuarios, que por definición, no se puede confiar en él. Han existido multitud de problemas en programas que usaban librerías desactualizas o mal mantenidas.

lunes, septiembre 11, 2017

Publicar en Instagram desde cualquier navegador

Si accedes a Instagram desde un PC normal con cualquier navegador, no se pueden subir fotografías. La única manera que Instagram permite subir contenido desde un PC es similar que se está usando un navegador móvil, ya que hace un tiempo se incluyó esa funcionalidad.

¿Y cómo se hace eso?. Pues es bastante sencillo, puesto que la mayoría de los navegadores permiten el cambio del User-agent que envían en las peticiones HTTP.Hay que decirle al navagador que mande un User-Agent que se corresponda con un navegador móvil.

Por ejemplo, para el caso de Safari en Mac, es necesario activar el menú de desarrollador. Se despliega el menú de Desarrollo y se pulsa en agente de usuario, despegando el menú. Si se selecciona cualquiera de las versiones que se ejecutan bajo iOS, se podrá acceder a la funcionalidad de subir fotografías desde el ordenador. Hay que tener en cuenta que esta configuración es por pestaña. A continuación, una captura de pantalla donde se ve como configurar el User-Agent en Safari.

Aunque se puede cambiar de manera manual, en el caso de Firefox, lo mejor es usar algún tipo de extensión que se encargue de la gestión del mismo, ya que si no, es necesario tocar la configuracion en about:config. Por ejemplo, User Agent Switcher, pero es necesario configurarlo con un UserAgent más moderno.

En el caso de Google Chrome es relativamente sencillo hacerlo, aunque es más invasivo que en caso de Safari. Para ello, se despliegan las herramientas de desarrollador (cmd + opt + i en Mac) y se activa el "device tool bar" con cmd + shift + m, o pulsando en el icono de las herramientas desarrolladores (el icono que está azul arriba a la izquierda, en la siguiente captura de pantalla)

viernes, septiembre 08, 2017

Linux en sistemas de armas: Destructores clase Zumwalt de la US Navy

Los barcos de la clase Zumwalt son destructores lanzamisiles con capacidades de ataque a tierra, lucha antisubmarina y antiaérea. Con caracterítiscas stealth y con multitud de sistemas automáticos integrados en TSCEI - Total Ship Computing Environment Infrastructure -, buscan ser más baratos de operar y con menos tripulación que barcos de tamaño y misiones similares. Sim embargo, dada las tecnologías implicadas, los costes de desarrollo se dispararon dejando la clase sólo una serie de tres barcos.

La particularidad es que el TSCEI está implementado en 16 contenedores fabricados por Raytheon llamados electronic modular enclosures usando componentes COTS. Estos contenedores protegen a la electrónica que va alojada en su interior de vibraciones, golpes e interferencias del exterior. La misión de estas granjas de servidores es controlar todo el barco: sensores, armamentos, motores, rumbo, gestión de daños, tuberías,... . Los servidores instalados en estos contenedores son en su mayoría blades de IBM ejecutando Redhat Linux.

Los diferentes módulos se comunicacan entre si usando protocolos IP, con adaptadores especiales llamados DAP - que también usa Linux - en aquellos equipos que no tengan conectividad IP nativa.

La presentación de datos se realiza en consolas que utilzan procesadores Intel y que ejecutan un sistema de virtualización - LynxSecure - encima del cual se ejecutan varias instancias de Linux.

Referencias

jueves, septiembre 07, 2017

Linux en sistemas de armas: SCOMBA de la Armada Española

SCOMBA (Sistema de COMbate de los Buques la Armada) es un sistema de combate desarrollado por Navantia para los buques de la Armada Española con la intención de ofrecer un sistema base común al que se le añaden módulos que hacen de interfaz con los diferentes sistemas del buque. Ofrece un hardware estándar y una capa de presentación común en todos los sistemas del buque, adaptándolo luego a las misiones del mismo.

Una de las decisiones en el desarrollo de sistema de combate fue usar componentes COTS, es decir, usar elementos que ya existen en el mercado sin necesidad de hacer desarrollos específicos para el sistema de misión que ate a un solo proveedor de hardware y cuya evolución suele ser más lentas. En este caso SCOMBA usa ordenadores x86 y como sistema operativo usa Redhat Linux encima del cual se ejecuta un middleware que permite aislar los servicios del sistema del resto de la plataforma.

Referencias

domingo, septiembre 03, 2017

Evitar la reutilización de procesos en MacOS X

A pesar de llevar más de diez años usando MacOS X, hay una cosa que no he descubierto hasta hace un par de días: Como ejecutar nuevos procesos de la misma aplicación. Si, cuando pulsas en el icono de la aplicación (por ejemplo, Terminal.app), si está ejecutándose, no crea una nueva, sino que reutilia la instancia anterior. Lo que no sabía es que con el comando open y las opciones -a y -n se lanza un proceso nuevo. Si además, queremos que este proceso no nos abra las ventanas viejas que pueda tener almacenadas, se usa -F.

Por ejemplo, si lanzamos desde el Dock una instancia de Safari y queremos querer otra nueva:

$ open -n -F -a "Safari.app"

Lo curioso es que esta sencilla orden me permite volver a usar los escritorios virtuales como lo hacía hace más de diez años en Linux usando fvwm, donde en cada uno de los escritorios ponía los procesos que me interesaban, especialmente xterm. En mi caso, lo que más me interesa es colocar en los escritorios ventanas del Terminal.app o del Safari.app. Pero claro, el sistema trata a todas las ventanas de un mismo proceso como una entidad única, con lo cual, si movía una venta a otro escritorio, me movía todas las del proceso. Sabiendo que con open puedo ejecutar nuevos procesos, mi problema queda solucionado y puedo volver a usar el sistema de escritorios virtuales como a mi me gusta.

jueves, agosto 24, 2017

Enredando con el cliente de Cisco Umbrella en OS X

Hace unos días me instalaron en la máquina Cisco Umbrella. Esta es una plataforma de seguridad en la nube que básicamente hace dos cosaS:

  • Modifica la configuración DNS de la máquina para que cualquier petición sea redirigida hacia los servidores de Cisco Umbrella y analizada si se permite o no.
  • Un tunel IPSEC - al menos en el caso del Mac - que manda por el mismo todo el tráfico hacia direcciones que considera problemáticas.

Puesto que me ha picado un poco la curiosidad, me he puesto a mirar un poco como está implementado. Empecemos por lo fácil. Si se tiene permisos de administrador, parar el Cisco Umbrella es tan fácil como esto:

launchctl unload "/Library/LaunchDaemons/com.opendns.osx.RoamingClientConfigUpdater.plist"

Aunque claro, tb me podéis decir - con razón que lo podéis desinstlar -, pero vamos, se trata de poder pararlo en un momento dado.

El mecanismo que utiliza es bastante pedreste para comprobar los nombres: Simplemente modifica el resolv.conf para que apunte a localhost donde estará escuchando el proceso dnscrypt-proxy que se encargará de rutar las peticiones DNS a la nube - Cisco recopilando información :) - y devolver la IP correcta o dirigirnos a una página donde se nos dice que no estamos autorizados a ir a esa dirección. Un ejemplo con lo más fácil de probar y que no está autorizado: Una de como Porn Hub:

$nslookup 
> www.pornhub.com
Server:     127.0.0.1
Address:    127.0.0.1#53

Non-authoritative answer:
Name:   www.pornhub.com
Address: 146.112.61.106
> 146.112.61.106
Server:     127.0.0.1
Address:    127.0.0.1#53

Non-authoritative answer:
106.61.112.146.in-addr.arpa name = hit-adult.opendns.com.

Authoritative answers can be found from:

Podéis ver de la salida anterior del nslookup, la respuesta que nos devuelve cuando se busca la dirección IP de un sitio de vídeos lúdico-festivoses una IP que apunta a una página de opendns (Cisco Umbrella) diciéndonos que no está permitido.

Pero, ¿Qué ocurre si cambiamos el servidor de DNS al que hacemos la consulta?. Por ejemplo, vamos a usar uno de los servidores de Google, 8.8.8.8

$ nslookup 
> server 8.8.8.8
Default server: 8.8.8.8
Address: 8.8.8.8#53
> www.pornhub.com
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
www.pornhub.com canonical name = pornhub.com.
Name:   pornhub.com
Address: 31.192.120.36

Pues nos está devolviendo el valor correcto de la IP del sitio prohibido :)

Este tipo de artimiñas pueden hacerse por el sencillo motivo que Umbrella no intercepta las librerías encargadas de resolver nombres en el sistema, al menos en Mac OS X. Lo único que hace es cambiar los servidores DNS que utiliza el resolver por defecto, que como veis en este ejemplo es fácil de saltar. Hay infinidad de maneras de saltarse esta restricción como un usuario normal en una máquina Unix, ya que la mayaría de personas tienes accesso a un ssh y a un proxy socks. Por ejemplo, un servidor ssh al que se tenga acceso y usar la opción -D para SOCKS.

Cambiando de tema, lo que me ha llevado a mirar un poco como funciona Cisco Umbrella fue llevarme la sorpresa que de buenas a primeras, tenía una tabla de rutas con 54000 entradas que se enrutaban a través de un tunel IPSec que crea el propio Cisco Umbrella. Por ejemplo, en mi máquina ese tunel es utun0 y al ejecutar un netstat -rn me di cuenta que existían miles de entradas que iban a través de dicho túnel. Esto forma parte del mecanismo de protección de IP y es una manera bastante sencilla de saber cual es la base de datos de IP sospechosas que tiene Cisco: Todas las que están en la tabla de rutas redirigidas al túnel. Con un simple netstat -rn|grep utun0|awk '{print $1}' y voilà.

Se puede obtener los nombres de aquellas IP que tengan resolución inversa con un script similar a este, aunque estaríamos bombardeando el server de Google, así que casi mejor usar uno propio :)

netstat -rn |grep utun0|awk '{print $1;}'| while read ip;do nslookup "$ip" 8.8.4.4;sleep 1;done|grep "name = "

viernes, agosto 18, 2017

Maraki: Infraestructura en red y negocio

Conocía los puntos de acceso que fabricaba Meraki: Lo llevabas a una oficina, los conectabas a tu red y el solito llamaba a sus servidores centrales. Los usuarios del mismo - previo pago de la correspondiente cuota anual - pueden gestionar el aparato a través de la infraestructura que Cisco ha desplagado en la nuble. Hoy he visto que Meraki ha extendido el concepto a switches y firewalls. Servicios de core de red gestionados desde la nube de Cisco.

Todos estos nuevos productos son un paso más en los servicios gestionados donde aunque seas el dueño del hardware vas a necesitar la cuota anual de uso. ¡Cómo ha cambiado la cosa, si uno mira apenas 5 o 6 años atrás!.

Si se piensa es un modelo de negocio que es el sueño húmedo de una compañía: ingresos recurrentes por renovación de licencias de uso y en una infraestructura de red que no se suele cambiar todos los años y donde las migraciones suelen ser costosas en tiempo y dinero.

Es algo similar a lo que ha ido pasando en el mundo del contenido de música y películas, y de lo que desearían los grandes estudios de videojuegos: Siempre es mejor hacer un streaming de los contenidos y pagar cada vez, que darte el soporte físico y pagar una sóla vez. En teoría eso debería de hacer que los streaming fueran más baratos.... en teoría.

Una maldad adicional: Si fuera un servicio de seguridad de un país, siempre sería más fácil atacar estos servicios gestionados. Imaginaros que un servicio de inteligencia extranjero coloca a alguien en Meraki de los que se encargan de dar soporte a estas infraestructuras ....

There is no cloud it's just someone else's computer

sábado, agosto 05, 2017

Pensando sobre Vodafone Pass

Supongo que muchos habréis visto este verano la publicidad del servicio de Vodafone Pass. Por una pequeña cuota al mes se puede tener acceso a redes sociales o servicios de streaming de música sin consumir los megas que se tienen contratados. Es decir, en función del destino del tráfico nos cobran de una manera u otra. Un servicio bastante interesante para los clientes que hacen uso de este tipo de aplicaciones.

Se entiende por neutralidad en la red al principio que los actores encargados de transportar el tráfico IP no discriminan, es decir, que entre otras cosas, no se puede cobrar de manera diferente en función de la aplicación que manda los datos. Ni que decir tiene que el servicio de Vodafone Pass no cumple con este principio.

Ahora, ¿beneficia o no a los usuarios esta nueva tarifa de Vodafone?. ¿Se debería prohibir este tipo de ofertas?. Cada uno puede sacar sus conclusiones.

lunes, julio 31, 2017

Renderizar Markdown en Python: Las extensiones

Lo que hace interesante al módulo de Markdown en Python es la incorporación de un API que permite añadir extensiones y adaptarlo a las necesidades específicas. Existe todo un conjunto de extensiones oficiales, aquellas que son soportadas por los autores del módulo markdown y un buen conjunto de extensiones de terceros que pueden servir para añadir el comportamiento que nos interese al sistema.

Por ejemplo, si se quiere usar alguna de los añadidos a markdown de github, se puede hacer con la extensión py-gfm:

$ virtualenv markdown
$ cd markdown
$ source bin/activate
$ # Se instala markdown automáticamente
$ pip install py-gfm

Para renderizar ficheros que use esta extensión, se puede usar el siguiente código:

import markdown
from mdx_gfm import GithubFlavoredMarkdownExtension
import sys

md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension()])
for filename in sys.argv[1:]:
    with open(filename, mode="r") as f:
        content = f.read()
        html = md.convert(content.decode('utf-8'))
        print html.encode('utf-8')

Al igual que ocurre con el módulo normal, desde la propia línea de comandos es posible indicar que se cargue una extensión, para el ejemplo anterior:

python  g-m markdown -x mdx_gfm file1 file2 ...

La opción -x especifica el path hasta el módulo donde se encuentra la extensión.

Existe documentación para crear una extensión y añadirla al sistema de markdown. No es demasiado complicado desarrollar una extensión, aunque desde mi punto de vista la documentación no es del todo clara. Un ejemplo de extensión, que añade a todas las etiquetas una clase parrafo sería el siguiente código. Dejo para otra entrada mis notas de como desarrollar nuevas extensiones.

from markdown.util import etree
from markdown.treeprocessors import Treeprocessor
from markdown.extensions import Extension

class ParagraphProcessor(Treeprocessor):
    def __init__(self, md):
        super(ParagraphProcessor, self).__init__(md)
    def set_paragraph_style(self, element):
        for child in element:
            if child.tag == "p":
                child.set("class", "parrafo") #set the class attribute
            self.set_paragraph_style(child)
    def run(self, root):
        self.set_paragraph_style(root)

class ParagraphClassExtension(Extension):
     def extendMarkdown(self, md, md_globals):
         md.treeprocessors.add('paragraphProcessor', ParagraphProcessor(md),">inline")

Si suponemos que el código anterior está en un módulo llamado pproc y que está en nuestro PYTHONPATH se puede usar con:

import markdown
from mdx_gfm import GithubFlavoredMarkdownExtension
from pproc import ParagraphClassExtension
import sys

md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension(), ParagraphClassExtension()])
for filename in sys.argv[1:]:
    with open(filename, mode="r") as f:
        content = f.read()
        html = md.convert(content.decode('utf-8'))
        print html.encode('utf-8')