cultura y tecnología
135 meneos
1611 clics
La Casa Blanca pidió a la industria que dejara de programar en C/C++: ha tenido que matizar para no pasarse de frenada

La Casa Blanca pidió a la industria que dejara de programar en C/C++: ha tenido que matizar para no pasarse de frenada

En el mundo del desarrollo de software, las vulnerabilidades de memoria siguen siendo una de las principales amenazas para la seguridad informática. A pesar de los avances en la creación de lenguajes de programación más seguros, gran parte del software crítico aún depende de tecnologías con décadas de antigüedad, como C y C++.

| etiquetas: vulnerabilidades , c , c++ , industria , eeuu
Sin duda es mucho más seguro introducir gigas de overhead en cada llamada a una función que queramos hacer.
#1. Al final los sistemas informáticos y su software acabarán siendo "tan seguros" que no habrá quien pueda utilizarlos, o por temas de "requisitos" del propio hardware o por temas puramente de "seguridad".
#1 Ya veo que aquí se viene a comentar sin leer el artículo. En el artículo mencionan Rust, que no tiene gigas de overhead.
#1 hay infinidad de lenguajes compilables a código máquina. Pero es que además hoy en día existe Rust, sustituto directo de C/C++ y con un manejo de memoria totalmente seguro.
#22 Hasta que llegas a los bloques “unsafe”. Rust es tan inseguro como C++ moderno.
#25 Avísanos cuando puedas acotar en C++ las zonas inseguras, en lugar de asumir que todo el código es inseguro.
#29 yo uso el analizador estático de CLang y los workflows de GitHub para impedir que cualquier desarrollador mezcle código que no sigue las directrices, incluido usar malloc, new, delete, free…
#30
Ya, que solo usas el stack. Como los años 80.
```
* MyStruct bang() {
MyStruct ms[5];
* MyStruct result = &ms[4];
result ++;
return result;
}
```
Me sorprendería si el analizador estático puede detectar eso.
#31 1. En C++ moderno es perfectamente posible trabajar con el heap sin usar new, delete, malloc y free. De hecho, es lo más recomendable.
2. Ese código ni siquiera compila.
3. En el caso de que fuera sintácticamente correcto, es bastante probable que un analizador estático sea capaz de detectar el problema.
#31 Solo tener que leer ese trozo de código me da ganas de no volver a programar nunca mas. Vivan los nuevos leguajes !!!. A ver si pasamos página ya de una vez...
#31 new/delete/malloc/realloc/free y compañía deberían estar prohibidas en cualquier proyecto software que valore mínimamente la seguridad.

Pero eso no significa que solo puedas usar memoria de la pila. Tienes make_unique / make_shared que reservan de forma segura memoria heap y que liberan la memoria cuando ya no se necesita. Y por supuesto, todos los contenedores de la biblioteca estándar y de boost.

Respecto a tu ejemplo, cualquier analizador estático de medio pelo detecta ese error. Clang-tidy lo hace.
#62 Solo una cosa, supongo que eso depende mucho de los objetivos, para una aplicación de móvil igual puedes tener mucha sobrecarga de código para hacerlo seguro.

Si quieres exprimir el rendimiento de algo, es fácil que tengas que hacer "guarradas", y lo pongo entre comillas porque no creo que realmente estén bien o mal, simplemente son fuentes de problemas, pero lo considero malo en sí mismo.

Esto me recuerda a que supuestamente los chinos sacan mayor rendimiento a las tarjetas de nvidia porque pasan de su API.
#1 Según se mire es lo mismo que hacemos en diseños físicos, redundancia, margenes de seguridad, etc.
El año de la Casa Blanca en el escritorio.
#3 con Clinton fue el año de la Mancha Blanca bajo el escritorio
Suena parecido, pero no lo es
#3 Casa blanca oxidada (es una referencia a Rust, es que soy tan malo en esto...)
#10 #12 Muchos lenguajes de programación van ligados a escuelas o culturas de programación, que no es más que una línea de pensamiento y una forma de hacer las cosas a la hora de programar. Imponer estos cambios puede suponer tirar a la basura estos métodos y estos libros, como los libros viejos de informática, que si son de Windows se quedan obsoletos rápido, pero si son de lenguajes de programación, de sistemas operativos tipo Unix verás que muchas cosas que pone un libro de los noventa…   » ver todo el comentario
#13 Rust es muy suyo y se tienen que hace las cosas "a la manera de Rust" para evitarse lios.
#13 Pero, creo, siempre harán falta programadores que sean puedan tocar el bare metal y poder escribir drivers, kernels y demás con un lenguaje que no les ponga límites.
#15 Rust y probablemente cualquier lenguaje similar tiene un modo no seguro, así que si de verdad es necesario hacer algo a mano y controlar la ejecución del código al 100% lo pueden activar en ese trozo de código y pasarse a modo manual.
También el hardware cada vez es más potente y los compiladores más inteligentes (o por lo menos pueden probar diferentes métodos de optimización mucho más rápido que una persona y detectar cual es más rápido), así que al igual que ya no compensa programar…   » ver todo el comentario
#18 Bueno, yo soy de otra época, lo mismo tienes razón.
#18 Claro, siempre puedes usar unsafe { ... } y meter ahí lo que quieras.
#18 Es completamente falso eso de que no compensa programar en ensamblador.

No te darás cuenta, pero hay montones de código en ensamblador para acelerar ciertos algoritmos usando todos los recursos de las CPUs populares. Por ejemplo, ejecutar expresiones regulares, compresión, hashing, cifrado, cálculos matemáticos avanzados… busca un poco y verás que el ensamblador sigue ofreciendo una ventaja entre el 500% y el 10000%.

Incluso si utilizas Python o Java, por debajo hay decenas de miles de líneas de ensamblador para optimizar los algoritmos críticos.
#65 Asumía que se entendería que estoy hablando de programar todo un programa o sistema operativo en ensamblador, y no sólo partes críticas. Intenta portar Linux a tantos sistemas como en los que funciona si se hubiera hecho TODO en ensamblador de 386, por ejemplo. Imposiblemente costoso.
Como ejemplo de que algo parecía buena idea en su día, pero resultó no serlo tanto me gusta el emulador zsnes, programado íntegramente en ensamblador. En su día era lo mejor porque era rapidísimo y su…   » ver todo el comentario
#15 si claro, pero eso es un nicho concreto.
#10 En C++ hace eones que no hay que liberar memoria, los punteros inteligentes lo hacen automáticamente al acabar el scope.

Los señoros de la Casa Blanca no sé qué clase de asesores tendrán, pero vaya tela...
#21 Hay métodos más allá, como usar SPARK sobre ADA. Aunque, de hecho, no hay nada que impida que se haga algo así sobre Rust también.
#21 los punteros inteligentes tienen sus limitaciones. Por ejemplo con las referencias circulares se pueden formar un memory leak si usas únicamente smart pointers.

Pero el problema no es solo los memory leak, sino los accesos a memoria. En C++ puedes desbordar un array sin consecuencias, pudiendo acceder a basura o... Contenido de otra parte de la memoria. Y debido a eso, muchos proyectos han tenido agujeros de seguridad gigantescos.
#40 Sin consecuencias, no.

Es algo con lo que se debe tener cuidado, si.
#45 en principio no hay consecuencias si sobrepasas el array por poquito. Con algo de suerte podrás ver el contenido de otra variable y con menos suerte verás basura.
#40 #42 No entiendo muy bien a qué te refieres con lo de las referencias circulares. Si te refieres a que dos objetos comparten un mismo puntero, los shared pointers te lo solucionan.
#53 objeto A contiene una referencia a objeto B. Objeto B contiene una referencia a objeto A.

Eso es una referencia circular. Si usas shared pointers con una referencia circular, vas a tener un memory leak.

ChatGPT te puede generar un código para que lo simules si quieres.
#56 Se puede hacer perfectamente utilizando unique pointers y sin memory leaks. Lo que pasa es que hay que tener cuidado de que los dos objetos se destruyan a la vez, porque si no sería posible que el otro siguiera usando un puntero ya eliminado.
#57 eeeh... No, tienes exactamente el mismo problema con unique pointer en una referencia circular.

Es una lata poner código por aquí pero si con un print en los constructores y otro en los destructores se puede demostrar. Te he encontrado un ejemplo en stackoverflow:
stackoverflow.com/questions/77322229/how-do-unique-ptrs-prevent-the-cy
#60 Porque el problema se está enfocando mal. Los unique pointers tienen que estar fuera de A y de B, y luego cada uno tendrá una función para hacer el set del puntero del otro. A y B trabajarán internamente con punteros normales sin tener que preocuparse por liberar la memoria, y quien haya creado a A y B será quien los destruya realmente.
#21 Lo que no entiendo es porque hay que seguir con una tecnologia obsoleta cuando podemos usar mejores lenguajes. ¿que sentido tiene seguir usando C/C++, sino es para código legacy? ES como ponerme a usar Cobol porque si. Que seguro que han mejorado el Cobol actual para que cumpla con los estandares actuales, pero no tiene sentido.
Yo creo que muchos programadores han invertido tiempo y esfuerzo en aprender un lenguaje mastodontico y ahora no quieren tirar por la borda ese dinero/esfuerzo. Y como ya he dicho, tambien estan los projectos ya hechos en c/c++ que hay que mantenerlos... Para mi c/c++ es el nuevo cobol...
#54 Se sigue usando C/C++ porque no hay nada comparable en cuanto a rendimiento y compatibilidad. Intenta meterle un intérprete de Python a un microcontrolador y me lo cuentas.
#58 Para microcontroladores ya hay alternativas, por ejemplo:
eluaproject.net/
Que es en lua. La idea es querer. No se trata de que c/c++ sea mejor, se usa por inercia y comodidad. No hay nada inerente en el lenguaje c/c++ que lo haga especial para microcontroladores, solo que es lo que se ha usado siempre...
Parece que hay que meter a Rust por cojones en todos los proyectos porque permite "acceso seguro a la memoria"...
#4 Como comentario porque sí, lo que hace el compilador de Rust es generar automáticamente el código para liberar la memoria cuando pierde su "visibilidad".
En C lo tiene que hacer el programador.
#10 En C++ eso ya existe desde hace un porrón de años.
#20 Pero el rendimiento sufre mucho, no sé si con Rust pasará lo mismo.

Yo trabajé programando en C una red neuronal (hace 25 años, antes de que se pusiera de moda), la diferencia entre hacerlo en C o C++ era abismal (probamos otros lenguajes, pero nada podía competir con C). Optimizamos las multiplicaciones de matrices y la gestión de memoria todo lo posible, pero lo que dio mejor resultado fue cambiar la gestión de multitarea del propio Linux, quitándole todas las protecciones para que fuera mucho más rápido, conseguimos que el entrenamiento pasara de 2 meses a 2 semanas.
#70 Yo me refiero a los punteros inteligentes, que tienen un impacto en el rendimiento casi nulo.

Los shared pointers tienen un pequeño impacto porque tienen que realizar el conteo de referencias cada vez que se crean o destruyen, pero los unique pointers son gratis, no afectan al rendimiento para nada.
#10 En C++ moderno lo hace unique_ptr, shared_ptr o cualquiera de los containers de la biblioteca estándar. Hay analizadores estáticos de código para comprobar que no se usa el sistema de manejo de memoria de C y el resultado es tan seguro como Rust.
#26 los unique_ptr y shared_ptr son una solución incompleta al problema de liberar la memoria. Son incompletas porque no soportan las referencias circulares.

Fuera de liberar la memoria. Tampoco soluconan el desbordamiento en vectores/arrays.
#42 si necesitas referencias circulares, hay clases para representar grafos o listas circulares. También tienes weak_ptr. En el peor de los casos, tienes un memory leak, que puede conducir a una denegación de servicio, pero no expone datos ni permite el control remoto.
#59 pues ahí tienes ejemplos donde no sirven. Y las referencias circulares las puedes crear sin darte cuenta.

Estar pendiente de si necesitas shared_ppinter o weak_ptr es una fuente de errores. Es mucho menos propenso a errores tener un garbage collector que solucione esto por ti.
#61 Rust tiene el mismo problema.
#42 Soluciona el problema de la seguridad. Un memory leak no es un problema de seguridad por si solo, un programa que solo tenga errores de memory leak no es inseguro. Aunque es susceptible a ataques de denegación de servicio, no revela datos ni permite tomar el control de la máquina.

Si intentas escribir pasado el final de un std::vector o std::array tienes una bonita excepción si activas el address sanitizer (-fsanitize=address tanto en g++ como en clang).

Además clang-tidy detecta muchos de esos casos antes de mezclar el cambio en el repositorio Git.
#10 No es cierto. En C++ solo tienes que liberar tu la memoria que tu reservas. Normalmente los objetos se crean en el Stack
#44 Pues claro que la que tú reservas. ¿Has visto los otros comentarios sobre los smart pointers?
#44 He acabado por caer. Cuando he dicho C, estás interpretando "C y C++". No solamente tú. Qué curioso.
#47 Es que es de lo que habla la mayoría...

Yo siempre he mantenido que Rust en todo caso puede suplir a C, pero no a C++
#48 ¿Qué le ves a C++ que no tenga Rust?

Lo único que le veo yo es que puedes usarlo con menos restricciones, lo que lo hace preferible para videojuegos, pero Rust da mayor seguridad, lo que lo hace preferible para OS y cosas críiticas.
#4 Porque lo de programar bien es pedir mucho :palm:
#4: El acceso seguro: un procesador que no sabes cómo está hecho, una memoria RAM que tampoco sabes cómo es, una placa madre que no sabes si no tiene algún chip demasiado cotilla, una interfaz de red que no sabes si todo lo que hace lo conoce el procesador... A mí me da la risa ya con todo esto de la seguridad. ¿Para qué, si luego te lo llenan de puertas traseras?
#23 E imponiendo estándares corporativos para que el desarrollo y la dirección de ese software lo decida una corporación y sus intereses económicos.
#4 Yo lo estoy aprendiendo. Es horrible {0x1f602}
Lo aclaro por si acaso, esto viene de la anterior administración.
" gran parte del software crítico aún depende de tecnologías con décadas de antigüedad, como C y C++."

Estos aun no se enteraron de Cobol en los bancos jjj
#34 cobol a nivel de transacciones sigue siendo una roca.

Luego ves que necesitas un popurrí de tecnologías de diferentes compañías para conseguir lo mismo, pero cada una con su ciclo de deprecación, sus licencias e incompatibilidades que sobre el papel no sale a cuenta.

Copilot no sé si es compatible, pero generar rutinas de cobol a golpe de prompt sería otra nueva juventud para este vetusto lenguaje.
Venía con el cuchillo preparado debido al titular clickbait, pero lo que dice el artículo es bastante lógico y racional. Tampoco sé hasta qué punto depende CISA de la Casa Blanca, pero es como si en titular dijeran "Moncloa pide..." como si lo hubiera dicho el mismo presidente y luego resulta que los que han hecho el informe son científicos del CSIC
Lo próximo será pedir que dejen de usar cuchillos y que corten la cebolla con tenedor, pero con cuidado que pincha..
No es ninguna sorpresa. Como hay mucha gente qualificada en C++ algunos se puenen a buscar otro lenguage porque [meter excusa aqui]. Yo creo que el nombre lo dice todo, algunos tienen la mente oxidada (rusted). La de empresas que han cascaron intentando cambiar technologia es larga. Un gobierno no es una startup y no estamos hablando de websites ni sitios sociales. Esto seran los que en su momento lo habrian querido hacer en J++
"los Estados Unidos se han tomado la programación es una cuestión de seguridad nacional: hace un año, la Oficina del Director Nacional de Ciberseguridad (ONCD) de los EE.UU. emitía un informe instando a los programadores a migrar hacia 'lenguajes de programación seguros en memoria'"

Hace un año.
¿Por qué genbeta saca un artículo ahora, qué ha ocurrido?
Portada en MNM.
.....
Dentro de 30 años pedirá programadores de C/C++ para mantener código antiguo que en su día no se portó a otros lenguajes seguros. Será el nuevo Cobol
Sería más sencillo que una IA analizara el código y marcara/arreglara los potenciales riesgos, que al final son dos o tres casos:
Punteros sin inicializar, asignación a variables de cadenas sin comprobar la longitud y conversión de tipos de datos inseguros.
#33 Y con que programas la IA? :-)

Creo que ademas ya hay lo que dices, creo que se llamaba SONAR
#35 Eso que digo lo hace la IA más tonta del mercado a día de hoy
Rust es el grafeno de los lenguajes de programación. Hasta en la sopa. :troll:
Uno de los proponentes lo explica claro en este video: www.youtube.com/watch?v=RXJKdh1KZ0w&t=17s
Rust es seguro intrínsecamente, porque no necesita acceder a la memoria. Lo creais o no, la IA integrada se inventa todos los datos, no necesita consultar posiciones de memoria.
#6 Ah, ahora sé en qué están programados esos aparatos que venden para medir el azucar en la sangre sin pinchar.

menéame