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

Mis charlas en PyConAr2010

Hoy, en el primer día de PyCon Argentina, en Córdoba, me tocó dar 2 charlas programadas y de yapa una charla relámpago. Les dejo mis slides:

    <li><a href="https://viejoblog.juanjoconti.com.ar/files/charlas/TaintModePyConAr2010.pdf" target="_blank">Taint Mode en Python</a>: Taint Mode es un modo de ejecución de algunos lenguajes de programación que permiten advertirle al programador sobre potenciales problemas de seguridad en su código. La charla: repaso de conceptos, discusiones sobre implementaciones, como funciona nuestra biblioteca y su API.</li>
    
    <li><a href="https://viejoblog.juanjoconti.com.ar/files/charlas/DecoradoresPyConAr2010.pdf" target="_blank">Entendiendo decoradores en Python</a>: los decoradores son una herramienta muy potente que viene con el lenguaje y permiten introducir cambios en código ya escrito de una forma poco intrusiva; sirven por ejemplo para hacer programación orientada a aspectos en Python. La charla: objetos, funciones, decoradores, decoradores con parámetros, clases decoradoras, decorando clases.</li>
    
    <li><a href="http://svn.juanjoconti.com.ar/dyntaint/trunk/webdemo/" target="_blank">Demo en Taint Mode en Python</a>: mostré  2 slides de la primer charla más una aplicación demo que sirve de prueba de concepto para mostrar que todo lo que dije antes funciona.</li>
    

    update:

    Fotos del primer día.



    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



    8 de mayo: Python Day en Rafaela

    El próximo sábado se va a desarrollar en la ciudad de Rafaela un Python Day, un día de charlas para que quienes no conozcan Python puedan acercarse al lenguaje. Vamos a tener muchas charlas introductorias y esperamos pueda aprovechar este evento tanto la comunidad universitaria como la ciudad en general.

    http://www.pyday.com.ar/rafaela2010/

    Por mi parte voy a estar colaborando con una charla nueva: Entendiendo Decoradores en Python. Esperemos salga bien :)

    El Python Day es un evento organizado por PyAr con el apoyo de la Universidad Católica de Santiago del Estero, Departamento Académico Rafaela. El evento dura un día donde se darán pequeños cursos y charlas relacionadas a este lenguaje que de a poco va a haciendo su lugar entre los desarrolladores. Tenemos como intención hacer un espacio en donde cualquier persona interesada pueda acercarse para preguntar, aprender y experimentar con estas herramientas. El evento se llevará a cabo acá a partir de las 9:00 de la mañana. ¿Qué es Python? Python es un lenguaje de programación interpretado creado por Guido van Rossum en el año 1990. En la actualidad Python se desarrolla como un proyecto de código abierto, administrado por la Python Software Foundation. La última versión estable del lenguaje es la 2.6 (01 de octubre de 2008). Fuente: Wikipedia Quiero participar… ¿Qué Hago? Si lo que querés es asistir a las charlas, solo aparecete por la universidad el 8 de mayo a partir de las 09:00 y listo (por favor, si es posible, registrate previamente por web)


    Siempre es bueno escuchar a Richard

    El jueves después de trabajo, salimos César, Ceci, Mariano y yo hacia la ciudad de Rosario. Como se había anunciado, Richard Stallman, el padre del Software Libre y líder del proyecto GNU daría una charla abierta a las 19 en un auditorio del Politécnico de Rosario.

    1rajornadagnulinuxrosariojuanjo

    Recién cuando estaba manejando, caí en la cuenta de que la última y única vez que había oído hablar a RMS había sido 10 años atrás. Escribí por ese entonces:

    ...1º Jornada nacional de GNU/Linux, del 4 al 6 de Agosto de 2000, organizado por el LUGRo (Linux User Group de Rosario). Fue el primer gran evento del software libre y Linux realizado en nuestro país. La verdad es que estuvo muy buena, buena organización, puntualidad, espacio suficiente para que los concurrentes disfruten de un evento de esta envergadura, Y sin duda lo mejor de toda la jornada fue la presencia "estelar" de Richad M. Stallman (RMS)...

    Tenía 15 años y solo un par de meses antes me había enterado qué existía otro sistema operativo, leído sobre las 4 libertades del software y escuchado sobre las personas que trabajaban en esta comunidad. Dos meses después de haber conocido esto, el hombre que había iniciado el movimiento venía a mi país, a menos de 200 km de mi casa a presentar sus ideas: no me lo quería perder.

    Así fue que con un amigo viajamos a Rosario, nos instalamos en la casa de sus tías y participamos del primer gran evento de Software Libre  de latinoamérica, no teníamos ni idea de dónde estábamos, no teníamos ni idea de como usar Bash y apenas habíamos intentado instalar alguna distribución, a riesgo de quemar el monitor. Sin embargo, fue una gran decisión: conocí personas con la que me relaciono aún hoy, me motivó para seguir aprendiendo y me permitió formar parte de un movimiento de escala mundial sin precedentes.

    rms_en_rosario

    10 años después volvió a Rosario.

    El día jueves 15 comenzó con la visita al rector de la UNR, el señor Darío Maiorana, quién se entrevisto con Richard en una charla de 45 minutos, si bien la misma estaba pactada para solo 5. En dicha charla, Maiorana se intereso por la utilización de Software Libre en la educación y acepto la sugerencia de ir adoptándolo en todas las facultades de la UNR. Luego de esta entrevista, Richard estuvo ante periodistas en una conferencia de prensa donde fue bombardeado con preguntas de todo tipo las cuales fueron contestadas puntualmente y sin ambigüedad. Por la tarde, fue recibido por el Intendente de Rosario, el señor Miguel Lifschitz. En la entrevista que mantuvieron Lifschitz le comento a Richard sobre los esfuerzos realizados por la Municipalidad para adoptar el uso de Software Libre en la administración pública. Al mismo tiempo, Richard le pidió al intendente que se publiquen en los sitios web de la municipalidad y las dependencias de la misma, un mensaje de que se utiliza Software Libre para el desarrollo y funcionamiento del sitio. Al final la charla se le entrego al intendente una copia del libro “Voto Electrónico, Los riesgos de una ilusiónHackerMás tarde, a las 19, se realizo la charla libre y gratuita en el auditorio de la Facultad de Ciencias Exactas, Ingeniería y Agrimensura donde 600 personas estuvieron presentes ante un discurso magistral sobre la filosofía libre. La respuesta del público fue muy buena y el evento termino con una larga cola de personas que quisieron inmortalizar su presencia junto a Stallman en fotos que serán publicadas en el sitio del LUGRo. El día viernes por la mañana se realizo una reunión en el Concejo Municipal de la Ciudad de Rosario donde se entrevisto con su presidente, Miguel Zamarini, el concejal Jorge Boasso y varias autoridades y concejales. Hubo especial interés de los concejales sobre la temática y Richard pudo explicar varios puntos importantes como la necesidad de utilizar Software Libre en la educación y el estado. También charlo con los concejales sobre los peligros de la utilización de sistemas electrónicos en los procesos de votación. Fuente: LUGRo

    Puertas_traseras

    Una de las primeras cosas que leí escritas por RMS fue El Derecho a Leer, un cuento corto de ciencia ficción en el que se previene de un posible futuro y se ve la importancia del Software Libre en una sociedad. Si no lo leiste, te invito a hacerlo.


    Feliz Navidad!

    Feliz Navidad para todos!

    100_5693update: cambié el emoticón con gorrito de Papá Noel por algo con MAS NAVIDAD: una foto de nuestro pesebre en Pellegrini.


    Primera vez con Ruby

    El viernes por la tarde salí del trabajo y me fuí a escuchar la charla de César Ballardini, El modelo de objetos de Ruby, reflexiones sobre la reflexión. La daba en el marco del evento acts_as_rubylit, el cual se llevó a cabo en la Facultad de Ingeniería y Ciencias Hídricas, Universidad Nacional del Litoral de la ciudad de Santa Fe.

    Nunca antes vi nada de Ruby. Bueno, casi, pero la última vez no pasé del Hola Mundo!juanjo_ruby_800

    César empezó su charla explicando la Paradoja de Blub, de Paul Graham. Blub es un lenguaje de programación hipotético. No es el lenguaje de programación más poderoso, pero tampoco es Cobol o lenguaje de máquina. Un programador Blub está parado más o menos en el medio de la ladera de una montaña; hacia abajo están los lenguajes menos poderosos que Blub, él se da cuenta de esto, por supuesto, a todos esos lenguajes le faltan distintas características que nuestro programador usa en Blub para resolver sus problemas. En cambio, cuando mira para arriba (y ve lenguajes más poderosos que Blub), en realidad no se da cuenta que está mirando hacia arriba, simplemente piensa que está mirando a unos locos, hippies de pelos parados haciendo cosas raras. Cuando los programadores que están más arriba en la montaña miran hacia Blub se pregunta, ¿cómo puede alguien estar usando Blub? Ni siquiera tiene la funcionalidad X tan útil para resolver Y!

    Por inducción se concluye que solo el programador que esté en la punta de la montaña, es decir el que conoce el lenguaje más poderoso, es capaz de distinguir las distintas posibilidades que se tienen con diferentes lenguajes. El programador Blub no puede verlo, por lo que solo sabe pensar en Blub, no se a enfrentado a problemas que le permitan pensar diferente.

    La moraleja de la historia es que uno debería aprender lenguajes que lo obliguen a cambiar su forma de pensar y de resolver problemas (Alan J. Perlis).

    Con esto terminó la primera parte de la charla, luego César hizo una explicación de pizarrón sobre qué es la Programación Orientada a Objetos ( y escribió con su fibrón: un objeto tiene Identidad, encapsula Estado y define Comportamiento). Según César, es un error que en la enseñanza de la POO se empiece por las Clases. ¿En qué parte de "Programación Orientada a Objetos" dice "Clase"? Las clases son solo una forma de crear objetos, pero hay muchas otras. Por ejemplo, existen muchos lenguajes OO basados en prototipos, como JavaScript.

    Después de haber shockeado a la audiencia desarrollando estas dos ideas en un tono casi de declaración de principios, estábamos listos para ver cómo el Modelo de Objetos de Ruby podía cambiar nuestra forma de pensar.

    Lo que sigue no son los ejemplos exactos que desrrolló César con su notebook, solo los que recuerdo. Mezclo los recuerdos de su sesión interactiva de Ruby con mi propio camino de aprendizaje, que arranca ni siquiera teniendo el intérprete instalado :)

    Para empezar los ejemplos, tipeó en la terminal

    irb

    . Hice lo mismo, pero no estaba instalado, por lo que instalé ese paquete y presté atención a sus dependencias:

    juanjo@fenix:~$ irb

    El programa «irb» no está instalado actualmente. Puede instalarlo escribiendo:

    sudo apt-get install irb

    bash: irb: orden no encontrada

    juanjo@fenix:~$ sudo apt-get install irb

    [sudo] password for juanjo:

    Leyendo lista de paquetes... Hecho

    Creando árbol de dependencias

    Leyendo la información de estado... Hecho

    Se instalarán los siguientes paquetes extras:

    irb1.8 libreadline-ruby1.8 ruby1.8

    Paquetes sugeridos:

    ruby1.8-examples rdoc1.8 ri1.8

    Se instalarán los siguientes paquetes NUEVOS:

    irb irb1.8 libreadline-ruby1.8 ruby1.8

    0 actualizados, 4 se instalarán, 0 para eliminar y 0 no actualizados.

    Necesito descargar 119kB de archivos.

    Se utilizarán 664kB de espacio de disco adicional después de esta operación.

    ¿Desea continuar [S/n]?

    Des:1 http://ar.archive.ubuntu.com jaunty-updates/main ruby1.8 1.8.7.72-3ubuntu0.1 [24,0kB]

    Des:2 http://ar.archive.ubuntu.com jaunty-updates/universe libreadline-ruby1.8 1.8.7.72-3ubuntu0.1 [10,4kB]

    Des:3 http://ar.archive.ubuntu.com jaunty-updates/universe irb1.8 1.8.7.72-3ubuntu0.1 [79,1kB]

    Des:4 http://ar.archive.ubuntu.com jaunty/universe irb 4.2 [5138B]

    Descargados 119kB en 2s (58,0kB/s)

    Seleccionando el paquete ruby1.8 previamente no seleccionado.

    (Leyendo la base de datos ...

    248649 ficheros y directorios instalados actualmente.)

    Desempaquetando ruby1.8 (de .../ruby1.8_1.8.7.72-3ubuntu0.1_i386.deb) ...

    Seleccionando el paquete libreadline-ruby1.8 previamente no seleccionado.

    Desempaquetando libreadline-ruby1.8 (de .../libreadline-ruby1.8_1.8.7.72-3ubuntu0.1_i386.deb) ...

    Seleccionando el paquete irb1.8 previamente no seleccionado.

    Desempaquetando irb1.8 (de .../irb1.8_1.8.7.72-3ubuntu0.1_all.deb) ...

    Seleccionando el paquete irb previamente no seleccionado.

    Desempaquetando irb (de .../apt/archives/irb_4.2_all.deb) ...

    Procesando disparadores para man-db ...

    Procesando disparadores para menu ...

    Configurando ruby1.8 (1.8.7.72-3ubuntu0.1) ...

    Configurando libreadline-ruby1.8 (1.8.7.72-3ubuntu0.1) ...

    Configurando irb1.8 (1.8.7.72-3ubuntu0.1) ...

    Configurando irb (4.2) ...

    Procesando disparadores para menu ...NAME

       irb1.8 - interactive ruby
    

    SYNOPSIS

       irb [options]
    

    DESCRIPTION

    irb stands for ‘interactive ruby’. irb is a tool to execute interactively ruby expressions read from stdin. Use of irb is easy if

       you know ruby.  Executing irb, prompts are displayed as follows. Then, enter expression of ruby. A input is executed  when  it  is
    
       syntacticaly completed</strong>.
    

    Ahora si puedo empezar!

    Objetos y mensajes

    Un lenguaje OO consta de objetos y mensajes entre objetos. Algunas veces los mensajes están un poco camuflados, pero siempre están ahí:

    irb(main):001:0> 1 + 2
    
    => 3
    
    irb(main):002:0> 1.+ 2
    
    => 3
    
    irb(main):003:0> 1.+(2) # para los lisperos que extrañan los paréntesis
    
    => 3

    Identidad

    Enviando el mensaje

    object_id

    , podemos preguntarle su identidad a un objeto:

    irb(main):001:0> 1.object_id
    
    => 3
    
    irb(main):002:0> "hola".object_id
    
    => -605926728

    Clases

    Enviando el mensaje

    class

    a un objeto, podemos preguntarle quién es su clase:

    irb(main):005:0> 1.class
    
    => Fixnum
    
    irb(main):006:0> 1.class.class
    
    => Class
    
    irb(main):007:0> 1.class.class.class
    
    => Class

    Podemos ver que la clase Fixnum es una instancia de la clase Class; y la clase Class también es instancia de la clase Class.

    Enviando el mensaje

    superclass

    a una clase, podemos saber cual es su superclase, es decir, qué clase extiende.

    irb(main):010:0> 1.class.superclass
    
    => Integer
    
    irb(main):011:0> 1.class.superclass.superclass
    
    => Numeric
    
    irb(main):012:0> 1.class.superclass.superclass.superclass
    
    => Object

    Luego, la clase de Object es obviamente Class, pero... ¿cuál es su superclase?

    irb(main):019:0> 1.class.superclass.superclass.superclass
    
    => Object
    
    irb(main):020:0> 1.class.superclass.superclass.superclass.superclass
    
    => nil

    Creo recordar que en SmallTalk también era así. Parece un chiste de los diseñadores :) nil ni siquiera es una clase:

    irb(main):021:0> 1.class.superclass.superclass.superclass.superclass.superclass
    
    NoMethodError: undefined method `superclass' for nil:NilClass
    
        from (irb):21
    
        from :0
    
    irb(main):022:0> 1.class.superclass.superclass.superclass.superclass.class
    
    => NilClass
    
    irb(main):023:0> 1.class.superclass.superclass.superclass.superclass.class.superclass
    
    => Object
    
    irb(main):024:0> 1.class.superclass.superclass.superclass.superclass.class.class
    
    => Class

    y la jerarquía de clases se cierra. Es para leer tranquilo y pensarlo.

    El resto de la charla abarcó varias cosas más, pero creo que sería demasiado para desarrollarlo en un post y lo que mostré ya es suficiente para abrirle el apetito a los que estén buscando algún lenguaje para aprender y les produzca un cambio en su forma de pensar :). Si César postea sus ejemplos, los voy a estar referenciando desde aquí o voy a intentar hacer uno o dos posts más.

    Gracias al Grupo de Usuarios de Ruby del Litoral por organizar el evento!


    Semana de la seguridad

    semanaSegEn el año 1988, la Association for Computing Machinery (ACM) declaró al 30 de Noviembre como el “Día Internacional de la Seguridad Informática”, con el objetivo de concientizar respecto de las amenazas que atentan contra la seguridad de la información.

    Esta semana es la Semana de la Seguridad. En Argentina la organiza la Jefatura de Gabinete de ministros. En Santa Fe AsegurarTe está organizando algunas charlas y me invitaron a dar mi charla sobre Taint Mode en Python el día miércoles 25 a las 12:30 en la Dirección de Informatización y Planificación Tecnológica de Rectorado de la UNL. Desconozco qué porcentaje de los asistentes conocen Python, por lo que voy a intentar centrarme más en los conceptos que en la implementación concreta de esta técnica; así como definir bien el problema, plantear sus implicacias y discutir soluciones.

    update: un par de fotos!

    100_5410

    100_5412


    Algunas fotos del 34° acto de colación de grado

    Anoche fue el 34° acto de colación de grado en la UTN FRSF. Luego fue la fiesta anual de la facultad, a la que nos quedamos con varios comapañeros.

    100_5363_s

    Pronto más fotos :)

    update: un par de fotos de las tomadas por Flor Citta.

    SANY1452

    Florcitta y Meli

    Mariano