¿Los compiladores suelen validarse para garantizar que no le ofrezcan al usuario?
¿Máquina al compilar algún código inteligente?
En general, son demasiado complejos y, a menudo, se escriben en idiomas en los que no es práctico probar esta propiedad.
Posiblemente no con esta intención específica, pero la noción de compiladores de prueba fuzz es al menos conocida ( LLVM ahora puede hacer fuzz-test en sí mismo ). Las pruebas destinadas a captar la entrada que bloquea el compilador debido a errores del compilador tenderán a encontrar fallas explotables.
Naturalmente, tendrías que ver si el compilador específico en el que estás interesado está probado o no está probado para encontrar bloqueos potenciales, y si los errores encontrados están reparados. La regla de oro es que si hay accidentes peores que sin excepciones sin memoria, entonces, sin investigar más los detalles, debe considerar una posibilidad seria de que puedan aprovecharse para explotarlas.
¿Qué tan seguro es compilar un fragmento de código de un extraño?
Desafortunadamente, ¿cuánto tiempo es 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 al compilador. La sugerencia de Sebastian en los comentarios sobre el uso de 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 ++ están funcionalmente completas pero no tienen acceso (previsto) al sistema, por lo que son relativamente de bajo riesgo. BЈовић menciona make
como extremadamente alto riesgo (ya que está ejecutando el código del extraño, es solo que el código está escrito en el lenguaje make
, no en C ++). Si el compilador ejecuta system
, entonces estás en el mismo barco. Solía trabajar con un ensamblador que, si recuerdo correctamente, podría hacer una ejecución de código de tiempo de compilación arbitraria. Fue diseñado para computar tablas de consulta, pero no creo que nada te impida hacer llamadas al sistema.
En la práctica , si el código me parece bien y creo que lo comprendo, consideraría que es un riesgo extremadamente bajo compilarlo, un riesgo mucho menor que decir "navegar por Internet con un navegador bloqueado ". Hago cosas más riesgosas de manera rutinaria en mi máquina de propósito 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 es divertido o está evidentemente ofuscado, entonces no me arriesgo a compilarlo porque, aparte del riesgo, podría contener un exploit oculto en la basura ilegible, es un código basura. El código infiltrado es difícil pero posible. El código secreto que maneja la máquina a través de un exploit de compilador debe contener una carga útil ejecutable no trivial, por lo que es extremadamente difícil.
Si desea profundizar en esto, intente preguntar a las personas que albergan compiladores en línea. Si no se lo han hecho a ellos, entonces (salvo que llame la atención de la NSA o su equivalente), puede suponer razonablemente que no se lo harán a usted. Hacen un poco de esfuerzo para 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 la caja de arena les ahorra problemas.