Automágica: durante 2017 estoy trabajando bastante en Automágica, mi software para editar libros: Más información - Posts relacionados

La caja (cuento)

La historia transcurrió en Suecia, en la ciudad de Gotemburgo. Era domingo y agujas de agua caían infinitas sobre la metrópolis. Empezaba a descubrir que la lluvia era una constante en aquella ciudad.

Estaba encerrado en lo que por esos días me servía de morada, un caserón de madera pintada de un color entre gris y celeste, ubicado en un barrio impronunciable sobre una calle de similar dicción. Yo hojeaba a desgano una edición completa y ampliada de La guía del autoestopista galáctico que había conseguido por unas pocas coronas en una librería de libros usados en el centro. Sí, en Suecia también hay librerías de libros usados. ¿Quién lo diría?

Finalmente, me decidí a salir. El sistema de transporte público en esa ciudad es genial. A diez metros de la puerta de calle me tomé un bus al centro. Con el mismo boleto, en el centro, me tomé un tranvía hasta el puerto. Y en el puerto, todavía sin volver a pagar, me tomé un ferry que recorría las islas del archipiélago.

Me bajé en la última de las islas. Algunas personas bajaban sus bicicletas. Caminé por un sendero que se internaba en un bosque en el corazón del islote. La calzada estaba cada vez más desdibujada y los árboles a sus costados insistentemente frondosos. Las sombras entraban en la luz y, en cierto momento, me encontré con una oscuridad total. Apreté las tiras de mi mochila con las manos para darme seguridad y seguí caminando. No podía sacarme la sensación de que alguien me observaba. De repente, el camino se abrió en un claro de luz. Cuando estuve a campo abierto, no supe muy bien dónde me encontraba, no veía el puerto y unas nubes de plomo se apoderaban del cielo.

Un lugareño apareció detrás mío en el mismo sendero. Me dijo unas palabras en sueco y, ante mi perplejidad, intentó en inglés. El hombre vivía en la isla desde hacía 40 años aunque, una vez a la semana, iba a trabajar a la ciudad. Consultor de algún tipo, creo recordar que le entendí. Me invitó a tomar café en su cabaña. Miré las nubes en el cielo, se dibujaban amenazantes. Miré la hora en mi reloj; el último ferry de regreso pasaba en dos horas. Cierto mantra de la niñez que versaba sobre desconocidos atravesó el tiempo como una flecha y me resonó en los oídos. Me encogí de hombros y acepté la invitación.

La cabaña estaba hecha de troncos de pino y, aunque acogedora a la vista, dudaba qué tan efectiva sería para resistir a los crudos inviernos que azotaban a esa zona, tan cercana al círculo polar.

George, que así era como se llamaba el hombre, encendió la hornalla la una cocina con un fósforo y lo sopló con pesadez antes de tirarlo a la basura. Unos minutos más tarde estaba tomando el mejor café que tomé en mi vida. Llevábamos charlando varios minutos sobre el acontecimiento del mes preferido de todos los habitantes de aquel país, la boda real, cuando a mi interlocutor, a quién se lo notaba contentísimo de poder practicar su inglés, se le ocurrió mostrarme algo. Lo entendí más por el dedo índice que levantó a la vez que abría exageradamente la boca que por sus esfuerzos en la lengua de Shakespeare. Menos de una centena de segundos más tarde, estaba de vuelta con una cajita metálica.

Depositó el artilugio frente a mí, sobre la mesita ratona que nos acompañaba. George me miraba divertido. Pude observar distintos glifos que la atravesaban. Los reconocí como pertenecientes al alfabeto rúnico, sin poder descifrar una sola palabra.“¿Qué es?”, pregunté.

El hombre se puso de pie y recitó una poesía en el idioma de sus antepasados. Le pedí que me la traduzca y, haciendo un gran esfuerzo, me contó una historia sobre dioses y vikingos, objetos mágicos y barcos que volaban, una doncella y una competencia por su amor.

Según George, Loki, el más astuto de los dioses, había puesto sus ojos sobre una muchacha que estaba a punto de casarse con uno de los más bravos vikingos de cierto poblado. La deidad se le aparecía tomando distintas formas y le hacía maravillosos regalos a fin de caerle en gracia. Cuando su prometido se enteró de esto, entró en cólera y exigió la presencia de Loki, el dios de las travesuras. Éste se presentó ante él y le ofreció una forma de dirimir quién se quedaría con el corazón de la señorita; una carrera en barco hasta cierta isla: el primero en alcanzar la costa sería el vencedor. El vikingo aceptó sin vacilar y al día siguiente se llevó a cabo la competencia.

Loki, que también era conocido como el viajero del cielo, se presentó con un barco que en lugar de navegar por el mar, surcaba el aire. La disputa dio comienzo tras el sonido de un gran cuerno soplado por la propia muchacha. El vikingo empezó a remar con todas sus fuerzas, transpirando y jadeando, mientras que Loki iba muy tranquilo en su embarcación mágica, esperándolo cada vez que le sacaba un buen trecho para poder propinarle una burlona carcajada. La pugna estaba por llegar al final y se veía que el vikingo no podría llegar antes que Loki. Fue entonces que tomó su hacha, se cortó una mano y, con todas las fuerzas que le quedaban, la arrojó hasta la orilla.

Loki, que nunca aceptaba una derrota, enfurecido, mató a la doncella y puso la mano en un cofre de metal. Se lo entregó al vikingo y lo condenó a vivir por siempre.

Miré mi reloj. El último ferry salía en cinco minutos. Me incorporé abruptamente. George me acompañó a la puerta y le extendí la mano para saludarlo y agradecerle la historia. Recién en ese momento lo noté. El frío de esa prótesis ortopédica me heló la sangre.




Talk: Taint Mode for Python via a Library (slides)

These are my slides for the presentation Taint Mode for Python via a Library I gave in OWASP App Sec 2010 in Stockholm last 24th of June. The organizers will be publishing some media (photos and video) from the talk.

This presentation is called A Taint Mode for Python via a Library and is a joint work of me, Juan José Conti and Alejandro Russo.

img0

Today most of the computer attacks are produced against web applications rather than to desktop applications (which requires knowledge of an specific domain) or to the operating system (which requires low level knowledge).

Attack web sites is much more easier.

The consequences of these kind of attacks can vary, for example:

Impersonate: when an attacker stills the identity of a user in in web site.

Compromise confidential data: when an unauthorized user reaches data he wasn't suppose to reach.

Denial of Service: when a resource is not available to its genuine users.

And

Data destruction.

So the attacker goal is to craft input data to gain some control over certain operations. It's important to mention here that the attacker has no control over the executed code, just over the input data.

img1

These are examples of different sensitive sinks an attacker could attack.

The attacker can manipulate the data that will be use to produce an SQL query and obtain some secret information.

…make an operating system injection and execute arbitrary commands on it

or

.... exploit an XSS vulnerability and stole a user's credentials in some web site.

img2

A way to face these problems is using Taint Analysis. Usually enforcesd

Data received from a client is considerer tainted. We can't trust in data from the outside because we don't know who generate it. May be a real user, maybe an attacker or even an attacker program.

Tainted data can be untainted by a sanitization process.

We don't want tainted data to reach sensitive sinks.

In the image you can see different sanitization processes represented with different colors. This means that data that will finish in different sinks needs to be properly cleaned for that kind of sink.

It's not the same the function you'll use to protect a page renderer against XSS than the DB against SQLI.

img3

For example, look a this chunk of data. If it's used in the where clause of an SQL query and that query says something like: delete all rows from table X where id equals to VALUE, then all the rows will be deleted. But if the VALUE is used to generate a web page, it's harmless.

Something similar happens with this code. If it's used as is it to render a web page, a message will pop-up and we'll have in front of our eyes an XSS vulnerability. Again, if the chunk of data finish in a logging process on the operating systems, it would be harmless.

img4

Taint analysis can be performed in two ways. Dynamic or static.

Dynamic analysis is usually implemented as a Monitor and have the advantage to produce less false alarms that static analysis. Its main drawbacks are the overhead produced (because the program and the monitors runs at the same time) and the need to modify the interpreter in order the achieve the desire behavior.

On the other hand, static analysis produce no overhead because it analyze the text of the program without need to run it and no modification of the interpreter is needed. A mayor disadvantage is that they usually generate more false alarms than Monitors.

Our approach is a library written in Python where no interpreter modification is needed, so we solve one of the monitors drawbacks.

img5

In order to implement Taint Analysis, several tasks need to be performed.

We need a way to identify untrusted inputs, sanitization functions and sensitive sinks. They can be marked in the source code using some syntax or described in a configuration file.

Data must be untainted after a sanitization process.

Detect when tainted data reaches sensitive sinks

And the hardest one, propagate taint information on the program

img6

I'll show you an example of what I mean with taint propagation.

Suppose a is tainted because we receive it from the outside and b is clean because it was generated inside the program. Then, a concatenated with b need to be tainted too.

We also want taint propagation to take place when we do: a eight times, get an slice of a, use a for string formatting or apply to a any of its methods.

With all these concepts in mind, we can now see the implementation details of our library.

img7

We wrap python built-in types for 2 reasons: 1) in order to add a taints attribute which contains the tags identifying the taints an object has in certain moment.

And 2) to overload its methods in order to make them work in this way: if any of the method arguments is tainted or the object that receive the message is tainted, then the resulting object should be tainted too.

It's important to mention that our implementation support tainting of different types, while other only works with strings and that we provide tags to identify different kind of taints while other only use a boolean tag: tainted or not tainted.

In addition, to improve the taint propagation mechanism we also provide taint aware functions to replace some Python built-in functions. For example, len, which applied to a string, returns its length. If the original string is tainted, the resulting integer will be tainted too.

img8

We use decorators to mark untrusted sources, sensitive sinks and sanitization functions. Decorators are a Python abstraction that let us add certain behavior to functions, methods or classes.

For example, untrusted is the decorator used to mark a function as an untrusted source. We can apply it using a regular function call or, if we have access to the definition of the function we want to decorate, using Python's syntactic sugar for this.

The behavior added by this decorator is: mark every object returned by the function as tainted; and tainted with all the possible tags. Because we don't know which kind of attack could be hidden behind it.

img9

The second kind of decorator provided let the programmer specify which elements of his programs are considerer sensitive sinks. A difference with the previous one is that here we need to explicitly say which kind of attack the sink is sensitive to. We do it providing a parameter to the decorator. In the first example, an appropriate one would be SQLI.

img10

The third kind of element we need to mark are the sanitization functions. Again, we need to specify which kind of taint they are able to clean.

These are the principal decorators but others are provided as variations of the ones presented here.

img11

Now, we'll see a little demo of a web application.

note: the example shown can be downloaded from http://svn.juanjoconti.com.ar/dyntaint/trunk/webdemo/

img12

Finally, the main conclusion of this work is that it's possible to provide a lightweight taint analysis library for python with NO interpreter modification needed.

Future works could address us to make similar implementations in other languages and evaluate it in popular web applications; in order to achieve this, the library must be integrated with some web frameworks or in a platform like Google App Engine.

img13

More information on the library can be found in the presented paper. It can be downloaded from the author's web sites.

img14


location update: Freiburg, Alemania

El 26 dejé Gotemburgo para volar a Alemania. Llgué a la noche a Frankfurt y de ahí tomé un ICE (Inter City Express) a Freiburg (con transbordo en Monheim). Cuando llegué a media noche, mi amigo Federico me estaba esperando en la plataforma que un mes atrás, al comprar el boleto, sabíamos que llegaría.

Estuve subiendo algunas fotos de ayer domingo y hoy lunes al álbum Freiburg.

update: el álbum Freiburg tiene fotos de la ciudad de varios días

update: álbum SeePark con fotos del lago.

update: álbum Zurich y oficinas de Google.

update: álbum visita a la Selva Negra.


Midsummer 2010

Ayer se celebró en Suecia Midsummer, uno de los feriados más importantes del país y de los países nórdicos en general. Festejan el día más largo de año (eran las 12 de la noche y todavía había claridad).

Una de las actividades tradicionales consiste en levantar un gran poste y bailar alrededor. Antes de levantarlo, juntan flores y retoños para cubrirlo enteramente. La mayoría de la gente se llega hasta el bosque para celebrarlo. El "bosque" es el parque más grande dentro de la ciudad.

Van familias, jóvenes y extranjeros. Tocan música tradicional y algunos incluso están vestidos con los trajes tradicionales. Otros llevan puestas coronas hechas con flores y retoños.

Después de ver el baile, nos sentamos en el pasto a hacer un grill. El asado y las parrillas no son muy comunes en Suecia; utilizamos una parrilla descartable (ver foto) y asamos chorizos españoles (se hacen en 4 minutos) y carne de cerdo.

La gente se reúne en pequeños grupos, comiendo y charlando hasta las7 y 8 de la tarde. Luego, con el sol aún arriba se van volviendo lentamente a sus casas a terminar la noche tomando algo.

Tengo un álbum con fotos.




En el archipiélago de Gotemburgo

Anoche me acosté con la idea de hoy domingo viistar el archipiélago de Gotemburgo, bien al sur e la ciudad. Hoy me levanté y llovía :-/ Me puse a hacer otras cosas, leí un capítulo del libro que compré, desayuné tranquilo y limpié un poco... hasta me puse a aprender piano por internet! (aprovechando el piano de cola que hay en la sala).

Pasada la 1 del mediodía el tiempo mejoró y pensarlo agarré la mochila y salí a la aventura. En la cocina del hotel hay un libro sobre la ciudad y tiene un capítulo sobre el archipiélago; ahí leí que desde el centro llegabas con el tranvia (trem) 11. Este dato también lo había escuchado a algunas personas así que fuí tranquilo, con la estación destino anotada (por las dudas).

Me tomé el 19 en la puerta del hotel camino al centro. En los pocos minutos que me separan de la estación central recordé que quería cambiar dinero, así que apenas llegué pasé por el puesto de Forex en el shopping (lo había intentado el día anteriro pero llegué cuando ya habían cerrado).

Ya en la parada del 11 me puse a leer las distintas rutas que pasaban por ahí y resultó que el 9 también iba a mi destino: Saltholmen. Miré la pantalla en la parada; el 11 venía en 15 minutos y el 9 en 2. Desición tomada. El trem sale a las afueras de la ciudad y pasa por muchas estaciones hasta que llega a la última dónde pega la vuelta. Allí me bajé y pregunté dónde se tomaba el Ferry.

Algo lindo del sistema de transporte público de acá (además de la puntualidad y de las pantallas con información) es que es multi transporte (bus, tranvía y barco) y con el mismo “ticket” podés moverte por 90 minutos sin volver a pagar. Usé las comillas por que en realidad no hay papelitos, uno simplemente marca con la tarjeta.

Así que cuando estaba en el puerto me fijé cual era el próximo Ferry en sarpar. Había uno que salía en 10 minutos. Le pregunté a unos pasajes y en el librito de la empresa de transporte me marcaron los horarios y en qué isla me convenía bajar. Por suerte, el que tomé llegaba hasta Vrangö, la isla más al sur, la de más vegetación y la más linda.

Vrangö tiene 3 km cuadrados y casas muy pintorescas, estan prohibidos los automóviles y tiene 400 habitantes. Apenas bajé me interné caminando en la isla, pasé por algunas recidencias hasta que encontré el camino a la costa, donde había muchas piedras y se podía caminar al lado del agua. Después volví a la población para verla un poco más, cuando encontré una especie de bosque con un sendero.

Dudé antes de entrar, la vegetación era bastante tupida y una vez dentro ya no se veía el cielo; pero... ¿alguna vez volvería a estar parado en ese lugar, en la puerta del pequeño bosque? Es muy probable que no, así que tomé el paseo. Cuando estaba llegando a un claro escuché pasos corriendo atrás mío, era un habitante de la isla.

Hablas español? -me dijo

El tipo era Sueco, pero hablaba muy bien español, incluso había estado en Argentina. Me llevó a recorrer la isla, mostrandome los mejores lugares mientras caminábamos y charlábamos. A la hora en que pasaba mi ferry de regreso, estabamos en el muelle esperando.

Y así emprendí el regreso: ferry, trem y bus. Todo con un solo boleto.

Todas las fotos en orden cronológico en el álbum Archipiélago de Gotemburgo.


2da semana completa

Esta segunda semana fue completa en Chalmers así que me concentré en trabajar bastante para aprovechar el tiempo aquí: pude hacer algunas mejoras al trabajo que vamos a presentar e incluso integrarlo con otras tecnologías, terminé las slides de mi charla, empecé a escribir mi plan de tesis para la maestría y leí un libro sobre programación funcional.

Algunos estudiantes de los que conocí la primer semana ya no están, por que viajaron a USA de intercambio, beca, pasantía o alguna otra modalidad de estudio. También conocí nuevas personas, lo cual es bueno.

A mitad de semana, miércoles, sentí la intensidad con la que venía trabajando y estaba un poco cansado, pero justo ese día era la fiesta del verano del departamento Computer Science and Engineer! Nos llevaron en unos buses al norte de la ciudad, junto al Océano(?), hicimos juegos y comimos una BBQ.

Muy bueno para terminar la semana con energías renovadas. El viernes, como todos los viernes aca, hubo After Work; te juntás con tus colegas a comer algo y tomar algo. Fuimos a un lugar Polaco, Kraków, muy lindo, donde comí Duck Polish Style. De ahí algunos fuimos a un par de bares muy distintos, primero King Head, en la sona alternativa de la ciudad y luego Bitter en Lanepark(?), mucho más cheto :)

Fotos de estas cosas en el álbum Salpicado viaje a Suecia.

Hoy ya sábado aproveché para hacer algunas compras y en el centro me encontré con estos personajes tocando, cantando y bailando Take me home, country roads de John Denver:

Si no la reconocen, pueden escuchar la versión de otros aficionados.