Roger A. Grimes

Hackear al hacker


Скачать книгу

el SDL, podemos tener menos (por el mismo número de líneas de código).

      NOTA El Dr. Daniel J. Bernstein (https://es.wikipedia.org/wiki/Daniel_J._Bernstein) es un profesor de universidad que promueve y proporciona un código increíblemente seguro. Es el autor de un gran número de programas informáticos gratuitos y muy utilizados, como dbjdns y qmail, que tienen una cifra muy baja de errores. Incluso suele pagar de su bolsillo a localizadores de errores. Defiende avergonzar públicamente a los proveedores haciendo públicos sus errores antes de que tengan la oportunidad de analizar y parchear sus productos.

      Lenguajes de programación más seguros

      Unos programas más seguros no pueden ser una realidad sin un lenguaje de programación más seguro. Durante años, la mayoría de lenguajes de programación se han esforzado por crear versiones predeterminadas más seguras. Estos lenguajes intentan reducir o eliminar las causas comunes de las explotaciones. Cabe decir que han tenido bastante éxito y que los programas escritos con estos lenguajes son significativamente más difíciles de explotar que los que han sido creados mediante lenguajes menos seguros.

      Análisis del programa y el código

      Una vez que un programa ha sido escrito, debe ser siempre analizado en busca de errores conocidos y reconocibles. Esta tarea puede llevarse a cabo mediante análisis humanos o herramientas de software. El análisis humano suele ser el menos eficiente, detecta pocos errores por hora, pero puede localizar errores de explotación significativos que las herramientas no están codificadas para encontrar. Las herramientas de detección de errores normalmente se clasifican en analizadores estáticos y fuzzers. Los analizadores estáticos miran el código fuente (o los programas) en busca de errores de software conocidos en la codificación. Los fuzzers introducen datos inesperados en busca de vulnerabilidades en los programas en ejecución. Muchos de los poco conocidos cazadores de errores, incluyendo el Dr. Charlie Miller, descrito en el Capítulo 36, han confiado en el fuzzing para muchos de sus descubrimientos.

      Sistemas operativos más seguros

      La mayoría de los sistemas operativos no solo han sido codificados por programadores formados en el SDL que utilizan por defecto lenguajes de programación más seguros, sino que también incluyen defensas integradas contra los vectores de explotación más comunes. La mayoría de los sistemas operativos actuales más populares incluyen defensas de memoria especialmente diseñadas y protegen las áreas más críticas del sistema operativo. Algunos también incluyen software para evitar el desbordamiento de búfer, software antimalware y cortafuegos; todo ello ayuda a limitar errores explotables o sus consecuentes daños.

      Protecciones de terceros y complementos del fabricante

      Existen miles de programas capaces de defender un sistema informático contra vulnerabilidades de software desconocidas previamente con un mínimo de éxito. Algunos los ofrece el fabricante de forma gratuita o de pago y otros proceden de terceros. Los programas que prometen la detección y detención de nuevas explotaciones son muy comunes y, aunque no son nunca perfectos, pueden reducir significativamente el riesgo de nuevas amenazas. Uno de mis tipos favoritos de software de defensa son los denominados de control de aplicación o lista blanca. Estos programas no detienen la explotación inicial, sino que evitan o complican que los hackers o programas maliciosos provoquen daños adicionales.

      El software perfecto no erradicará todos los males

      Ninguna defensa puede superar un software que ha sido codificado de forma más segura con menos errores explotables desde el principio. Sin embargo, el software perfecto y sin errores es imposible y no acabaría con todo el hackeo aunque esto fuera posible. Desafortunadamente, las vulnerabilidades de software no son nuestro único problema. Los programas troyanos funcionan simplemente haciendo que el usuario ejecute un programa malicioso. Muchos hackers y programas maliciosos explotan las capacidades inherentes y, por otro lado, legítimas de datos, lenguajes de programación y otros componentes para hacer cosas malas. Y la ingeniería social puede llevar a cabo lo que el software no es capaz de hacer.

      Aún así, nadie discute que unos programas más seguros no sean de gran ayuda. En los Capítulos 7 y 8 se presentan dos expertos que han dedicado sus vidas a perfeccionar software. El Capítulo 7 presenta a Michael Howard, quien popularizó prácticas de codificación más seguras, y el Capítulo 8 se centra en Gary McGraw, uno de los mejores buscadores de errores que existen.

      7

      Perfil: Michael Howard

      Michael Howard es contagioso. Es un gran educador, un ponente enérgico y, después de aproximadamente 20 años, sigue tan apasionado de su especialización en seguridad informática, la codificación segura, como lo era en sus inicios. Resulta difícil estar con él más de unos minutos sin desear hacer el mundo más seguro en cada línea de código. Fue conocido a nivel mundial como coautor del libro Writing Secure Code (Escribir código seguro) junto a David LeBlanc, así como por haber sido una parte importante de la razón por la cual Microsoft se dedica ampliamente a escribir código más seguro. Howard, originario de Nueva Zelanda pero establecido actualmente en Austin, Texas, ha colaborado en la redacción de muchos libros sobre la escritura de código más seguro y es un bloguero activo.

      NOTA David LeBlanc, coautor con Howard en Writing Secure Code, es otro especialista en seguridad con visión de futuro. Es el responsable de que Microsoft Office sea significativamente más seguro y ha creado un modelo de seguridad para navegadores que han acabado utilizando Google, Adobe y Microsoft.

      Le pregunté a Howard cómo empezó en esto de la seguridad informática. Su respuesta fue la siguiente: «Estaba trabajando en las primeras versiones de Windows NT para Microsoft. Me dedicaba a tareas de bajo nivel como control de acceso, criptografía y GINA personalizadas (interfaces gráficas que solían ser la manera de iniciar sesión en Microsoft Windows y otros proveedores de autenticación). Esto realmente me permitió empezar a pensar en la seguridad como una característica más. Sobre el año 2000, estaba claro que las características de seguridad no hacen a un producto seguro, por lo que decidí que me tenía que centrar en funcionalidades seguras, que son una disciplina diferente».

      Le pregunté cómo empezó el SDL en Microsoft. Me dijo: «Con el tiempo, varias prácticas relacionadas con la seguridad aprendidas por los equipos de SQL Server, Office, Windows y .NET Framework y otros evolucionaron hacia el ciclo de vida de desarrollo de seguridad (SDL). El SDL ayudó a popularizar el código seguro y el movimiento de diseño seguro y actualmente es la fuerza que dirige la mayor parte de las empresas que mejor protegen su software ».

      Le pregunté si el SDL fue una pequeña mejora de algo que había leído o si lo había construido de la nada sin ninguna referencia previa. Me contestó: «Todos construimos sobre el trabajo de otros, pero la mayor parte del SDL surgió de acciones y aprendizaje. Lo que funciona se mantiene y lo que no funciona o no es completamente práctico se tira. A veces me pregunto si alguno de los modelos académicos ha sido probado en un entorno de producción alguna vez, con plazos, requisitos de desempeño, tiempo para sacarlo al mercado, aspectos económicos, requisitos de compatibilidad anteriores, etc.

      »En ese momento, había una enorme escuela de pensamiento que creía que si se puede aumentar la calidad general del código también se aumentará directamente la seguridad del código. Pero yo aún no he visto ninguna evidencia empírica de ello. Puedes hacer un código SQL funcional que pase todas las pruebas de funcionalidad, pero podría estar plagado de vulnerabilidades de inyección de SQL. Si nunca has aprendido qué es la vulnerabilidad de inyección de SQL, todo cuanto verás será un código perfecto, que hace lo que se supone que tiene que hacer. Un sistema seguro solo hace lo que se supone