El mundo de la programación es competitivo, ya que está en constante crecimiento. Tener solo…

Los seis principios de la producción de código seguro
Dependiendo de cómo elija definir un «programa», la historia de la programación se remonta a 1843 con el conjunto de instrucciones escritas de Ada Lovelace para el motor analítico de Charles Babbage (que, aunque nunca se probó en su vida, más tarde se demostró que era programáticamente válido ).
Sin embargo, durante gran parte de esa larga historia, el concepto de seguridad estuvo notablemente ausente del mundo del programador.
La razón de esto era simple: la ciberseguridad en los primeros días requería poco más que controlar físicamente el acceso al hardware y evitar que un actor malintencionado se pusiera frente a una terminal.
No fue hasta principios de la década de 1970, cuando las redes de computadoras hicieron posible acceder a los sistemas sin tener que sentarse frente a ellos, que todo cambió.
De repente, escribir código seguro se convirtió en una parte esencial para mantener los datos y los sistemas a salvo de amenazas externas. A principios de la década de 1980, programadores como John McAfee, Andreas Lüning y Kai Figge comenzaron a escribir programas especialmente diseñados para detectar y eliminar software malicioso.
Nació el antivirus.
Eso desencadenó la guerra del gato y el ratón librada entre los piratas informáticos y los expertos en seguridad de la información que continúa hasta el día de hoy.
Para los programadores modernos, todo eso se traduce en una necesidad primordial de poner la seguridad en el centro de todo lo que hacemos. Desde los detalles de nuestro código hasta los procesos que usamos para verificar nuestro trabajo, la seguridad debe permanecer en la cima de nuestras mentes.
Y no se trata solo de que sea algo agradable. El creciente tsunami de violaciones de datos que ocurre cada año está comenzando a ser más costoso. El año pasado, una brecha promedio le costó a la compañía víctima $ 8.19 millones en los EE. UU.
Con etiquetas de precio como esas, ¿cuánto tiempo crees que pasará antes de que los programadores y desarrolladores comiencen a ser considerados personalmente responsables por los daños? Cuando considera el hecho de que los problemas de responsabilidad relacionados con el software siguen siendo turbios en el mejor de los casos, ese día puede estar acercándose rápidamente.
Luego, está la cuestión de la reputación del programador individual, que podría verse dañada irreparablemente al estar asociada con un incidente de seguridad. Ese riesgo por sí solo debería proporcionar una amplia motivación para que todos los profesionales del desarrollo de software se sienten y se den cuenta.
La buena noticia es que no es muy difícil aprender a crear código seguro. Dado que los costos potenciales son los que son, sería una tontería que cualquier programador esperara un momento más para hacerlo.
Para ayudar a los programadores y desarrolladores de software a mantenerse enfocados en la seguridad, aquí están los seis principios centrales de la creación de código seguro.
Incorpore la seguridad a la planificación de proyectos
Lo primero y más importante que pueden hacer los programadores para asegurarse de que se adhieren a las prácticas de codificación segura es ser proactivos en lugar de reactivos en su enfoque.
Eso significa que es esencial tomar una variedad de pasos centrados en la seguridad antes de comenzar a trabajar en un nuevo proyecto.
Según el Proyecto de seguridad de aplicaciones web abiertas (OWACP), esos pasos deben incluir lo siguiente:
- Identificar los requisitos de seguridad para el software que se está desarrollando por adelantado
- Elija e implemente un marco de desarrollo seguro
- Enumerar y codificar estándares de codificación segura para que los sigan los desarrolladores.
- Brindar capacitación en codificación segura a los miembros del equipo que la necesiten.
- Cree controles de seguridad periódicos en el ciclo de desarrollo, incluido el tiempo para reescribir si se encuentran problemas
Al colocar la seguridad al frente y al centro del proceso de desarrollo, es mucho más fácil asegurarse de que el producto resultante no tenga fallas explotables o errores evidentes que puedan afectarlo a lo largo de su ciclo de vida.
Es importante darse cuenta de que es mucho más fácil detectar y solucionar problemas de seguridad en desarrollo que intentar solucionarlos retroactivamente después. Solo hay que mirar las luchas de Microsoft con el sistema operativo Windows, donde el código de 20 años puede volver a acechar incluso las versiones actuales del sistema operativo.
Para los desarrolladores de software que no están familiarizados con la configuración de marcos de desarrollo seguros, se puede encontrar un recurso excelente en el libro Core Software Security: Security at the Source del Dr. James Ransome y Anmol Misra, que proporciona una hoja de ruta perfecta sobre cómo incorporar todos los aspectos del proceso de desarrollo de software.
Cubre casi todo lo que necesita saber para producir software seguro, independientemente de su propósito o plataforma.
Utilice la validación de entrada centralizada y el saneamiento de datos
Independientemente del lenguaje que se utilice para codificar una determinada pieza de software, existe un tipo particular de explotación contra el que los programadores deben protegerse: Entrada de datos mal formada o maliciosa.
Es un problema tan grande que forma el núcleo de muchas de las vulnerabilidades de seguridad de software más comunes, incluidos muchos ataques comunes de desbordamiento de búfer, secuencias de comandos entre sitios y ataques de inyección SQL.
Esto hace que la validación de entrada y el saneamiento de datos sean una prioridad para los desarrolladores que buscan crear código seguro.
Resulta que existen algunas convenciones básicas que los programadores pueden y deben cumplir para defenderse de ese tipo de problemas de seguridad. Incluyen:
- Usar consultas de bases de datos parametrizadas
- Uso de REGEX para filtrar entradas en busca de caracteres inseguros o inesperados
- Asegurarse de que los datos estén codificados de una manera que permita el manejo adecuado de caracteres especiales
Aunque no es una lista exhaustiva, el simple hecho de utilizar las técnicas anteriores puede evitar innumerables dolores de cabeza en materia de seguridad.
Sin embargo, es importante que los desarrolladores recuerden que deben implementar su código de validación de entrada de forma centralizada para que pueda actualizarse según sea necesario durante la vida útil del software. No hacerlo puede hacer que la aplicación de parches sea una tarea casi imposible, lo que socavará la seguridad del código con el tiempo.
Siga el principio de privilegio mínimo
En los círculos de seguridad de la red, el principio de privilegio mínimo (POLP) constituye el núcleo de los esfuerzos para controlar el acceso de los usuarios a los sistemas, software y datos.
Para los programadores, aplicarlo a la forma en que funciona su software también es un buen consejo.
En la práctica, esto significa que el software debe limitar el acceso externo en la mayor medida posible, así como limitar el acceso a los datos de los procesos en ejecución a solo lo que se necesita para completar una tarea.
Con demasiada frecuencia, los desarrolladores escriben código que sería seguro por sí solo, pero ignora la realidad del uso en el mundo real.
Por ejemplo, existen innumerables aplicaciones web que no comprueban si se están ejecutando con privilegios elevados o innecesarios. Si bien es fácil descartar eso como un problema de seguridad del usuario, es una idea mucho mejor para los programadores crear comprobaciones de cordura y controles de acceso directamente en sus aplicaciones.
De esa manera, el software puede actuar para protegerse cuando se encuentra en un entorno de producción, solucionando las vulnerabilidades introducidas por el usuario de forma predeterminada.
La conclusión es que los programadores pueden optar por dejar la seguridad general de sus aplicaciones a discreción del usuario, pero ¿por qué deberían hacerlo?
Utilice el cifrado para proteger las comunicaciones y los datos.
Además de asegurarse de que todo el código se ejecute al nivel de privilegio más bajo necesario, también es necesario asegurarse de que todas las funciones de comunicación y datos dentro del software utilicen cifrado.
Muchas de las vulnerabilidades de software habituales que se utilizan en la actualidad se basan en la interceptación del tráfico de datos desde las aplicaciones para obtener acceso privilegiado o centrarse en extraer datos del propio software.
Hacer del cifrado una función central de una pieza de software dificulta esos intentos y hace que cualquier exfiltración de datos exitosa sea inútil para el atacante.
Esto se duplica para proteger cualquier credencial codificada o incrustada dentro del software.
Aunque el mejor enfoque es evitarlos por completo, a veces no es práctico hacerlo. Eso hace que el cifrado sea una necesidad absoluta, ya que es la forma más confiable de asegurarse de que un atacante no pueda acceder fácilmente a esas credenciales para obtener un acceso inadecuado al software.
En un mundo donde incluso los usuarios promedio de Internet aprovechan el cifrado para proteger sus datos, ya es hora de que los programadores comiencen a hacer lo mismo de forma natural.
Cree documentación y comentarios estandarizados
Aunque es una tarea que la mayoría de los desarrolladores tratan de evitar a toda costa, atender la documentación de un proyecto es una parte esencial del desarrollo de código seguro.
Esto también incluye la estructura y el contenido de los comentarios que quedan dentro del código mismo, así como la convención de nomenclatura utilizada para las funciones del código. Es importante porque una aplicación típica puede pasar por varias iteraciones, con varios programadores realizando cambios en el código.
Cuando eso ocurre, es fundamental que quienquiera que realice los cambios comprenda por qué las piezas de código críticas se escriben de la forma en que están y que los nombres de las funciones aclaren cuál era su propósito original.
Esto es algo que todo programador profesional debería comprender.
Todos nos hemos encontrado con problemas al revisar el código de otra persona y nos hemos enfrentado a la tarea de trabajar hacia atrás para descubrir cómo y por qué las cosas funcionan como lo hacen.
Sin embargo, desde una perspectiva de codificación segura, es un desastre que está por ocurrir. Mantener la seguridad exige coherencia de extremo a extremo dentro del código, no solo mantener la funcionalidad.
Si un futuro desarrollador realiza cambios que no interrumpen la funcionalidad del programa, es probable que sigan adelante y asuman que los cambios son aceptables incluso si no han captado las ramificaciones de seguridad de lo que han hecho.
Si la documentación del software y los comentarios internos dejan en claro cómo una función puede afectar la seguridad de la aplicación, es mucho menos probable que suceda.
Piense como un actor malicioso
Por último, pero no menos importante, cualquier programador que quiera crear un código seguro debe comprender a qué se enfrenta.
Eso significa aprender a pensar como el enemigo.
No es suficiente comprender los conceptos de seguridad de programación por sí solo. Los programadores deben tomarse el tiempo para aprender los trucos y técnicas que los actores malintencionados utilizarán para perseguir su software. De esa manera, tendrán los antecedentes adecuados para revisar su propio trabajo con la mentalidad de un atacante decidido y ver que no quede piedra sin remover.
Un buen lugar para comenzar es con el Manual de hackers de aplicaciones web: Cómo encontrar y explotar fallas de seguridad, de Dafydd Stuttard y Marcus Pinto. Aunque es un poco antiguo para los estándares de desarrollo, el hecho de que la mayoría del material cubierto aún sea relevante hace que sea necesario leerlo.
Contiene explicaciones paso a paso de muchas técnicas de ataque de software comunes, así como desgloses detallados de las medidas defensivas que utilizan los desarrolladores para protegerse contra ellas. Es una herramienta invaluable para ayudar a los programadores a comprender el panorama de la seguridad desde ambos lados de la ecuación.
Para agregar un conocimiento más actualizado sobre el tema, Ethical Hacking: Best Tips and Tricks of Ethical Hacking de Elijah Lewis constituye una excelente lectura complementaria. Toca algunas de las vulnerabilidades de software y plataformas actuales más comunes, así como las herramientas de piratería que se utilizan ampliamente en la actualidad. Es exactamente lo que los programadores necesitan saber para crear medidas defensivas efectivas en su trabajo.
Sin este conocimiento, escribir código seguro sigue siendo un ejercicio teórico más que práctico.
Seguro desde cero
Al ceñirse a estos seis principios de producción de código seguro, los programadores pueden hacer su parte para eliminar muchas de las fallas de seguridad más comunes en el software actual.
Ese sería un paso fundamental para avanzar hacia un mundo en el que la seguridad se centre en la prevención en lugar de la mitigación de las amenazas externas.
Puede que no sea fácil, pero, de nuevo, nada que valga la pena hacer lo es. Al final, esa es la única manera de adelantarse al problema y finalmente superar los desafíos de seguridad que todo software ha enfrentado en la era de Internet.