Oxidando a la ciberseguridad

Oxidando a la ciberseguridad

Tiempo estimado de lectura: 6 minutos


Esta conferencia magistral pertenece al Módulo 4 "Lenguajes de programación orientados a ciberseguridad" de C1b3rWall Academy 2021. El objetivo es concienciar acerca de los inconvenientes que supone utilizar un lenguaje de programación no seguro y exponer alternativas seguras.

Por qué los lenguajes clásicos no son seguros

Hablando de lenguajes de bajo nivel, uno seguro es aquel que, en tiempo de compilación, se encarga de verificar que el programador no ha cometido ningún error en cuanto al manejo de memoria. En lenguajes de alto nivel la memoria es administrada automáticamente por recolectores de basura, entonces... ¿si utilizamos lenguajes de alto nivel estamos creando programas seguros?

No. Dos razones:

  • En primer lugar, por problemas en el diseño del programa, errores en la implementación o casuísticas no contempladas. Estas situaciones son difíciles de eliminar, por lo que generalmente se necesita una auditoría que verifique que el programa o aplicación es seguro.
  • En segundo lugar, un lenguaje de alto nivel está escrito en otro de bajo nivel, y normalmente este de bajo de nivel no asegura que el programa tenga una correcta manipulación de memoria. Esto se puede evitar.

La mayoría de los lenguajes de alto nivel están escritos en C o en otro lenguaje que, a su vez, está escrito en C (C++, Java, Ruby, Python, PHP, C#, Perl...). C no ha conseguido aún analizar el programa y asegurar que no va a haber problemas en el manejo de memoria.

Ejemplo de lenguaje seguro: Rust

Rust es un lenguaje de bajo nivel que compila a código máquina como C. ¿Cómo consigue entonces Rust asegurar un manejo de memoria seguro? La respuesta es sencilla: con un método llamado "borrow checker". Este método mantiene el seguimiento de cada variable y hace las comprobaciones que haría un experto en ciberseguridad para comprobar si hay errores en memoria como "use after free", "stack overflow", "double free", "heap overflow" o "null pointers dereferences". Todas estas comprobacciones las hace en tiempo de compilación, siendo muy complicado que un programa compile con fallas de manejo de memoria. 

Hay que tener en cuenta que la curva de aprendizaje en Rust es muy elevada, cuesta mucho aprender a coger maestría, aunque, una vez hecho esto, la productividad se dispara. El ecosistema es muy nuevo, faltan paquetes testeados y maduros en cuanto a tiempo y testing, además, los tiempos de compilación son elevados (debido en parte al borrow checker). 

Hay varias empresas y servicios que utilizan Rust: Discord, Amazon, Facebook, Cloudflare, Microsoft, NPM, Figma, Coursera, Dropbox... 

¿Son importantes los lenguajes seguros?

, ya que cuando tienes que escribir una pieza de código en un lenguaje de bajo nivel pierdes valor de negocio y tiempo si tienes que solucionar los fallos. Muchas empresas se están dando cuenta de que la seguridad no está solo en la superficie, sino en las bases del producto.

Si tenemos un know-how suficiente, escribir código de bajo nivel nos puede beneficiar en cuanto a rendimiento, pero si no es así, resulta mejor optar por lenguajes seguros.


¿Todavía no formas parte de C1b3rWall Academy? El contenido es gratuito, únete a otras 30.000 personas desde este enlace.

                   

Si te interesa este tema, puedes consultar la información y cursar el Máster en Ciberseguridad o ver la oferta de másteres desde aquí.


Ponente: Bruno Chenoll Matienzo

Bruno es graduado en Ingeniería Informático por la Universidad de Granada. Participó en competiciones Capture the Flag y plataformas de hacking como HackTheBox. Además, fue Red Teamer para el banco Santander y actualmente es desarrollador backend con Python y PostgreSQL.