¿Qué tan seguro es compilar un código fuente de un extraño aleatorio? [cerrado]

41

Supongamos que estoy revisando el código que envían los solicitantes de empleo para demostrar sus habilidades. Claramente, no quiero ejecutar ejecutables que envían. No es tan claro que prefiero no ejecutar el resultado de la compilación de su código (solo, por ejemplo, Java permite ocultar el código ejecutable en los comentarios ).

¿Qué hay de compilar su código? Quiero advertencias del compilador si las hay, pero ¿y si su código contiene algunas secuencias de caracteres inteligentes que explotan mi compilador y mi compilador compromete mi máquina?

Cuando busco en Google las "vulnerabilidades del compilador", los resultados que obtengo tienen que ver con las optimizaciones del compilador y la emisión del código, y si el código emitido es tan seguro como se pretendía que fuera el código fuente original.

¿Los compiladores generalmente se validan para garantizar que no comprometerán la máquina del usuario al compilar algún código inteligente? ¿Qué tan seguro es compilar un fragmento de código de un extraño?

diente filoso
fuente
40
Solo use una máquina virtual ...
Florian Margaine
14
Si realmente está revisando el código, entonces debería ser bastante difícil obtener algo tan difícil como "hacer pasar la máquina del usuario" sin ser notado, ¿verdad?
RemcoGerlich
17
Entonces, ¿cómo juzgas sus habilidades? Pregunto esto porque a menudo he revisado el código que nos envían los solicitantes de empleo, pero siempre lo he leído, nunca sentí la necesidad de ejecutarlo.
RemcoGerlich
99
Java permite ocultar el código ejecutable en los comentarios. No todos los IDE de Java realizan conversiones unicode al resaltar la sintaxis, lo que no es remotamente lo mismo.
Pete Kirkham
68
Ni siquiera leas el código. Podrían explotar una vulnerabilidad en su cerebro.
Henrik

Respuestas:

34

Depende.

Esta pieza de archivo MAKE podría eliminar su directorio de inicio:

all:
    rm -rf ~

Por lo tanto, si necesita usar una herramienta (como cmake o sistema de archivos MAKE), entonces no es seguro. Solo depende de lo malicioso que sea el codificador.

Por otro lado, los compiladores son programados por personas, por lo tanto, tienen errores. Entonces, tal vez sea posible que alguien encuentre una manera de ejecutar código malicioso durante la compilación.

Como se sugiere en los comentarios, si desea estar seguro de que no se están haciendo cosas graciosas en su máquina, use una máquina virtual.

BЈовић
fuente
32
"usa una máquina virtual" - y si eres realmente paranoico, ten en cuenta que al explotar múltiples fallas, el malware puede salir de tu VM y estrangularte ( venom.crowdstrike.com )
Steve Jessop
23
@SteveJessop, sí, es mejor usar máquinas virtuales anidadas;) Lo más probable es que el codificador no se dé cuenta de que al salir de una máquina virtual, todavía está dentro de la otra.
Ruslan
3
O simplemente use una computadora portátil vieja para probar el código. Mientras no tenga capacidades de red, siempre estará seguro de que el malware no saltará. A menos que los errores de software se materialicen mágicamente en errores reales, por supuesto.
Mástil
55
@Ruslan: desafortunadamente la mayoría de los hackers han visto Inception.
Steve Jessop
2
@Ruslan Esta es literalmente la pestaña que he abierto antes de esta página: matrix.wikia.com/wiki/Matrix_in_a_Matrix_theory que estaba leyendo debido a una pregunta no relacionada en el sitio de SciFi SE.
armani
23

Estoy bastante seguro de que en algún lugar del negocio hay algunos tipos inteligentes que ya han creado un truco para un idioma específico y una versión del compilador. Mi lugar favorito para buscar algo como esto probablemente sería el concurso internacional C ofuscado (no sé si hay algo comparable para Java). Sin embargo, en realidad, qué tan alto considera el riesgo, asumió que

  • el solicitante le deja una impresión plausible de que realmente quiere el trabajo en su empresa (y no una demanda)

  • el chico no sabe cuánto se hace la revisión en la tuya

  • él / ella no sabe qué versión exacta del compilador está utilizando

  • él / ella no sabe si usa un entorno virtual o un compilador en línea, solo para estar seguro

  • no acepta programas que son demasiado grandes para ser revisados ​​efectivamente

  • no compilas nada que te parezca sospechoso

  • no hay muchas personas en el mundo que realmente sepan cómo realizar técnicamente dicha tarea (y solo buscar en Google no le dará una "referencia rápida" o un tutorial sobre esto, como ya lo ha descubierto usted mismo).

Entonces, aunque la compilación no es "totalmente segura" en teoría, en mi humilde opinión, en realidad, el riesgo es extremadamente bajo de que su "compilador se pwned".

Doc Brown
fuente
15
Ofuscado es bueno. Underhanded es mejor. underhanded-c.org
11
"El solicitante realmente quiere un trabajo en su empresa (y no una demanda)" No está claro que un extraño que envía una solicitud realmente quiera el trabajo.
Christian
@Christian: obviamente. Pero supongo que el OP no invertiría ningún tiempo en la revisión del código de un solicitante si este último no presentara al menos una apariencia plausible con respecto a su solicitud de trabajo. Y también un extraño probablemente no quiere ser demandado. Mi punto es: cada uno de los puntos anteriores por sí solo puede ser burlado, ¿pero todos juntos? Ese es un riesgo bastante bajo.
Doc Brown
13

Tenemos que distinguir varios casos:

  1. Un error en el compilador. Como todo programa complejo, un compilador puede tener errores, y uno de esos errores puede ser explotable.
  2. Un caballo de Troya El atacante puede hacer que ejecute algún código arbitrario como parte del proceso de compilación. A Makefile, a build.xml, un configurescript de shell, etc. Técnicamente, esto no se debe a la compilación del código del atacante, sino a la configuración del entorno de compilación.
  3. Idiomas que permiten ejecutar código arbitrario en tiempo de compilación. El lenguaje macro de Scala es Scala, el lenguaje macro de Common Lisp es Common Lisp, el lenguaje macro de Template Haskell es Haskell. Scala también tiene complementos de compilación, que nuevamente son códigos arbitrarios de Scala que se ejecutan en tiempo de compilación. F # tiene proveedores de tipos.
  4. Lenguajes que permiten el cálculo de Turing en tiempo de compilación. Los sistemas de tipos de Scala y Haskell son completos de Turing, al igual que las plantillas de C ++. Puede hacer que el compilador realice cómputos arbitrarios de Turing en tiempo de compilación, incluidos, entre otros, bucles infinitos. Tenga en cuenta que Turing-complete solo significa que puede calcular todas las funciones computables de Turing, no significa que pueda acceder al sistema de archivos o algo así. Pero puedes hacer un programa que tomará infinitamente mucho tiempo compilar.
  5. Tiempos de compilación muy largos. Por ejemplo, las reglas de C # para la resolución de sobrecarga son tan complejas que puede codificar cualquier problema de 3-SAT como resolución de sobrecarga de C #. 3-SAT es, por supuesto, famoso NP-complete. En otras palabras, de acuerdo con nuestro conocimiento actual, es imposible encontrar un algoritmo eficiente para la resolución de sobrecarga en C #. No se puede hacer que la compilación tarde infinitamente, pero no se necesita un gran programa para hacer que la compilación demore más que la vida útil del universo, que es prácticamente lo mismo.

# 4. y # 5. como máximo resultará en una denegación de servicio. En la práctica, los compiladores de C ++ y Scala limitan la cantidad de recursividad se puede hacer, por lo que no es realmente posible escribir un bucle infinito. En Scala, eso es solo una restricción de implementación, pero en C ++, está explícitamente permitido por la especificación, creo.

# 2 está técnicamente fuera del alcance de la pregunta porque la pregunta era sobre compilar código que no lo ejecuta (OTOH, está la profunda pregunta filosófica: si la verificación de tipo de un programa Haskell puede realizar un cálculo arbitrario de Turing, ¿es esa compilación o ejecutar un programa?)

# 1 es poco probable Por un lado, los compiladores de producción son muy complejos, por lo que la probabilidad de errores es alta. Por otro lado, se prueban rigurosamente, después de todo, manejar la entrada mal formada es parte de la descripción del trabajo de un compilador. Incluso si no se prueban, serán bombardeados con código mal formado de todos modos ... ¡solo mire algunas preguntas de StackOverflow para obtener ejemplos de lo que la gente basura arroja a sus compiladores!

Esto nos deja con 3. Algunos compiladores pueden limitar el tipo de acceso que el código de tiempo de compilación tiene al sistema, pero para algunos de los casos de uso, tener acceso total es inevitable. El propósito de los proveedores de tipos de F #, por ejemplo, es "falsificar" tipos sintéticos para datos cuyo sistema de tipos no coincide con F # 's, para que pueda interactuar, por ejemplo, con un servicio web que tiene un esquema WSDL en un tipo fuertemente tipado Moda. Sin embargo, para hacer esto, el proveedor de tipos debe tener acceso al recurso de esquema WSDL en el sistema de archivos o en la web, por lo que debe tener acceso a la red y al sistema de archivos.

Entonces, ¿es seguro? Técnicamente no. ¿Es arriesgado? Realmente no.

Jörg W Mittag
fuente
1
C ++ de hecho limita la profundidad de creación de instancias de plantillas a algún valor dependiente de la implementación. Esto solía ser unas pocas docenas; Las implementaciones modernas han elevado el límite a varios cientos. Aún así, es completamente trivial duplicar el número de instancias de plantillas por nivel, por lo que 100 niveles requerirían que el compilador instanciara 2 ^ 100 plantillas. Eso es solo hasta un ataque DoS.
MSalters
3

No debería haber ningún riesgo simplemente compilando el código. En teoría , podría haber un error en el compilador que un pirata informático inteligente podría aprovechar, pero parece extremadamente improbable.

Tenga en cuenta que el edificio puede ser inseguro. Por ejemplo, en C #, 'evento de compilación' le permite especificar líneas de comando arbitrarias para ejecutar antes y después de la compilación, lo cual es obviamente peligroso y mucho más fácil de explotar que los desbordamientos del búfer en el código del compilador.

JacquesB
fuente
3
Scala, Template Haskell, casi todos los Lisps pueden ejecutar código arbitrario en tiempo de compilación. Todos los idiomas con un sistema de tipo completo de Turing (Scala, Haskell) pueden realizar cómputos arbitrarios de Turing en tiempo de compilación, incluidos, entre otros, un bucle infinito. El sistema de plantillas de C ++ es Turing completo, de nuevo, lo que le permite realizar una compilación arbitraria que incluye bucles infinitos en tiempo de compilación. La resolución de sobrecarga de C # es equivalente a 3-SAT, por lo tanto, NP-complete, que no es Turing-complete pero que aún le permitirá colgar el compilador durante toda la vida del universo si lo desea.
Jörg W Mittag
3
Un sistema de tipo Turing-complete no le permite usar la computadora. En el peor de los casos, hará que el compilador se cuelgue si lo explota. Pero sí, si tiene un idioma en el que el paso de compilación puede ejecutar código arbitrario, entonces obviamente no debe compilar código no confiable.
JacquesB
3

En lugar de especular, en realidad me molesté en investigar un poco sobre este tema antes de responder, yendo al recurso más autorizado que se me ocurrió ( Detalles de CVE ). Esta lista completa de vulnerabilidades de seguridad divulgadas públicamente es probablemente la mejor que se podría hacer para evaluar los niveles de amenaza de varios tipos de software.

Por supuesto, no me tomé el tiempo de leer todo el material disponible, pero seleccioné algunos compiladores "principales", IDE y editores de texto para elaborar una evaluación de amenaza de muestra. Si se toma en serio la ejecución de cualquier software, al menos debería ver qué amenazas existen. También tenga en cuenta que el software más antiguo es generalmente más defectuoso que el software más nuevo, por lo que es ideal ejecutar lo último que esté ejecutando.

Primero, podemos echar un vistazo a varios editores de texto. Parece que los mejores editores son los más simples. Vi si está utilizando un shell de Linux, o Bloc de notas si está en Windows. Algo sin capacidades de formato, sin análisis, solo visualización directa de datos y terminación automática del análisis si un solo carácter está fuera del esquema de codificación actual. Incluso Notepad ++ ha tenido un puñado de vulnerabilidades. Evite cualquier cosa compleja cuando vea archivos no confiables.

En segundo lugar, podemos mirar IDEs. Si elige abrir el archivo en un IDE, debe tener en cuenta que algunos IDE han reportado errores. Aparentemente, Visual Studio ha tenido vulnerabilidades disponibles a través del mecanismo de extensiones, por lo que abrir una solución puede ser problemático. Evitar IDE evita toda una clase de problemas entre usted y el código no confiable. Seguir con VI parece mucho más seguro.

Tercero, podemos ver los compiladores reales. Hojeé algunos, incluidos Adobe, Microsoft, Java y C / C ++ de GNU, y descubrí que, en general, compilar código (e incluso construir , suponiendo que no haya un archivo de creación personalizado) es relativamente seguro, pero cada uno de esos compiladores lo hizo o lo hizo tener vulnerabilidades de seguridad que podrían surgir de la ejecución real de los binarios compilados. En otras palabras, no podrían controlar su sistema simplemente compilando, sino que podrían ejecutar código.

Entonces, en conclusión, suponiendo que el método de entrega no haya secuestrado su sistema (por ejemplo, su cliente de correo electrónico fue pirateado, o la unidad USB en la que estaba infectada ...), leer el código fuente y compilar el código fuente probablemente sea seguro . Al investigar su software específico, podría hacerlo aún más seguro, por ejemplo, validar que el archivo está en la página de códigos correcta, etc. La ejecución del código solo debe realizarse en hardware que simplemente no le interesa. No es una VM, sino una computadora completamente diferente físicamente sin acceso a la red y sin archivos confidenciales o dispositivos externos. Incluso si crees que entiendes el código, una investigación simple muestra que incluso los compiladores tienen errores que podrían permitir que un exploit de desbordamiento de búfer oculto se escabulle por detrás y ejecute código arbitrario, pero solo si eligesejecutar o depurar el programa La compilación real debe ser segura.

phyrfox
fuente
2

Bueno, comenzaría con "revisar su código". ¿Por qué hay una necesidad de ejecutar el código?

Además de eso, hay muchos compiladores en línea en los que puedes poner el código y compilarlo y / o ejecutarlo. Puede hacer que sea un requisito: se compila en este y aquel compilador en línea.

Aquí hay un ejemplo de una página con compiladores en línea: compiladores en línea

El código de revisión para una entrevista de trabajo no debería ser tan grande como para que no entiendas lo que está sucediendo.

Pieter B
fuente
3
"¿Por qué hay una necesidad de ejecutar realmente el código?". Para saber si es bueno, por supuesto, una revisión solo le dice que sus fallas son sutiles :-). "Tenga cuidado con los errores en el código anterior; solo he demostrado que es correcto, no lo he probado". - Knuth
Steve Jessop
2

¿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 makeun riesgo extremadamente alto (ya que está ejecutando el código del extraño, es solo que el código está escrito en el makelenguaje, no en C ++). Si el compilador se ejecutará, systementonces 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.

Steve Jessop
fuente
Debido al trabajo del profesor John Regehr en la Universidad de Utah, clang y gcc han pasado por pruebas de fuzz bastante intensas, resolviendo cientos de defectos que podrían causar que el compilador se bloquee o incluso producir código que se comportó de manera diferente a otros compiladores. Lo que hay que buscar serían errores que aún estén abiertos, y si constituyen una amenaza suficiente.
Phil Miller
@Novelocrat: de acuerdo, y gracias por la información específica. Mi temor es que el equipo compilador dev podría calificar como errores de baja prioridad, porque "nadie volvería a escribir ese código", y que no se han fijado todavía , mientras que una vez que usted está pensando en el compilador como una superficie de ataque que se consideraría ellos críticos. Eso sí, espero que el orgullo se asegure de que un compilador-escritor no permita que algo tan vergonzoso como un búfer escriba desbordamiento ;-)
Steve Jessop
1

Aunque esto es generalmente una preocupación, creo que el problema no existe debido a la configuración.

El solicitante le envió un código fuente. ¿Cómo o por qué sucedió eso?

Bueno, obviamente solo hay tres posibilidades:

  1. Le asignó al solicitante una tarea para resolver un problema particular (bien definido) para evaluar sus habilidades.
  2. El solicitante quiere mostrar algo genial que escribió.
  3. El solicitante es un imbécil o un espía o una persona maliciosa y no está realmente interesado en ser contratado. Todo lo que espera es que seas lo suficientemente estúpido como para ejecutar su código.

Aproximadamente 2) y 3)

El principal riesgo es distinguir entre 2) y 3). Hay muchas posibilidades de que si vale la pena mirar lo que escribió , es algo que puede obtener el código fuente en línea (de una fuente "neutral") y que incluso puede estar familiarizado, o es algo que realmente no tiene No quiero mirar porque infringiría la propiedad intelectual de un competidor (antiguo empleador). Esto último significaría que no querría contratar a esa persona de todos modos.
Si puede obtener la fuente en línea, hágalo. Si puede verificar la contribución del solicitante a un software conocido (incluido el software propietario) por su nombre en algún lugar de los créditos, hágalo.
En cualquier otro caso, simplemente ignora lo que sea que te envió. No vale la pena mirarlo, o es ilegal o de alto riesgo.

Alrededor de 1)

El solicitante le envió algo porque le asignó una tarea. Si tiene alguna competencia (¡lo que supongo que tiene!), Entonces para una tarea de programación típica (... ¡que incluso se eligió a sí mismo!), Podrá saber si es una solución plausible que parece que podría funcionar mirando el código fuente por menos de 30 segundos (más probablemente 10 segundos).

Si no puede decir que el programa probablemente funcionará (o lo que está haciendo) en 30 segundos, el que lo escribió no es el tipo de persona que desea contratar, completo. Desea personas que escriban código que otros humanos puedan entender y mantener. No quieres a alguien que intente ser inteligente contigo, ni a alguien que gane regularmente el concurso de C ofuscado. Ni siquiera importa si el programa funciona. Tan pronto como otra persona no pueda entender el código, nunca "funciona".
Si parece que el programa probablemente funcionará, pero encuentra algo que parece "extraño" (por ejemplo, secuencias de escape Unicode de Java, literales de cadena sin formato C ++, cosas que parecen trigráficos, lo que sea), trate la asignación como "fallida", muévase al siguiente solicitante. No es necesario incluir algo similar en el 99% de todos los programas (y, efectivamente, no en su tarea, espero). Entonces, si encuentra algo "extraño" como ese, el solicitante no es alguien que quiera contratar.

Si el código pasa ese primer triaje, es posible que desee pasar otros 2-3 minutos mirándolo más a fondo. Si aún está satisfecho con lo que ve después de eso, puede ejecutarlo a través de un analizador estático y compilarlo en una máquina virtual con un alto nivel de advertencia.

Eso debería plantear problemas que puede haber pasado por alto al leer la fuente (como invocar un comportamiento indefinido o reducir la conversión).
La compilación le dirá en primer lugar si el solicitante tiene la diligencia y la atención al detalle necesarias, no tanto si tiene habilidades de programación. Al igual que escribir el nombre del empleador correctamente en su solicitud y revisar ortográficamente su CV antes de entregarlo, es una buena práctica asegurarse de que el código fuente que entrega compila sin errores (y preferiblemente sin advertencias). Si alguien no hace eso, no quiere contratarlo.

El riesgo de que sucedan cosas malas en este punto (explotar el compilador y salir de la máquina virtual) es insignificante, ya que ya ha realizado una comprobación de plausibilidad sobre el código. No va a pasar.

Damon
fuente
0

Si la posibilidad le preocupa, tome una máquina más antigua (¿la mayoría de nosotros no tenemos algunas sentadas?), Instale la versión actual de Linux y el compilador & c, copie el código fuente, desconecte el cable de red (o apague WiFi ), y compila. Si sucede algo desagradable, no * afectará a nada más.

Y para el malware en el Makefile, ejecútelo con el indicador -n (IIRC, RTMF) para ver qué hará sin realmente hacerlo.

* A menos que, por supuesto, su programador codifique el malware para que espere una reconexión, pero en ese caso usted: a) limpia la máquina; y b) reenviar el currículum del tipo a la NSA, porque está malgastado en el mundo comercial :-)

jamesqf
fuente
0

La conclusión es que no es riesgo. El riesgo es bastante pequeño como señalan otras respuestas, pero existe un riesgo. Eso significa que debe hacer dos preguntas:

  1. ¿Qué puedo hacer para mitigar el riesgo?
  2. ¿Es el riesgo lo suficientemente alto como para que me importe?

El segundo es lo que has planteado aquí en esta pregunta, pero es el enfoque incorrecto para este caso particular. La respuesta para mitigar el riesgo es clara y fácilmente disponible: no compile el código en su máquina . Tiene dos formas obvias de compilarlo sin usar su máquina:

  1. Use una máquina virtual (como señaló @FlorianMargaine inmediatamente en los comentarios). Simplemente haga una instantánea antes de compilar y luego restaure la instantánea cuando haya terminado.
  2. Use un servicio alojado (como un compilador en línea).

Estas formas de mitigar su riesgo son tan obvias, baratas y de fácil acceso que no vale la pena pasar mucho tiempo tratando de analizar qué tan grande es el riesgo. Solo haz uno de ellos y termina de una vez.

jpmc26
fuente
0

Visual Studio realmente le advierte si abre un proyecto desde una ubicación no confiable (e, g, descargado o recurso compartido de red).

Un ejemplo de cómo podría explotarse esto sería con un proyecto WPF: puede hacer referencia a clases .NET desde XAML y proporcionar IntelliSense, VS carga y ejecuta las clases referenciadas en tiempo de diseño.

Eso significa que un atacante puede colocar un archivo .dll malicioso en el directorio bin, reemplazar el código fuente por uno no malicioso y, en el momento del diseño, se ejecuta el archivo DLL. Después de su primera compilación, todos los rastros del binario malicioso desaparecen.

Entonces, aunque todo el código provisto esté "limpio", el compilador está libre de errores y, por supuesto, nunca ejecutas manualmente ningún .EXE provisto, el código malicioso aún podría ejecutarse en segundo plano. (Para estar a salvo de ese ataque específico, puede asegurarse de que NO haya binarios en el árbol de directorios antes de abrir la solución. VS le pedirá que cree la solución antes de proporcionar IntelliSense en tiempo de diseño).

Vectores similares probablemente existen con otros lenguajes / sistemas operativos.

Lukas Rieger
fuente
0

Lectura del código fuente: totalmente seguro. Compilación de código fuente: totalmente seguro. Ejecutando binarios compilados: bueno ... eso depende.

Compilar es solo la computadora que lee el código fuente y escribe su equivalente en forma binaria. Después de la compilación, solo tiene 2 documentos: uno legible por humanos y otro legible por computadora. A menos que haga que la computadora lea (es decir, ejecute) el segundo documento, no sucederá nada.

gbjbaanb
fuente
3
¿Alguna explicación de por qué compilar es totalmente seguro? Uno puede crear un servidor enviando un mensaje ingeniosamente diseñado: ¿por qué no puede crear un compilador dándole una entrada ingeniosamente diseñada?
Sharptooth
2
Creo que notarías un código ingenioso diseñado para explotar una vulnerabilidad en un servidor o un compilador. Pero llevando esto al extremo, ¿por qué correr el riesgo de ver el código? Hay varios exploits en los editores que pueden explotarse simplemente viendo un archivo .
gbjbaanb
2
Esta respuesta es un galimatías total. No hay ninguna razón para que un compilador sea inherentemente seguro, o al menos más seguro que algo que hace una tarea simple como configurar una conexión SSL, pero recientemente una biblioteca popular contenía una vulnerabilidad. Incluso diría que, dado que los compiladores generalmente no se usan en un entorno hostil (como Internet), se comprueba menos las vulnerabilidades y, por lo tanto, es más probable que las tengan.
Dorus
1
No estoy tan seguro de que la compilación de código sea totalmente segura. Incluso en Java, con Maven (por ejemplo) un " mvn package" descuidado puede extraer cosas y realizar tareas con complementos adicionales que quizás no conozca fácilmente. Estoy seguro de que lo mismo podría aplicarse a otros sistemas de compilación.
Bruno
1
Un lenguaje completo de Turing puede permitir que un programa pase una cantidad ilimitada de tiempo para compilar, si se permite que el compilador se ejecute durante una cantidad ilimitada de tiempo , pero muchos compiladores crearán un número limitado de hilos independientemente de cualquier cosa que pueda aparecer en el código se está compilando, lo que significa que la carga de la CPU al intentar compilar un programa a la vez sería limitada. Un problema potencialmente mayor serían los requisitos de espacio en disco; Es totalmente posible que un archivo fuente de 1 KB pueda generar muchos gigas de código objeto.
supercat
-1

Creo que te preocupa uno de los dos sabores:

  • malware sofisticado, impulsado por exploits : poco probable, especialmente porque están dirigidos a hardware y / o software muy específico y [según su pregunta] su atacante probablemente no tenga ese nivel de conocimiento del sistema.
  • cosas que afectan a su entorno : directivas de broma maliciosas (por ejemplo, eliminar su directorio de inicio) o directivas desconsideradas / incompetentes que cambian el comportamiento de su sistema (por ejemplo, reescribir las variables de entorno PATH o LIBRARY)

Algunas personas han sugerido máquinas virtuales o sistemas antiguos, pero ofrezco una solución mucho más fácil: compilar como un usuario diferente con permisos reducidos / diferentes . Mucho más fácil que configurar una máquina virtual o una computadora dedicada.

Si es poco probable incluso que su sistema se vea afectado por exploits en tiempo de compilación, restaure desde copias de seguridad (las tiene, ¿verdad?).

brian_o
fuente