Hacer cumplir la firma de código / secuencia de comandos

8

Tengo un par de certificados de firma de código X.509 y un par de llaves GPG que puedo usar para firmar contra el código que corro en mi VPS. De vez en cuando escribo código para iOS, OS X y Windows y siempre me aseguro de firmar mis binarios con mis certificados X.509. Sin embargo, me gustaría asegurarme de que todo lo que corro en mi VPS (en lo que respecta a los scripts PHP / Django y quizás incluso el Javascript que envío a un cliente) también esté firmado.

Simplemente podría escribir un script bash que firme todos los archivos en un directorio con mi par de llaves GPG, pero mi problema es el hecho de que si el código no se firmó, no genera ningún problema adicional. errores que si se firmó correctamente, por lo que para proteger mi servidor de enviar / ejecutar scripts maliciosos que no he autorizado explícitamente, ¿hay alguna manera de que pueda usar mi par de llaves GPG (o incluso mis certificados X.509)? y ASEGURAR todo el código de un directorio particular, por ejemplo, siempre se comprueba para una firma válida antes de la ejecución?

Para lanzar una llave aún más lejos en el trabajo, ¿cómo podríamos 'hacer de forma efectiva' esto de manera tal que los scripts maliciosos colocados fuera del alcance de la verificación forzada no pudieran interferir? Por ejemplo, si se 'marcó' un directorio que requiere firmas forzadas en todos los archivos, ¿sería posible que los archivos que se encuentran fuera de este directorio se utilicen para eludir las firmas de código e interferir con la aplicación o los scripts?

No estoy realmente interesado en el algoritmo de firma, los scripts frente a los binarios o el sistema operativo, pero para la aplicación a la que se aplicaría, sería contra los scripts de python / django o PHP que se ejecutan en un VPS de Debian (para el fines de las aplicaciones web).

¡Solo un pensamiento interesante, uno que sin duda me gustaría seguir si existe una solución adecuada! Ideas o discusión es muy apreciada!

    
pregunta TC Fox 22.01.2012 - 03:21
fuente

2 respuestas

3

Para PHP hay varios motores de encriptación como codificador PHP de ionCube : funcionan como extensiones de PHP que se enganchan en un analizador y descifran el código que se ejecutará, validando la firma, verificando las restricciones de un archivo de licencia (p. ej., dirección MAC, nombre de dominio, restricciones de tiempo). Se pueden configurar de manera que no se pueda ejecutar un código que no esté 'encriptado' con la clave adecuada, por lo que solo se puede ejecutar el código PHP encriptado por el autor.

Desafortunadamente, estas son soluciones de código cerrado de pago y no son compatibles con GPG por lo que sé (por lo que no puede usar su propia llave de GPG para firmar). Sin embargo, se pueden integrar fácilmente en los scripts de creación de aplicaciones, etc.

Otro enfoque sería empaquetar toda su aplicación PHP como archivo Phar . Phar es compatible con las funciones de firma de código, también he creado un conjunto de scripts llamados PharUtil que lo utiliza para distribuir de forma segura el código firmado. No es el mismo caso de uso que tiene, pero podría ser útil para empezar.

No conozco ninguna solución similar para Python y / o Javascript.

    
respondido por el Krzysztof Kotowicz 22.01.2012 - 16:50
fuente
4

Para poder admitir esta funcionalidad, el intérprete deberá ser aumentado. Afortunadamente, esta función de canto de código probablemente no requiere una extensión de PHP como hardened-php . De hecho, hay una forma más sencilla.

Puede cambiar su php.ini a auto-prepend a php script que lee el $_SERVER['SCRIPT_FILENAME'] y verifica la firma del script actual. Si la comprobación de la firma falla, entonces llame a die(); y nunca podrá ejecutarse.

Esta es una solución bastante simple. Sin embargo, esto no evitará que un atacante aproveche las vulnerabilidades en el código existente para obtener ejecución del código , incluyendo pero no limitado a eval() y vulnerabilidades RFI / LFI. Además, cada intérprete requerirá su propia solución. Por ejemplo, JavaScript del lado del cliente requeriría una extensión específica del navegador como NoScript . "JavaScript no autorizado" se denomina más comúnmente como XSS. Una gran solución para XSS es la Política de seguridad de contenido , porque le da control sobre dónde puede ejecutar JavaScript el navegador. No hay una respuesta única para este problema.

    
respondido por el rook 22.01.2012 - 09:23
fuente

Lea otras preguntas en las etiquetas