Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Taint Mode en Python

473 views

Published on

Taint Mode en Python o cómo encontrar vulnerabilidades mediante el uso de variables manchadas. Presentado en PyCon Argentina 2009.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Taint Mode en Python

  1. 1. Taint Mode en Python <ul><ul><li>Cómo encontrar vulnerabilidades mediante el uso de variables manchadas </li></ul></ul>Juan José Conti [email_address] http://www.juanjoconti.com.ar
  2. 2. Presentación <ul><li>No soy un experto en seguridad </li></ul><ul><li>Desarrollador </li></ul><ul><li>Inquietud (codificación segura) </li></ul><ul><li>Kozlov D. y Petukhov A. </li></ul><ul><li>Módulo Python </li></ul>
  3. 3. “ El objetivo de Taint Mode es alertar a los desarrolladores de potenciales problemas de seguridad en su software.”
  4. 4. El modelo de las manchas <ul><li>Fuentes no confiables / variables manchadas </li></ul><ul><li>Funciones limpiadoras </li></ul><ul><li>Sumideros sensibles </li></ul>
  5. 5. “ Si un valor manchado alcanza un sumidero sensible, entonces existe una vulnerabilidad en el programa.”
  6. 6. “ 42 or 1=1”
  7. 7. “ <script> alert('hola') </script>”
  8. 8. “ Si un valor con una mancha X alcanza un sumidero sensible a X, entonces existe una vulnerabilidad en el programa.”
  9. 9. Implementación <ul><li>Dinámico </li></ul><ul><li>from dyntaint import * </li></ul><ul><li>Decoradores </li></ul>
  10. 10. dyntaint.py <ul><li>TAINTED </li></ul><ul><li>STR class </li></ul><ul><li>untrusted / untrusted_args </li></ul><ul><li>cleaner </li></ul><ul><li>ssink </li></ul>
  11. 11. dyntaint.py KEYS = [XSS, SQLI, OSI, II] = range (4) TAINTED = dict ([(x, set ()) for x in KEYS]) class STR( str ): ... <ul><li>Extiende str para agregar las funcionalidades necesarias para seguir las manchas a través de las operaciones </li></ul><ul><li>Sobreescribe ~30 métodos de str </li></ul>
  12. 12. Taint Flow a # manchada b # limpia c = a + b # ahora c está manchada a * 8 a[3:10] “ esta %s limpio?” % a a.upper() a.split(',')
  13. 13. Valores no confiables untrusted @untrusted def desde_el_exterior(): ... import web web.input = untrusted( web.input )
  14. 14. Valores no confiables untrusted_args class MyProtocol(LineOnlyReceiver): @untrusted_args([1]) def lineReceived(self, line): self.doSomething(line)
  15. 15. cleaner >>> texto_plano(&quot;Usar <b> negrita </b> &quot;) 'Usar negrita' >>> texto_plano(&quot;Sin manchas&quot;) 'Sin manchas' @cleaner(XSS) def texto_plano(input): ... texto_plano = cleaner(XSS) (texto_plano)
  16. 16. ssink eval = ssink(II)( eval ) @ssink(II) def suma(a,b) return eval('%s + %s' % (a,b))
  17. 17. import web db = web.database(dbn=&quot;sqlite&quot;, db=DBNAME) db.delete = ssink(SQLI)( db.delete ) db.select = ssink(SQLI)( db.select ) db.insert = ssink(SQLI)( db.insert ) ssink
  18. 18. Salida ============================================ Advertencia en la linea N del archivo X Valor manchado: M -------------------------------------------- if os.path.exists (f): wiki = open (f).read() doc = self.form(name, wiki) ==> return skeleton (M) ============================================
  19. 19. Algunas cosas más <ul><li>Batería de tests </li></ul><ul><li>reached </li></ul><ul><li>Abort? </li></ul><ul><li>@validator </li></ul><ul><li>tainted/taint </li></ul>
  20. 20. Invitación <ul><li>Problemas? </li></ul><ul><li>Pensar cómo seguimos </li></ul><ul><li>Intentar aplicarlo a distintos frameworks </li></ul><ul><li>Participar de la lista de correos </li></ul><ul><ul><li>http://groups.google.com/group/ python-taint </li></ul></ul>
  21. 21. ¿Preguntas?
  22. 22. ¡Muchas gracias! <ul><ul><li>Contacto: </li></ul></ul><ul><ul><li><jjconti@gmail.com> </li></ul></ul><ul><ul><li>Más información: </li></ul></ul><ul><ul><li>http://www.juanjoconti.com.ar/taint </li></ul></ul>

×