mp3tag - Ejecutables firmados bajo Linux
tag editor linux (8)
Echa un vistazo a esto: http://linux-ima.sourceforge.net/
No está firmando todavía, pero todavía permite la verificación.
Por razones de seguridad, es conveniente verificar la integridad del código antes de la ejecución, evitando que un atacante manipule el software falsificado . Entonces, mi pregunta es
¿Cómo firmar código ejecutable y ejecutar solo software confiable bajo Linux?
He leído el trabajo de van Doom et al. , Diseño e implementación de ejecutables firmados para Linux y el TLC de IBM (Trusted Linux Client) de Safford & Zohar. TLC usa el controlador TPM, lo que es bueno, pero el artículo es de 2005 y no pude encontrar alternativas actuales.
¿Conoces otras opciones?
ACTUALIZACIÓN : ¿Y sobre otros sistemas operativos? OpenSolaris? Familia BSD?
Echa un vistazo a la medusa DS9 . Jugué con él hace mucho ( mucho ) tiempo, pero si recuerdo correctamente, podría registrar binarios específicos y no se permitió ninguna modificación a nivel del kernel. Por supuesto, se puede anular con el acceso local a la máquina, pero no fue realmente fácil. Hay un demonio inteligente, llamado agente, que comprueba todo lo que sucede en la máquina y si ocurre algo fuera de lo común, comienza a gritar.
El modelo GNU / Linux / FOSS en realidad fomenta la manipulación, por así decirlo. Los usuarios y los fabricantes de dispositivos deben ser libres de modificar (manipular) el software para satisfacer sus necesidades. Incluso la simple compilación del software (sin cambiar el código fuente) para la personalización es algo que se hace con bastante frecuencia, pero podría romper la firma de código binario. Como resultado, el modelo de firma de código binario no es particularmente adecuado para GNU / Linux / FOSS.
En su lugar, este tipo de software se basa más en la generación de firmas y / o hashes seguros de los paquetes de origen. En combinación con un modelo de distribución de paquetes confiable y confiable, esto se puede hacer tan seguro (si no más, con respecto a la transparencia en el código fuente) como la firma de código binario.
Me doy cuenta de que esta es una pregunta antigua, pero acabo de encontrarla.
Escribí un soporte ejecutable firmado para el kernel de Linux (alrededor de la versión 2.4.3) hace un tiempo, e instalé toda la cadena de herramientas para firmar los ejecutables, verificando las firmas en el momento execve(2)
, almacenando en caché la información de validación de firma (borrando la validación cuando el archivo se abrió para escritura o se modificó de otra manera), incrustando las firmas en programas ELF arbitrarios, etc., introdujo algunas penalizaciones de rendimiento en la primera ejecución de cada programa (porque el núcleo tenía que cargarse en el archivo completo , en lugar de solo solicite las páginas necesarias), pero una vez que el sistema estuvo en estado estable, funcionó bien.
Pero decidimos dejar de perseguirlo porque enfrentaba varios problemas que eran demasiado grandes para justificar la complejidad:
Todavía no habíamos construido soporte para bibliotecas firmadas . Las bibliotecas firmadas requerirían también la modificación del cargador
ld.so
y eldlopen(3)
. Esto no fue imposible, pero complicó la interfaz: ¿deberíamos hacer que el cargador solicite al kernel que valide una firma o que el cálculo se realice completamente en el espacio del usuario? ¿Cómo se protegería contra un procesostrace(2)
d si esta parte de la validación se realiza en el espacio de usuario? ¿Nosstrace(2)
obligados a prohibirstrace(2)
completamente en tal sistema?¿Qué haríamos con los programas que suministran su propio cargador ?
Una gran cantidad de programas están escritos en lenguajes que no se compilan en objetos ELF. Deberíamos proporcionar modificaciones específicas del idioma a
bash
,perl
,python
,java
,awk
,sed
, etc., para que cada intérprete pueda validar firmas. Dado que la mayoría de estos programas son de texto simple en formato libre, carecen de la estructura que hizo que la incorporación de firmas digitales en archivos de objetos ELF sea tan fácil. ¿Dónde se guardarán las firmas? En los guiones? ¿En atributos extendidos? ¿En una base de datos externa de firmas?Muchos intérpretes están muy abiertos acerca de lo que permiten;
bash(1)
puede comunicarse con sistemas remotos completamente por su cuenta utilizandoecho
y/dev/tcp
, y puede ser fácilmente engañado para ejecutar cualquier cosa que un atacante necesite hacer. Firmado o no, no podías confiar en ellos una vez que estuvieran bajo el control de un hacker.El principal motivador para el soporte de ejecutables firmados proviene de los rootkits que reemplazan el sistema provisto por
/bin/ps
,/bin/ps
,/bin/kill
, etc. Sí, hay otras razones útiles para tener ejecutables firmados. Sin embargo, los rootkits se volvieron significativamente más impresionantes con el tiempo, y muchos se basaron en hacks del núcleo para ocultar sus actividades a los administradores. Una vez que el kernel ha sido hackeado, todo el juego ha terminado. Como resultado de la sofisticación de los rootkits, las herramientas que esperábamos evitar que se utilizaran se estaban perdiendo en la comunidad hacker.La interfaz de carga del módulo del kernel estaba abierta. Una vez que un proceso tiene privilegios de
root
, fue fácil inyectar un módulo del kernel sin ninguna comprobación. También podríamos haber escrito otro verificador para los módulos del kernel, pero la infraestructura del kernel alrededor de los módulos era muy primitiva.
Nunca lo he probado, pero eche un vistazo a: http://blog.codenoise.com/signelf-digitally-signing-elf-binaries . La solución funciona sin necesidad de soporte del núcleo, y parece que está listo para funcionar.
El código para el firmante se puede encontrar en http://sourceforge.net/projects/signelf/
No resuelve la pregunta "Ejecutar solo código de confianza en Linux", pero sí resuelve parcialmente el problema al hacer que el programa detecte una posible manipulación / corrupción.
Puedo responder a la pregunta desde la perspectiva del SO Solaris 10 y 11, todos los binarios están firmados. Para verificar la firma use ''elfsign'' ...
$ elfsign verify -v /usr/bin/bash
elfsign: verification of /usr/bin/bash passed.
format: rsa_sha1.
signer: O=Oracle Corporation, OU=Corporate Object Signing, OU=Solaris Signed Execution, CN=Solaris 11.
signed on: Fri Oct 04 17:06:13 2013.
Oracle también ha agregado recientemente un proceso de arranque verificado para Solaris 11, para más detalles, vea - Introducción a Solaris Verified Boot
Hay algunas bifurcaciones de grado de producción del código de OpenSolaris, tres que vale la pena investigar son Illumos, SmartOS y OmniOS.
http://en.wikipedia.org/wiki/PKCS
Utilice un signo de PKCS7 (S / MIME). Genere su propio par certificado / clave privada, firme automáticamente el certificado y luego firme su archivo con la clave privada y el certificado utilizando PKCS7. Le adjuntará el certificado, y luego puede comprobarse a sí mismo en tiempo de ejecución con el comando openssl (man smime o simplemente ayuda con openssl). Esto es a prueba de manipulaciones porque aunque la clave pública está en los archivos que usted entrega, la firma S / MIME para esa clave pública solo puede generarse con la clave privada que no distribuirá. Entonces, si el archivo está firmado por su certificado, debe haber sido firmado por alguien con la clave privada y, dado que no le dio la clave privada a nadie, debe provenir de usted.
Aquí es cómo hacer el certificado autofirmado.
http://www.akadia.com/services/ssh_test_certificate.html
Tendrá que convencer a openssl para que confíe en su certificado como raíz de autoridad (-CAfile), luego verifíquelo como la raíz, y también verifique que el certificado del archivo sea suyo (hash the cert) y verifique el hash. Tenga en cuenta que aunque no está documentado, el estado de salida de openssl refleja la validez de la señal que está verificando al realizar una verificación smime. Es 0 si coincide, no cero si no coincide.
Tenga en cuenta que todo esto no es seguro porque si el cheque está en su código, pueden simplemente quitar el cheque si quieren vencerlo. La única forma segura de hacerlo sería tener el comprobador en el sistema operativo y hacer que compruebe su binario y se niegue a ejecutarlo si no está firmado. Pero como no hay un verificador en el sistema operativo y Linux puede modificarse para eliminarlo / ignorarlo de todos modos ... Lo que es realmente bueno es detectar archivos corruptos más que tratar de evitar que la gente lo omita.
El módulo del kernel DigSig implementa la verificación de los binarios firmados por una herramienta llamada bsign
. Sin embargo, no se ha realizado ningún trabajo desde la versión 2.6.21 del kernel de Linux.