2012-07-06 17 views
7

Actualmente estoy trabajando en un marco muy modular y basado en plugins para mi tesis de licenciatura. La idea principal es que haya una carpeta dentro de la estructura de mi aplicación llamada plugins donde puede colocar complementos compilados (por ejemplo, .dll -files), que se ajustan a una interfaz especial IPlugin. La aplicación luego ejecuta tareas usando el complemento que el usuario selecciona. Entonces, si quiero realizar una tarea una vez en un archivo PDF, elegiría el PdfPlugin y una vez en un documento de Word, elegiría el DocPlugin para el trabajo.Cómo evitar que los complementos ejecuten código dañino

La salida también se define en las interfaces, por lo que cada complemento devuelve la misma estructura de datos. Solo el trabajo real difiere para cada biblioteca.

Ahora, como la aplicación solo llama a los métodos definidos en la interfaz, p. ParseDocument() y tal, ¿cómo puedo evitar que los complementos (que pueden haber sido desarrollados por terceros) puedan ejecutar código dañino?

Estoy trabajando en .NET3.5 (tal vez cambie a 4, aún no decidido) y C#.

Respuesta

8

estoy trabajando en .NET3.5

En ese caso, me gustaría aislar los plugins para funcionar en una separada AppDomain, utilice Code Access Security y restringir el conjunto de permisos de la aplicación de dominio. Este "sandboxes" sus conjuntos de complementos.

Por ejemplo, puede quitar todos los permisos de Código no administrado y Permisos de IO de archivo, y luego su complemento nunca podrá escribir en el sistema de archivos.

Esto no es para los débiles de corazón. Los AppDomains pueden ser complicados de trabajar y requieren serialización, políticas de duración de los objetos, etc. Puede usar MAF ya que le quita gran parte de la tubería.

+0

¿Es posible consultar un complemento de qué permisos de seguridad de acceso de código quiere? En comparación con algo así como intenciones en Android? Es decir. Probablemente quiera un plugin framework que me permita determinar qué permisos está solicitando un plugin, por lo que puedo pedir confirmación al usuario antes de cargar el plugin. ¿O es al revés, en el que impongo permisos en mi aplicación, y luego el plugin simplemente falla/arroja una excepción si intenta hacer algo fuera de los permisos permitidos? – AaronLS

+0

No pido un "cómo", ya que está fuera del alcance de la pregunta, pero curioso de cuál de estos dos enfoques diferentes CAS es apropiado. – AaronLS

0

Sé que hay bastante investigación realizada en esta área. Un enfoque de trabajo es inspeccionar el código IL y buscar firmas de métodos prohibidos. Luego puede redirigirlos a un enlace de error que detendrá el complemento vom ejecutando código adicional.

Una aplicación es, p. Ej. mayor seguridad para teléfonos inteligentes donde se puede inspeccionar el código IL de las aplicaciones descargadas para acceder a los métodos del módulo GPS, cámara, micrófono, ... La aplicación de seguridad puede parchar estos métodos de acceso y preguntar al usuario si la aplicación debería ser realmente permitido habilitar el micrófono.

Con .NET puede usar un lector IL como Mono.Cecil para inspeccionar el código IL en busca de firmas dañinas. Pero siempre hay formas de evitar esto, ya que aún se puede generar código de forma dinámica o simplemente almacenar código como recurso y cargarlo al ron desde un recurso. Para una prueba de concepto, este enfoque es bastante fácil de hacer.

Incluso podría escribir una regla FXCop y usar esto para verificar estáticamente los complementos para las llamadas a métodos prohibidos.

+2

"Un enfoque de trabajo es inspeccionar el código IL y buscar firmas de métodos prohibidos" ick. ¿Qué ocurre con las llamadas a métodos realizadas a través del envío dinámico, como el DLR, la reflexión, etc.? – vcsjones

+0

No estoy diciendo que hice esto. Todo lo que sí dije es que los investigadores lo hicieron y obtuvieron bastante eco en la prensa (la seguridad de los teléfonos inteligentes es genial). Supongo que no eran desarrolladores de núcleos tan duros como los visitantes promedio de Stackoverflow. Tal vez deberían haber preguntado sobre SO si su idea era una buena idea. –

-2

No puede.

Las DLL son código binario que se ejecuta con los privilegios del programa de llamada. Cuando se llama a un método de una DLL, no tiene control sobre lo que hace.

Cuando quiere limitar lo que un plugin puede hacer, tiene que mover la ejecución a su programa principal.Una buena forma de hacerlo sería implementar complementos en un lenguaje de scripts que el programa analice y ejecute en lugar de las bibliotecas binarias.

+0

* Las DLL son código binario * - no está en .Net – DaveShaw

+1

"No se puede". sí tu puedes. Eso es exactamente lo que CAS fue diseñado para hacer. Recuerde, .NET Framework es una máquina virtual, por lo que puede hacer cumplir estas reglas en tiempo de ejecución. – vcsjones

Cuestiones relacionadas