The OWASP Foundationhttp://www.owasp.org
Aportación de la OWASP a la comunidadinternacional.Seguridad en las relaciones de confianza.
Vicente Aguilera DíazOWASP Spain Chapter LeaderCISA, CISSP, ITILF, CEH Instructor, OPSA, [email protected]
28 marzo 2008
2OWASP
¿Quién soy?
Vicente Aguilera DíazCISA, CISSP, ITILF, CEH Instructor, OPSA, OPSTOWASP Spain chapter leaderSocio co-fundador de Internet Security AuditorsMiembro del consejo técnico asesor de RedSeguridad6 años focalizado en seguridad en aplicaciones WebColaborador de OWASP Testing Guide v2, WASC Threat
Classification v2Artículos y conferencias sobre seguridad en aplicacionesVulnerabilidades en Oracle, SquirrelMail, Hastymail,
ISMail, GMail, ...
3OWASP
Agenda
Aportación de la OWASP a la comunidad internacionalCapítulo español de la OWASPSeguridad en las relaciones de confianza¿Preguntas?
5OWASP
OWASP
El Open Web Application Seguridad Project (OWASP)está dedicado a la búsqueda y la lucha contra lascausas de software inseguro. La OWASP Foundationes una organización sin ánimo de lucro que proporcionala infraestructura y apoya nuestro trabajo.
La participación es gratuita y abierta para todosAquí todo es gratuito y de código abiertoObjetivos: crear herramientas, documentación y
estándares relacionados con la seguridad en aplicaciones7685 miembros y 114 capítulos locales en el mundo
6OWASP
OWASP
Todos los miembros son voluntariosComunicación: MediaWiki (www.owasp.org)Proporciona recursos gratuitos a la comunidad:
publicaciones, artículos, estándares, aplicaciones de testy aprendizaje, capítulos locales, listas de correo yconferencias
Modelo de licencia: Open Source y licencias comercialespara miembros
7OWASP
OWASP
El estilo OWASP: “open”GratuitoConsensuadoLibre de utilizar y modificar IndependienteCompartiendo conocimientosÁmplio público y participación
8OWASP
OWASP
Causas de software inseguroVulnerabilidadesDesarrolladoresEstructura organizativa, procesos de desarrollo, tecnología Incremento de conectividad y complejidadRequerimientos legales
9OWASP
OWASP
Aportaciones
Top 10
WebGoat
Conferences
Site Generator
Building Guide
CLASP
AJAX
.NET, Java
Testing Guide
WebScarab
Validation
Certification
Chapters
Wiki Portal
Mailing list
Blogs
... y muchos otros proyectos!http://www.owasp.org/index.php/Category:OWASP_Project
10OWASP
OWASP
AportacionesProyectos (Herramientas)
OWASP WebGoat ProjectOWASP WebScarab ProjectOWASP AntiSamy ProjectOWASP CAL9000 ProjectOWASP CSRFGuard ProjectOWASP DirBuster ProjectOWASP Encoding ProjectOWASP LAPSE ProjectOWASP Live CD Education ProjectOWASP Live CD ProjectOWASP .NET Research
11OWASP
OWASP
AportacionesProyectos (Herramientas)
OWASP Pantera Web Assessment Studio ProjectOWASP Report GeneratorOWASP Site GeneratorOWASP SQLiX ProjectOWASP TigerOWASP WeBekci ProjectOWASP WSFuzzer ProjectOWASP CSRFTester ProjectOWASP Insecure Web App ProjectOWASP Interceptor ProjectOWASP JBroFuzz Project
12OWASP
OWASP
AportacionesProyectos (Herramientas)
OWASP Sprajax ProjectOWASP Stinger ProjectOWASP Web 2.0 Project
25 PROYECTOS SOBRE HERRAMIENTAS
13OWASP
OWASP
AportacionesProyectos (Documentación)
OWASP AppSec FAQ ProjectOWASP Guide ProjectOWASP Legal ProjectOWASP Testing GuideOWASP Top Ten ProjectOWASP CLASP ProjectOWASP Code Review ProjectOWASP Tools ProjectOWASP AJAX Security GuideOWASP Application Security Assessment Standards ProjectOWASP Application Security Requirements
14OWASP
OWASP
AportacionesProyectos (Documentación)
OWASP Application Security Metrics ProjectOWASP Career Development ProjectOWASP Certification Criteria ProjectOWASP Certification ProjectOWASP Communications ProjectOWASP Honeycomb ProjectOWASP Java ProjectOWASP Logging GuideOWASP PHP ProjectOWASP Scholastic Application Security Assessment ProjectOWASP Validation Project
15OWASP
OWASP
AportacionesProyectos (Documentación)
OWASP WASS GuideOWASP Web Application Security Put Into PracticeOWASP XML Security Gateway Evaluation CriteriaOWASP Education ProjectOWASP on The Move ProjectOWASP Fuzzing Code Database
28 PROYECTOS DE DOCUMENTACIÓN
16OWASP
OWASP
Han adoptado el OWASP Top Ten...
La Federal Trade Commission (EEUU) recomiendaencarecidamente que todas las empresas usen el OWASPTon Ten y se aseguren de que sus partners hagan lomismo.
La Defense Information Systems Agency (EEUU) haenumerado el OWASP Top Ten como las mejores prácticasa utilizar como parte del DOD Information TechnologySecurity Certification and Accreditation (C&A) Process(DITSCAP).
17OWASP
OWASP
Han adoptado el OWASP Top Ten...Un gran número de organizaciones internacionales
... y muchas otras en todo el mundo!
18OWASP
OWASP
Han adoptado el OWASP Top Ten...El estándar Payment Card Industry (PCI) ha adoptado
el OWASP Top Ten, y requiere (entre otros aspectos) quetodos los comercios realicen una auditoría de código delas aplicaciones que desarrollan.PCI Requirement 6.5 points towards the OWASP project as a
source of secure coding guidance.PA-DSS (Payment Application Data Security Standard)
http://ww.pcisecuritystandards.org
19OWASP
OWASP
Referencias a nuestros proyectos...Gran número de libros:
http://books.google.com/books?as_q=owasp
20OWASP
OWASP
A nivel españolEntidades financierasUniversidadesEmpresas de desarrolloEmpresas de seguridad
21OWASP
OWASP
Principales proyectosDocumentación:
A Guide to Building Secure Web Applications and Web ServicesTesting GuideTop Ten
Herramientas:WebScarabWebGoat
22OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Es un libro: 310 páginasGratuitoMuchos colaboradoresAplicaciones y Web ServicesEjemplos en J2EE, PHP, ASP.NETExhaustivoEvoluciona (1ª versión en 2002)
http://www.owasp.org/index.php/Category:OWASP_Guide_Project
23OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Orientado a:Desarrolladores: guía para implementar mecanismos de
seguridad y evitar vulnerabilidadesJefes de Proyecto: identificar actividades a realizar (modelado
de amenazas, revisión de código, pentest, etc.)Equipos de Seguridad: estructurar las pruebas, conocer
mecanismos de seguridad y soluciones
24OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
27 capítulos:
1. About the Open Web Application Security Project 2. Introduction 3. What are Web Applications? 4. Policy Frameworks 5. Secure coding principles 6. Threat risk modeling 7. Handling e-commerce payments 8. Phishing 9. Web Services 10. AJAX and other “rich” interface technologies 11. Authentication 12. Authorization 13. Session Management 14. Data Validation
15. Interpreter injection 16. Canoncalization, locale and unicode 17. Error handling, auditing and logging 18. File system 19. Distributed computing 20. Buffer overflows 21. Administrative interfaces 22. Cryptography 23. Configuration 24. Software quality assurance 25. Deployment 26. Maintenance 27. GNU free documentation license
25OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Cubre las áreas clave de la seguridad en aplicaciones:AutenticaciónAutorizaciónGestión de sesionesValidación de datosCanonicalizaciónGestión de errores, log y auditoríaConfiguración
26OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Para cada aspecto tratado:ObjetivosTeoríaBuenas prácticasCómo determinar si somos vulnerablesCómo protegernos
27OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Autenticación:Técnicas habituales de autenticación WebFuerza brutaCAPTCHAAutenticación fuerteAutenticación positivaSelección de nombres de usuarioCambios de contraseñaLogout ...
28OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Autorización:Principio de mínimo privilegioRutinas centralizadas de autorizaciónMatriz de autorizaciónControl de acceso sobre recursos protegidosProtección del acceso a recursos estáticosRe-autorización en acciones de alto valor ...
29OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Gestión de sesiones:Exposición de variables de sesiónTokens de sesiónDetección de ataques de fuerza brutaDebilidad de los algoritmos criptográficosRegeneración de tokens de sesiónSecuestro de sesiónAtaques a la validación de sesiones ...
30OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Validación de datos:Donde incluir validacionesDonde incluir verificaciones de integridadDonde incluir validaciones de las reglas de negocioEstrategias de validación de datosPrevención de la alteración de datosCodificación de URL y HTML ...
31OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Canonicalización:Formatos de entradaUNICODEDoble (o N-) codificaciónHTTP Request Smuggling ...
32OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Gestión de errores, log y auditoría:Mensajes de error detalladosLoggingRuídoCubrir pistasFalsas alarmasPistas de auditoríaGestión de errores ...
33OWASP
OWASP
A Guide to Building Secure Web Applications andWeb Services
Configuración:Contraseñas por defectoCadenas de conexión segurasTransmisión por red seguraCifrado de datosSeguridad en la base de datos ...
34OWASP
OWASP
Testing GuideEs un libro: 270 páginasGratuitoMuchos colaboradoresAborda todo el SDLCExhaustivoEvoluciona (1ª versión en 2004)Traducido a español!
http://www.owasp.org/index.php/Category:OWASP_Testing_Project
35OWASP
OWASP
Testing GuidePruebas de seguridad en aplicaciones
Si los coches se construyeran como las aplicaciones... Los tests de seguridad únicamente asumirían impactos frontales No existirían tests para verificar la estabilidad en maniobras de
emergencias No existirían tests para verificar la efectividad de los frenos No existirían tests para verificar la resistencia al robo ...
Denis Verdon, Head of Information Security (Fidelity National Financial)OWASP AppSec 2004 Conference (New York)
36OWASP
OWASP
Testing GuidePruebas de seguridad en aplicaciones
"Me alegro de que los desarrolladores desoftware no construyan coches”Eoin Keary, líder del proyecto OWASP Code Review
38OWASP
OWASP
Testing GuideContenido
1. Portada2. Introducción3. El entorno de pruebas OWASP4. Pruebas de intrusión en aplicaciones Web5. Redacción de informes: valorar el riesgo realApéndice A: Herramientas de comprobaciónApéndice B: Lectura recomendadaApéndice C: Vectores de fuzzing
39OWASP
OWASP
Testing GuideEl entorno de pruebas OWASPFase 1: Antes de comenzar el desarrollo
Verificar que el SDLC propuesto es adecuado eincorpora la capa de seguridad
Verificar que la política y estándares son conocidos porlos miembros del equipo
Desarrollar métricas
40OWASP
OWASP
Testing GuideEl entorno de pruebas OWASPFase 2: Durante definición y diseño
Revisar requerimientos de seguridadRevisión del diseño y arquitecturaCrear y revisar modelos de amenazas
41OWASP
OWASP
Testing GuideEl entorno de pruebas OWASPFase 3: Durante el desarrollo
Inspección de códigoRevisión de código
42OWASP
OWASP
Testing GuideEl entorno de pruebas OWASPFase 4: Durante el despliegue
Pentest de aplicacionesVerificar la gestión de configuraciones
Fase 5: Mantenimiento y OperaciónRevisiones de la gestión operativaVerificaciones periódicasAsegurar la verificación de cambios
43OWASP
OWASP
Testing GuidePruebas de intrusión en aplicaciones Web¿Qué es una prueba de intrusión en aplicaciones Web?
Método de evaluación de la seguridad mediante la simulación deun ataque
¿Qué es una vulnerabilidad?Debilidad en un activo que hace posible una amenaza
Nuestra aproximación a la hora de escribir esta guía:AbiertaColaborativa
44OWASP
OWASP
Testing GuidePruebas de intrusión en aplicaciones WebHemos dividido el conjunto de pruebas en 8 subcategorías
(para un total de 48 controles):Recopilación de informaciónComprobación de la lógica de negocioPruebas de autenticaciónPruebas de gestión de sesionesPruebas de validación de datosPruebas de denegación de servicioPruebas de servicios WebPruebas de AJAX
46OWASP
OWASP
Testing GuidePruebas de intrusión en aplicaciones WebPlantilla para las pruebas
Breve resumen Descripción en “lenguaje natural” qué se espera probar
Descripción Breve descripción del problema
Pruebas de caja negra y ejemploPruebas de caja gris y ejemploReferencias
Whitepapers Herramientas
47OWASP
OWASP
Top TenEs un documento: 35 páginasGratuitoMuchos colaboradoresLas 10 vulnerabilidades más críticasEvoluciona y se adapta
http://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
48OWASP
OWASP
Top TenEnumera y describe las 10 vulnerabilidades más críticasAporta recomendacionesCrecimiento en su aceptación
Federal Trade Commission (US Gov) US Defense Information Systems Agency VISA (Cardholder Information Security Program)
Fuerte empuje para ser considerado un estándar
49OWASP
OWASP
Top TenTop Ten actual (2007)
A1. Cross Site Scripting (XSS)A2. Injection FlawsA3. Malicious File ExecutionA4. Insecure Direct Object ReferenceA5. Cross Site Request Forgery (CSRF)A6. Information Leakage and Improper Error HandlingA7. Broken Authentication & Session ManagementA8. Insecure Cryptographic StorageA9. Insecure CommunicationsA10. Failure to Restrict URL Access
50OWASP
OWASP
Top TenPlantilla para cada vulnerabilidad
Entornos afectadosVulnerabilidadVerificación de seguridadProtecciónEjemplosReferencias
51OWASP
OWASP
WebScarabEs una herramienta desarrollada en JavaPermite realizar pruebas de seguridad en aplicaciones y
servicios WebAnaliza tráfico HTTP y HTTPsMúltiples usos
Desarrollador: tareas de debug y testingAuditor de seguridad: identificación de vulnerabilidades
http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project
52OWASP
OWASP
WebScarab¿Qué puede hacer?
Proxy – observa tráfico entre el navegador y el servidor,incluyendo la capacidad de modificar la información transmitida
Spider – identifica nuevas URLs en cada recurso visitadoSessionID Analysis – genera y analiza cookies para determinar
como de predecibles resultan los tokens de sesiónFuzzer – realiza sustitución automatizada de valores en los
parámetros con el objetivo de detectar validaciones deficientesFragment Analysis – extrae scripts y comentarios del código HTML
... y mucho más!
54OWASP
OWASP
WebGoatEs una aplicación web, intencionadamente inseguraDesarrollada en Java, basada en Tomcat y JDK 1.5Diseñada para aprender lecciones de seguridad en
aplicaciones webEn cada lección, los usuarios deben demostrar su
conocimiento sobre un problema de seguridad, explotandouna vulnerabilidad real en la aplicación WebGoat
http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project
55OWASP
OWASP
WebGoatAplicación de aprendizajeHerramienta educativa para aprender sobre seguridad en
aplicaciones webEntorno para analizar herramientas de seguridad
56OWASP
OWASP
WebGoat¿Qué puedes aprender?
Cross Site ScriptingSQL Injection (Blind, numeric, etc.)Manipulación de parámetros y campos de formularioCookies de sesiónControl de accesoWeb ServicesFugas de información
... y mucho más a lo largo de 30 lecciones!
59OWASP
OWASP-Spain
http://www.owasp.org/index.php/SpainFundado en diciembre de 2005 por Vicente
AguileraUbicado en Barcelona176 miembros (cuarto capítulo europeo en
número de miembros)Uno de los 50 recursos más visitados de la
OWASP
Patrocinador del capítulo
60OWASP
OWASP-Spain
ReglasGratuito y abierto para todos Idioma: preferiblemente en españolNo a las presentaciones comercialesRespeto sobre las distintas opiniones1 CPE por cada hora de asistencia a nuestros OWASP
Spain chapter meetings
61OWASP
OWASP-Spain
¿Qué ofrecemos?Eventos semestralesLista de correo local:
https://lists.owasp.org/mailman/listinfo/owasp-spainPresentacionesForo abierto de discusiónPunto de encuentro de profesionales de la seguridadDifusión del conocimiento en España sobre seguridad en
aplicaciones Web¿Proyectos locales? ¡Necesitamos iniciativas!
62OWASP
OWASP-Spain
En un futuro próximo...Colaboraciones con otras asociaciones/entidadesDesarrollo de proyectos con iniciativas localesEventos en distintas ciudades españolasEventos con mayores actividadesNuevos contenidos en la Web del capítulo: nuevas
secciones, herramientas, videos, etc.
63OWASP
OWASP-Spain
OWASP Spain chapter meetingNuevo evento: octubre 2008Ubicación: por decidir... (¿alguna sugerencia?)Programa habitual: breve introducción a la OWASP,
panel con cuatro ponentes sobre distintas temáticas... ycoffee-break! ;-)
Ponentes y temáticas: aceptamos propuestas!140 asistentes en nuestro último evento (marzo 2008)
64OWASP
OWASP-Spain
Sugerencias...Mantente actualizado: suscríbete a nuestra lista de correoEnvía tus cuestiones sobre aplicaciones WebParticipa en las discusionesColabora en proyectos existentesTen iniciativa: propuesta de nuevos proyectosConoce a profesionales de la seguridad y amplía tus
conocimientos: ¡asiste a nuestros meetings!
67OWASP
Relaciones de confianza
La aplicación Web no está aislada:Relaciones con:
Sistema operativoServidores
Base de datos Autenticación Aplicación FTP Correo ...
Usuarios!
Problemas de inyección
68OWASP
Relaciones de confianza
Ataques de inyecciónSQL InjectionLDAP InjectionSSI Injection IMAP/SMTP InjectionXML InjectionXPath InjectionOS Command InjectionUser Agent InjectionCode Injection ...
69OWASP
Relaciones de confianza
Ataques de inyección¿Cuando puede ocurrir?
Cuando datos facilitados por el usuario son enviados a unintérprete (o invocan otros procesos) como parte de un comandoo consulta
ResultadoEl intérprete/proceso ejecuta comandos no deseados, controlados
por el atacante
Causa del problemaValidación deficiente de los datos de entrada/salida
70OWASP
Relaciones de confianza
Comprensión global de las amenazas
Consciencia
Entendimiento
Solución conociendo la dimensión
Si se desconoce la dimensiónes posible que no se implemente la solución
72OWASP
Relaciones de confianza
Relación con BBDD: SQL InjectionSQL Injection
Alteración de la sentencia SQL que se ejecuta contra la base dedatos mediante la manipulación de parámetros de entrada a laaplicación
Ejemplo típico
SQLQuery = "SELECT Username FROM Users WHERE Username = '"& strUsername & "' AND Password = '" & strPassword & "'"strAuthCheck = GetQueryResult(SQLQuery)
73OWASP
Relaciones de confianza
Relación con BBDD: SQL InjectionEjemplo no tan típico...
Aprovechar un buffer overflow en una función de Oracle paraejecutar código arbitrario:
Ejemplo propuesto por Esteban Martínez Fayó en su presentación “Advanced SQL Injection in Oracle databases”
74OWASP
Relaciones de confianza
Relación con BBDD: SQL InjectionDistintos tipos de inyección
SQL Injection “normal”SQL Injection “a ciegas”SQL Injection “numérico”PL/SQL Injection
Clasificación InbandOut-of-band Inferential
¡Hay que entender la problemática de todos ellos!
75OWASP
Relaciones de confianza
Relación con BBDD: SQL InjectionRecomendaciones
Validación exhaustiva de todas las entradas Filtro positivo (siempre que sea posible)
Securización de la base de datosUso de APIs parametrizadasNo utilizar simples funciones de escapeMínimo privilegio
En las conexiones con la BBDD u otros componentes
Limitar el tamaño de las entradas No sólo en el cliente!
Gestión robusta de errores Evitar mensajes excesivamente detallados y fugas de información
76OWASP
Relaciones de confianza
Relación con MailServers: IMAP/SMTP InjectionEjemplo 2: IMAP/SMTP Injection
Alteración de comandos IMAP/SMTP que se ejecutan contra losservidores de correo mediante la manipulación de parámetros deentrada a la aplicación
77OWASP
Relaciones de confianza
Relación con MailServers: IMAP/SMTP InjectionSe basa en la inyección de la secuencia CRLF
%0d%0a, \r\n
Ataques posiblesExplotación de vulnerabilidades en el protocolo IMAP/SMTPEvadir restricciones a nivel de aplicaciónProvocar fugas de informaciónSPAM¿otros?
Las posibilidades dependen del tipo y ámbito de lainyección y del servidor de correo analizado
78OWASP
Relaciones de confianza
Relación con MailServers: IMAP/SMTP InjectionEjemplo
http://<webmail>/read_email.php?message_id=4791
message_id=4791 BODY[HEADER]%0d%0aV100CAPABILITY%0d%0aV101 FETCH 4791
FETCH 4791 BODY[HEADER]
???? FETCH 4791 BODY[HEADER]V100 CAPABILITYV101 FETCH 4791 BODY[HEADER]
79OWASP
Relaciones de confianza
Relación con MailServers: IMAP/SMTP InjectionEjemplo práctico: evasión de CAPTCHA
El CAPTCHA evitaría ataquesautomáticos contra lascontraseñas de los usuarios...
80OWASP
Relaciones de confianza
Relación con MailServers: IMAP/SMTP InjectionEjemplo práctico: evasión de CAPTCHA
Supongamos que un usuario utiliza las siguientes credenciales: username = victima Password = pwdok
Supongamos que un atacante desea ejecutar un passwordcracking utilizando el siguiente diccionario de contraseñas: pwderror1, pwderror2, pwdok, pwderror3
Supongamos que el esquema de autenticación es vulnerable aIMAP Injection (en el campo “Password”)
81OWASP
Relaciones de confianza
Relación con MailServers: IMAP/SMTP InjectionAtaque
http://<webmail>/src/login.jsp?login=victim&password=%0d%0aZ900 LOGIN victim pwderror1%0d%0aZ910 LOGIN victimpwderror2%0d%0aZ920 LOGIN victim pwdok%0d%0aZ930LOGIN victim pwderror3
C: Z900 LOGIN victim pwderror1S: Z900 NO Login failed: authentication failureC: Z910 LOGIN victim pwderror2S: Z910 NO Login failed: authentication failureC: Z920 LOGIN victim pwdokS: Z920 OK User logged inC: Z930 LOGIN victim pwderror3S: Z930 BAD Already logged in
82OWASP
Relaciones de confianza
Relación con MailServers: IMAP/SMTP InjectionRecomendaciones
Validación exhaustiva de todas las entradas Filtro positivo (siempre que sea posible)
No permitir la secuencia CRLFUtilizar librerías segurasSecurización de los servidores de correoLimitar el tamaño de las entradas
No sólo en el cliente!
Gestión robusta de errores Evitar mensajes excesivamente detallados y fugas de información
83OWASP
REFERENCIAS
OWASP http://www.owasp.org
Capítulo español de la OWASP http://www.owasp.org/index.php/Spain
OWASP Guide http://www.owasp.org/index.php/Category:OWASP_Guide_Project
OWASP Testing Guide http://www.owasp.org/index.php/Category:OWASP_Testing_Project
OWASP Top Ten http://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
WebScarab http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project
84OWASP
REFERENCIAS
WebGoat http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project
Advanced SQL Injection in Oracle databases http://www.blackhat.com/presentations/bh-usa-05/bh-us-05-fayo.pdf
Capturing and Exploiting Hidden Mail Servers http://www.webappsec.org/projects/articles/121106.pdf