¿Los compiladores generalmente se validan para garantizar que no destruyan la máquina del usuario cuando compilan algún código inteligente?
En general, son demasiado complejos y a menudo se escriben usando idiomas en los que no es práctico probar esta propiedad.
Posiblemente no con esta intención específica, pero al menos se conoce la noción de compiladores de pruebas fuzz ( LLVM ahora puede probar fuzz por sí mismo ). Las pruebas destinadas a detectar datos que bloquean el compilador debido a errores del compilador también tenderán a generar fallas explotables.
Naturalmente, tendrías que investigar si el compilador específico en el que estás interesado es probado o probado por fuzz para encontrar posibles bloqueos, y si los errores que se encuentran son realmente corregidos. La regla general es que si hay accidentes que son peores que las excepciones no recuperadas de la memoria, entonces, sin investigar más los detalles, debe considerar una posibilidad seria de que puedan aprovecharse para explotar.
¿Qué tan seguro es compilar un fragmento de código de un extraño?
Desafortunadamente, cuánto dura un trozo de cuerda. En principio, el correo electrónico podría explotar su cliente de correo, o el código fuente podría explotar su editor de texto o cppcheck, incluso antes de que llegue a su compilador. La sugerencia de Sebastian en los comentarios de usar un compilador en línea es bastante buena, pero, por supuesto, el código debe estar en una forma que el compilador acepte.
Cualquier lenguaje o compilador con facilidades para la ejecución en tiempo de compilación de código general es, por supuesto, altamente sospechoso. Las plantillas de C ++ son funcionalmente completas pero no tienen acceso (previsto) al sistema, por lo que tienen un riesgo relativamente bajo. BЈовић menciona make
un riesgo extremadamente alto (ya que está ejecutando el código del extraño, es solo que el código está escrito en el make
lenguaje, no en C ++). Si el compilador se ejecutará, system
entonces estás en el mismo barco. Solía trabajar con un ensamblador que, si no recuerdo mal, podría hacer una ejecución arbitraria de código en tiempo de compilación. Estaba destinado a calcular tablas de búsqueda, pero no creo que nada te impidiera hacer llamadas al sistema.
En la práctica , si el código me parece correcto y creo que lo entiendo, entonces consideraría un riesgo extremadamente bajo compilarlo, un riesgo mucho menor que decir "navegar por Internet con un navegador bloqueado". Hago cosas más riesgosas rutinariamente en mi máquina de uso general, pero muchas de ellas no las haría, por ejemplo, dentro de un laboratorio de virus o en un servidor crítico. Si el código tiene un aspecto gracioso o evidentemente ofuscado, entonces no podría arriesgarme a compilarlo porque, aparte del riesgo, podría contener un exploit oculto en la basura ilegible, es un código basura. El código oculto es difícil pero posible. El código oculto que genera la máquina a través de un exploit de compilación debe contener una carga útil ejecutable no trivial, por lo que es extremadamente difícil.
Si desea investigar más sobre esto, intente preguntar a las personas que alojan compiladores en línea. Si no se les ha hecho a ellos, entonces (salvo que usted llame la atención de la NSA o equivalente), puede asumir razonablemente que no se le hará a usted. Pusieron algo de esfuerzo en ejecutar su compilador en una caja de arena adecuada, lo que podría ser más esfuerzo de lo que estás dispuesto a hacer, pero al menos podrían decirte con qué frecuencia esa caja de arena les ahorra problemas.