Upload
amancio-albarran
View
114
Download
0
Embed Size (px)
Citation preview
Análisis Estático de Código para Detección de Vulnerabilidades en Aplicaciones Web
Pablo E. (Fidel) Martínez López, [email protected]
“The study of type systems – and of programming languages form a type-theoretical perspective – has become an energetic field with major applications in software engineering, language design, high-performance compiler implementation, and security.”
Benjamin C. PierceTypes and Programming Languages
Resumen de temas
Proyecto: “Seguridad en aplicaciones web” Problema: Detectando vulnerabilidades La técnica:
Sistemas de tipos estáticosSistemas Hindley-Milner con restriccionesGrammar Based Analysis
Propuesta: GBA y vulnerabilidades Conclusiones
Seguridad en Aplicaciones Web
Seguridad en Aplicaciones Web
Proyecto de investigación conjunta entreLIFIA, Universidad Nacional de La PlataCORE Security Technologies S.A.
FinanciaciónANR de la Agencia de Investigaciones
Científicas y TecnológicasProyecto NA 080/04 “Plataforma híbrida de
seguridad para protección de aplicaciones WEB”
Seguridad en Aplicaciones Web
Equipo6 investigadores por el LIFIA
2 senior 4 juniors
4 investigadores por CORE (más personal de apoyo)
Duración del proyecto1 año
Seguridad en Aplicaciones Web
EtapasConocimiento de los equiposFamiliarización con problemas y técnicasAnálisis de posibles soluciones y elección de
2 alternativas Basadas en análisis estático de código
Diseño e implementación de las elegidas Ejecución Simbólica de código JAVA Grammar-Based Analysis extendido
(sistema de tipos estático especializado)
Detectando Vulnerabilidades
Detectando Vulnerabilidades
¿Qué es una vulnerabilidad en una aplicación web?Un punto donde un atacante puede usar el
sistema en forma no especificada, e.g. tener acceso a información confidencial realizar operaciones privilegiadas, etc.
El proyecto se concentró en inyección de código (source-code injection)
Detectando Vulnerabilidades
Inyección de CódigoSe leen parámetros ingresados por un
usuario en una interface web (como strings)Se componen con otros strings para armar
códigoSe ejecuta el código producido de esta
manera ¿Cómo sabemos que lo ingresado es
siempre lo esperado?
Detectando Vulnerabilidades
Ejemplo
Si el atacante provee en $email
¡se produce un ataque!
get($email); get($pincode);$query = “SELECT * FROM users WHERE email=′”
. $email . “′ AND pincode=” . $pincode;$result = mysql_query($query);
“juan@host′ OR ′0′=′1”
Detectando Vulnerabilidades
Ejemplo (cont.)Notar el uso de las comillas simplesEl atacante puede introducir operadores
lógicos donde sólo se esperaba un email…Query producido:
¡Ignora el PIN!
“SELECT * FROM users WHERE email=′juan@host′
OR ′0′=′1′ AND pincode=123”;
Detectando Vulnerabilidades
Ejemplo (cont.)Otra posibilidad es que provea en $pincode
Query producido:
¡Obtiene todas las filas de la tabla!
“SELECT * FROM users WHERE email=′juan@host′ AND pincode=123
OR 0=0”;
“123 OR 0=0”
Sistemas de Tipos Estáticos
Sistemas de Tipos Estáticos
¿Qué son?herramientas para determinar propiedades de
programas sin ejecutarlosasocian información a cada parte de un
programase basan en el texto del programa, teniendo
en cuenta la semántica
Sistemas de Tipos Estáticos
Características generalesestáticos
no ejecutan el programadecidibles (en general)
hay un algoritmo que calcula la propiedad ALTERNATIVA: tipos dependientes
no decidibles asistentes para la construcción de programas correctos
pueden requerir anotaciones del usuario o no diferentes estilos de programación
Sistemas de Tipos Estáticos
Estilos de diseño del sistemaA la Curry (pej. PHP)
términos sin tipo semántica sobre ellos el sistema de tipo que elimina (ciertos) programas
erróneosA la Church (pej. JAVA)
términos tipados semántica basada en los tipos
Sistemas de Tipos Estáticos
Presentaciones del sistema implícita (términos sin anotaciones de tipos)explícita (términos con anotaciones de tipos)
Históricamente los implícitos se presentan a la Curry los explícitos se presentan a la Church
Es común mezclar estilo y presentación
Sistemas de Tipos Estáticos
Sistemas a la Curry lenguaje de términossemántica sobre este lenguaje lenguaje de tiposrelación entre términos y tipos
Propiedades fundamentalesun término con tipo no tiene ciertos erroresel tipo describe propiedades del término
Sistemas de Tipos Estáticos
Método para especificar la relación juicios(esquemas de) reglas de derivación árboles de derivación
Propiedad básica juicio válido árbol de derivación para él
Sistemas de Tipos Estáticos
Características de un sistema dado1. relaciones funcionales (o no)
a cada término le corresponde un único tipo
2. relaciones dirigidas por sintaxis (o no) hay una regla por cada construcción del lenguaje
ImplicacionesPara 1. los algoritmos son casi trivialesPara 2. los algoritmos son recursivos
Sistemas de Tipos Estáticos
¿Y si el sistema no es funcional o dirigido por sintaxis?Diseñamos uno equivalente que lo sea¡Debe demostrarse en qué sentido son
equivalentes!Típicamente:
relación entre diferentes tipos para un término, establecer la relación entre la
salida del algoritmo y sus tipos
Sistemas de Tipos Estáticos
Importanciaventajas para los programadores
chequeo de errores comunes documentación rudimentaria posibilidades de optimización al compilar
desarrollos posteriores basados en ellos Types & Effects Type Specialization Grammar Based Analysis
Sistema Hindley-Milner
Sistema Hindley-Milner
Para lenguajes funcionalesSistema de tipado implícito
Tipos básicos Tipos compuestos (¡funciones!) Polimorfismo paramétrico
Cuantificación universal de variables de tipo en el nivel más externo, e.g.
id :: a.aa map :: a.b.(ab)[a] [b]id x = x map f [] = []
map f (x:xs) = f x : map f xs
Sistema Hindley-Milner
Las reglas fundamentales son 4:
Funciones Aplicación
Generalización Instanciación
e :: 21e’ :: 2
e e’ :: 1
, x :: 2e ::
1
x.e :: 2 1
e :: FV()
e :: .
e :: . e :: [:=’]
Hindley-Milner con Restricciones
Diversas extensiones usan restriccionesRegistrosOverloading (polimorfismo ad-hoc)Subtyping
Todas estas extensiones desarrollanTeorías de restricciones similaresAlgoritmos de inferencia similares
Hindley-Milner con Restricciones
Sistema HM(X) Marco general para estas extensionesEnriquece el sistema HM con un parámetro X
X es un álgebra (cilíndrica) de restricciones(con un operador de proyección)
Ejemplos X = álgebra de Herbrand Hindley-Milner X = sistema de subtipos HM con subtipos Otros: overloading, records, BTA, GBA, etc.
Hindley-Milner con Restricciones
Los juicios tienen restricciones La regla de generalización es ahora
Simplificaciones posiblesDependen del álgebra XE.g.
CD, e :: FV(C)FV()
Ca.D, e :: .D
.< < se puede simplificar a <
Hindley-Milner con Restricciones
El trabajo se divide en 2 partes: Inferencia de tipos
Colectar restricciones Similar a dar una especificación del problema
Resolución de restricciones Similar a implementar una solución que satisfaga la
especificación El algoritmo de resolución depende de qué
restricciones se usan
Hindley-Milner con Restricciones
Gráficamente: Parte 1 Parte 2
Inferencia de tipos
programa
Tipo (con restricciones)
Resoluciónde restricciones
restricciones
Solución
Grammar-Based Analysis
Grammar-Based Analysis
MotivaciónStrings usados en contextos inapropiados
(e.g. sustituyendo a tipos en lenguajes de scripts) Descriptores de estilos HTML y XML Expresiones Xpath Sentencias SQL
Grammar-Based Analysis
¿Cuál es el problema?¡El mantenimiento!Los strings con semántica
Pueden conducir a errores en runtime Constituyen puntos de ataque para crackers No son prevenidos por los sistemas de tipos
tradicionales Son difíciles de testear exahaustivamente
Grammar-Based Analysis
Peter Thiemann desarrolló una instancia de HM(X)
Propósito original de Thiemann:Aliviar mantenimiento y debugging de
programas existentesNO un framework para construir programas
Se lo puede adaptar para detección de vulnerabilidades en aplicaciones web
Grammar-Based Analysis
Enfoque:Se enriquece el sistema de tipos
Con tipos String() tq es una variable de lenguaje Con un álgebra de restricciones que predican sobre
dichas variablesLa inferencia provee las restricciones que
satisfacen los strings producidos por el programaLa resolución es paramétrica respecto de un
lenguaje dado
Grammar-Based Analysis
Resolución de restricciones en GBASe provee una gramática de referencia GSe determina cuáles de las asignaciones de los
no-terminales de G a variables de lenguaje satisfacen las restricciones
Estos no-terminales aproximan la forma de los strings producidos
Grammar-Based Analysis
Las restricciones tienen la forma:
C ::= true -- siempre verdadera
| -- relación de subtipado
| r -- relación de derivación
| CC -- conjunción de restricciones
r ::= | | a | r++r -- similar a producciones
-- (siendo a un terminal)
Grammar-Based Analysis
Algunas reglas de tipado
y de simplificación
e1 :: String(1) e2 :: String(2)
e1++e2 :: 12.(1++2)String()
w :: .(w)String()
12
String(1)String(2)
Grammar-Based Analysis
GBA gráficamente: Parte 1 Parte 2
Inferenciade tipos
programa
Tipo (con restricciones
sobre ’s)
Resoluciónde restricciones
Restricciones sobre ‘s
Asignaciones válidas de no-terminales de G a ‘s
Gramática de referencia G
Grammar-Based Analysis
Ejemplo (en Haskell)
¿Produce render código HTML válido?¡El tipo en Haskell no lo indica!
data ForkTree = Tip Int | Fork ForkTree ForkTreerender :: ForkTree -> Stringrender t = case t of
Tip s -> int2string s Fork l r -> “<ul><li>” ++ render l ++ “</li>”
++ “<li>” ++ render r ++ “</li></ul>”
Grammar-Based Analysis
Ejemplo (cont.) Asumiendo que el tipo GBA de int2string es
Con GBA, el tipo asignado para cada t fijo es
C2 = (<ul><li>++++</li><li>++++</li></ul>1)
render t :: 12.(C2C1)String()
C1 = (0++21 1++21 … 1 12)
int2string :: 12.(C1) Int String(1)
Grammar-Based Analysis
Pero… ¿render t produce código HTML? ¡Usamos resolución de restricciones!
Se usa la gramática GHTML de HTML como gramática de referencia
Se realiza la resolución (cuyo mecanismo es similar al parsing)
Si todas las variables de lenguaje pueden asignarse a algún no-terminal de GHTML, entonces la respuesta es sí. Si no, es no.
Grammar-Based Analysis
Algunas deficiencias¿Por qué tener una gramática de referencia?
Decidir cuáles lenguajes satisfacen las restricciones es indecidible en general
Las gramáticas de referencia tienen que ser orientadas a caracteres (y no a tokens)
Es preferible que sean ambiguasAún no manejan operaciones de
deconstrucción de strings
GBA y Vulnerabilidades
GBA y Vulnerabilidades
¿Cómo usar GBA para detectar injections?Enriquecer el lenguaje
Para poder escribir programas con vulnerabilidades ¡Implica extender la teoría!
Luego, se usan dos copias de los terminales Terminales seguros – utilizados en el programa Terminales inseguros – provistos por el atacante
Y se provee una gramática GV por cada tipo de vulnerabilidad V
GBA y Vulnerabilidades
Terminales seguros e inseguros – ejemplo
“SELECT * FROM users WHERE email=′juan@host′
OR ′0′=′1′ AND pincode=123”;
“SELECT * FROM users WHERE email=′juan@host′ AND pincode=123
OR 0=0”;
Terminalesseguros Terminales
inseguros
GBA y Vulnerabilidades
¿Cómo usar GBA para detectar esto? (2)La inferencia provee información sobre cómo
se forman los strings usados para queries u otros tipos de ejecuciones no seguras
La resolución contra GV establece si el programa tiene la vulnerabilidad V
¡Podría extenderse para extraer instancias de ataques a partir de la gramática!
GBA y Vulnerabilidades
VentajasFramework único, no dependiente del
conjunto de vulnerabilidadesPosibilidad de armar instancias de ataques
DesventajasLa extensión a lenguajes orientados a objetos
(e.g. JAVA) es complejaAún en etapa experimental
Conclusiones y Bibliografía
Conclusiones
Los sistemas de tipos son una herramienta muy versátil para diversos propósitos
La investigación en este área está en auge y hay interés creciente en estos sistemas
La industria y la academia pueden colaborar con éxitoRequiere resignificar muchos códigos
implícitos de comunicación…
Bibliografía
Benjamin C. Pierce. Types & Programming Languages. The MIT Press, 2002
John C. Reynolds. Theories of Programming Languages. Cambridge University Press, 1998.
Pablo E. Martínez López. Static type systems: from specification to implementation. Chapter 11 of Verification, Validation and Testing in Software Engeneering. Aristides Dasso and Ana Funes (eds.). Idea Group Publishing, 2005.
Bibliografía
M. Odersky, M. Sulzmann, and M. Wehr. Type inference with constrained types. Theory and Practice of Object Systems, 5(1):35-55, 1999.
Peter Thiemann. Grammar-based analysis of string expressions. In Proceedings of the 2005 ACM SIGPLAN international workshop on Types in languages design and implementation, pp. 59-70. ACM Press, 2005.