¿Deberíamos dejar de ejecutar servidores C en la red abierta?

Gran pregunta y gran concepto.

Me encanta: declarar que C está roto y renunciar a él de una vez por todas y pasar a una nueva plataforma de desarrollo más segura.

Y luego comencé a pensar a dónde iríamos para evitar completamente C / C ++

Todos los populares lenguajes interpretados de Safe están escritos en C, incluidos Java, Python, Php, Perl, Ruby y C #. Estos lenguajes generalmente se ejecutan sobre Apache o IIS, ambos escritos en C.
Los servidores web se ejecutan sobre BSD, Unix, Linux o Windows, nuevamente escritos en C.
Hablan con mi base de datos que está escrita en C.

Parece que en todas partes los componentes críticos están escritos en C y no hay forma de evitarlo.

En conclusión, puedo deshacerme de mis propios problemas en C cambiando mis aplicaciones a un lenguaje moderno y seguro (lo que hice hace muchos años) pero aún estaré rodeado de aplicaciones críticas con nuevas vulnerabilidades y parches todo el tiempo.

Realmente es una cuestión de la calidad de su proceso para escribir aplicaciones. Solía ​​trabajar para una tienda CMMI Nivel 4 escribiendo servicios de red en C a fines de los ochenta en un laboratorio de investigación. En ese momento solo había unos cientos de tiendas de nivel cuatro en el país (y solo una tienda de nivel 5 en el mundo). Puede escribir código rockstar que sea completamente seguro en lenguaje C o ensamblador y será más seguro que cualquier cosa que esté escrita en un lenguaje interpretado, ya que tiene el control completo hasta el metal de todo lo que sucede. Sin embargo, depende completamente de cómo estructura, prueba y q / a su código y todo su SDLC si será seguro. Debe tener pruebas automatizadas para detectar infracciones comunes integradas en su proceso de compilación incluso antes de verificar su código. Puede escribir malos servicios de red en casi cualquier idioma, pero un proceso de software disciplinado y hacerlo correctamente antes de que salga por la puerta hace una gran diferencia. El software OSS depende del enfoque de “muchos ojos”, que eventualmente descubrirá cualquier error, pero no le da a nadie un alto nivel de seguridad a corto plazo.

NO

Deberíamos tener mejores políticas y procedimientos de verificación de errores de software, y sobre todo pruebas de control de calidad que prueben “lo inesperado”.

Si eres diligente y solo aceptas lo que crees que deberías recibir, se pueden evitar casi todos los exploits. Esto implica examinar a mano lo que parece un volumen de código increíblemente grande, desde el código integrado en los dispositivos de interfaz a través de la pila de protocolos y el núcleo hasta la aplicación, pero se puede hacer. Se ha hecho.

Es doloroso hacerlo repetidamente.

El proyecto OpenBSD hizo grandes avances en los aspectos de “plataforma” de eso, las personalidades de algunos involucrados lo convierten en una elección impopular. Aún así, es una mejora gigante sobre cualquier otra cosa en este momento.

La clave en seguridad es minimizar el área de superficie de ataque. No ejecute código que no necesita ejecutar. No ejecute código que tenga características que no necesita absolutamente. No confíes en nada que nunca haya sido examinado por completo. Resista el impulso de agregar “una cosa más”.

C es el lenguaje de facto del núcleo de “Internet” por una muy buena razón: nada funciona mejor. Está tan cerca de escribir en metal desnudo como puede obtener y aún así mantener una capa de abstracción razonable. Personalmente prefiero estar un poco más cerca del metal desnudo (BCPL, que lamentablemente está casi extinto), pero todavía he escrito literalmente cientos de miles de líneas de C, casi todas en modo kernel o en metal sin procesar como sistemas integrados.

También he escrito grandes volúmenes de código en docenas de lenguajes de alto nivel: Smalltalk, Lisp, ADA, PL / I, COBOL, casi cualquier cosa que pueda nombrar. Puedo imaginar formas en que podría ser posible escribir sistemas de control en tiempo real en algunos de ellos, pero que no se ejecuten en los niveles de rendimiento requeridos.

C simplemente gana WINS para este tipo de cosas. Si el rendimiento es tu juego, es la única opción lógica.

Dicho esto, necesitamos herramientas mucho mejores para que sea posible asegurarnos de que el código está haciendo lo que está destinado a hacer, no hace cosas que no están destinadas y rechaza cualquier entrada inesperada. Pero por muy valioso que sea, no hay un mercado comercial para eso, por lo que no sucede.

Y debido a que un QA realmente bueno cuesta dinero y toma casi tanto tiempo como escribir el código en primer lugar, eso también se acorta.

Así que tenemos un código malo ejecutando aplicaciones críticas.

Eso no es culpa de C, es culpa del modelo económico. Y cambiar a cualquier lenguaje de programación que tengas en mente NO va a cambiar eso.