Circ贸n? Que es esto
En agosto de 2016, sin ning煤n anuncio oficial de Google, se descubrieron las fuentes del nuevo sistema operativo.
Fucsia. Este sistema operativo se basa en un microkernel llamado Zircon, que a su vez se basa en LK (Little Kernel) .
Fuchsia no es Linux
驴Qu茅 se discutir谩 en el art铆culo?
vDSO en Zircon es el 煤nico medio para acceder a las llamadas del sistema (syscalls) .
驴Es realmente imposible llamar directamente a las instrucciones del procesador SYSENTER / SYSCALL desde nuestro c贸digo? No, estas instrucciones de procesador no forman parte del sistema ABI. El c贸digo de usuario tiene prohibido seguir directamente estas instrucciones.
Aquellos que quieran conocer m谩s detalles sobre este paso arquitect贸nico, los invito a Cat.

Zircon vDSO (objeto virtual compartido din谩mico)
El acr贸nimo vDSO significa V ithual D din谩mico S hared O bject:
- Dynamic Shared Object es un t茅rmino utilizado para referirse a bibliotecas compartidas para el formato ELF (archivos .so).
- Este objeto es virtual porque no se carga desde un archivo separado existente en el sistema de archivos. La imagen vDSO es proporcionada directamente por el n煤cleo.
Soporte de kernel
El soporte para vDSO como el 煤nico ABI controlado para aplicaciones en modo de usuario se implementa de dos maneras:
Proyectar un objeto de memoria virtual ( VMO, objeto de memoria virtual ).
Cuando zx_vmar_map procesa VMO para vDSO (y ZX_VM_PERM_EXECUTE
solicita ZX_VM_PERM_EXECUTE
en los argumentos), el n煤cleo requiere que el desplazamiento y el tama帽o coincidan estrictamente con el segmento ejecutable de vDSO. Esto (incluido) garantiza solo una proyecci贸n vDSO en la memoria del proceso. Despu茅s de la primera proyecci贸n exitosa de vDSO en el proceso, ya no se puede eliminar. Y un intento de volver a proyectar vDSO en la memoria del proceso, intenta eliminar el VMO proyectado para vDSO o el proyecto con el desplazamiento y / o tama帽o incorrecto falla con el error ZX_ERR_ACCESS_DENIED
.
El desplazamiento y el tama帽o del c贸digo vDSO se extraen en la etapa de compilaci贸n del archivo ELF y luego se utilizan en el c贸digo del n煤cleo para realizar las comprobaciones anteriores. Despu茅s de la primera proyecci贸n exitosa de vDSO, el n煤cleo del sistema operativo recuerda la direcci贸n del proceso de destino para acelerar las comprobaciones.
Verifique las direcciones de retorno para las funciones de llamada del sistema.
Cuando el c贸digo de modo de usuario llama al n煤cleo, se transmite un n煤mero de llamada de sistema de bajo nivel en el registro. Las llamadas de sistema de bajo nivel son la interfaz interna (privada) entre vDSO y el n煤cleo Zircon. Algunos (la mayor铆a) corresponden directamente a las llamadas del sistema de la ABI p煤blica, mientras que otros no.
Para cada llamada de sistema de bajo nivel en el c贸digo vDSO, hay un conjunto fijo de compensaciones en el c贸digo que realiza esta llamada. El c贸digo fuente de vDSO define caracteres internos que identifican cada una de esas ubicaciones. En el momento de la compilaci贸n, estas ubicaciones se recuperan de la tabla de s铆mbolos vDSO y se utilizan para generar el c贸digo del n煤cleo que determina la predicci贸n de la validez de la direcci贸n del c贸digo para cada llamada de sistema de bajo nivel. Estos predicados le permiten verificar r谩pidamente la validez del c贸digo de llamada, dado el desplazamiento desde el comienzo del segmento de c贸digo vDSO.
Si el predicado determina que el c贸digo de llamada no tiene permiso para realizar una llamada al sistema, se genera una excepci贸n sint茅tica, similar a la de si el c贸digo de llamada intentara ejecutar una instrucci贸n inexistente o privilegiada.
vDSO al crear un nuevo proceso
Para iniciar la ejecuci贸n del primer subproceso de un proceso reci茅n creado, se utiliza la llamada al sistema zx_process_start . El 煤ltimo par谩metro de esta llamada al sistema (ver arg2 en la documentaci贸n) pasa el argumento para el primer hilo del proceso creado. Seg煤n el acuerdo aceptado, el cargador del programa asigna vDSO al espacio de direcciones del nuevo proceso (a un lugar aleatorio seleccionado por el sistema) y transfiere la direcci贸n base de la asignaci贸n con el argumento arg2 al primer subproceso del proceso creado. Esta direcci贸n es la direcci贸n del encabezado del archivo ELF, en el que se pueden encontrar las funciones con nombre necesarias para realizar llamadas al sistema.
Tarjeta de memoria (dise帽o) vDSO
vDSO es una biblioteca compartida EFL regular que puede considerarse como cualquier otra. Pero para vDSO, se selecciona intencionalmente un peque帽o subconjunto de todo el formato ELF. Esto tiene varias ventajas:
- El mapeo de dicho ELF en el proceso es simple y no incluye ning煤n caso l铆mite complejo que se requiera para apoyar completamente los programas ELF.
- El uso de vDSO no requiere un enlace ELF din谩mico completamente funcional. En particular, vDSO no tiene reubicaciones din谩micas. Proyectar segmentos PT_LOAD de un archivo ELF es la 煤nica acci贸n requerida.
- El c贸digo vDSO no tiene estado y es reentrante. Funciona exclusivamente con registros de procesador y la pila. Esto lo hace adecuado para su uso en una amplia variedad de contextos con restricciones m铆nimas, que cumple con el sistema operativo ABI obligatorio. Tambi茅n simplifica el an谩lisis de c贸digo y la verificaci贸n de confiabilidad y seguridad.
Toda la memoria vDSO est谩 representada por dos segmentos consecutivos, cada uno de los cuales contiene p谩ginas enteras alineadas:
- El primer segmento es de solo lectura e incluye encabezados ELF y datos constantes.
- El segundo segmento es ejecutable y contiene c贸digo vDSO.
Toda la imagen vDSO consta de solo las p谩ginas de estos dos segmentos. Solo se requieren dos valores extra铆dos de los encabezados ELF para mostrar la memoria vDSO: el n煤mero de p谩ginas en cada segmento.
Datos constantes del tiempo de arranque del sistema operativo
Algunas llamadas al sistema simplemente devuelven valores que son constantes (los valores deben solicitarse en tiempo de ejecuci贸n y no pueden compilarse en el c贸digo de modo de usuario). Estos valores son fijos en el n煤cleo en el momento de la compilaci贸n, o determinados por el n煤cleo en el momento del arranque (par谩metros de arranque y par谩metros de hardware). Por ejemplo: zx_system_get_version () , zx_system_get_num_cpus () y zx_ticks_per_second () . El valor de retorno de la 煤ltima funci贸n, por ejemplo, se ve afectado por el par谩metro de l铆nea de comando del n煤cleo .
Espera, 驴es constante el n煤mero de CPU?Curiosamente, la descripci贸n de la funci贸n zx_system_get_num_cpus () tambi茅n establece expl铆citamente que el sistema operativo no admite el intercambio en caliente del n煤mero de procesadores:
Este n煤mero no puede cambiar durante una ejecuci贸n del sistema, solo en el momento del arranque.
Esto, al menos, indica indirectamente que el sistema operativo no est谩 posicionado como un servidor.
Como estos valores son constantes, no tiene sentido pagar las llamadas reales del sistema al n煤cleo del sistema operativo. En cambio, su implementaci贸n son funciones simples de C ++ que devuelven datos le铆dos del segmento constante vDSO. Los valores capturados durante la compilaci贸n (como la cadena de versi贸n del sistema) simplemente se compilan en vDSO.
Para valores determinados en el momento del arranque, el n煤cleo debe modificar el contenido de vDSO. Esto se realiza utilizando un c贸digo ejecutable temprano que forma el VMO vDSO antes de que el n煤cleo inicie el primer proceso de usuario (y le pase el descriptor de VMO). Durante la compilaci贸n, las compensaciones de la imagen vDSO ( vdso_constants ) se extraen del archivo ELF y luego se incrustan en el n煤cleo. Y en el momento del arranque, el n煤cleo muestra temporalmente p谩ginas que abarcan vdso_constants en su propio espacio de direcciones para preinicializar la estructura con los valores correctos (para el inicio actual del sistema).
驴Por qu茅 todo este dolor de cabeza ?
Una de las razones m谩s importantes es la seguridad. Es decir, si un atacante logra ejecutar c贸digo arbitrario (shell), tendr谩 que usar funciones vDSO para llamar a las funciones del sistema. El primer obst谩culo ser谩 la aleatorizaci贸n antes mencionada de la direcci贸n de inicio de vDSO para cada proceso creado. Y dado que el kernel del sistema operativo es responsable del VMO (objeto de memoria virtual) de vDSO, puede elegir asignar un vDSO completamente diferente a un proceso espec铆fico, lo que proh铆be las llamadas de sistema peligrosas (y no necesarias para un proceso en particular). Por ejemplo: puede evitar que los controladores generen procesos secundarios o manejar 谩reas MMIO proyectadas. Esta es una gran herramienta para reducir la superficie de ataque.
Nota: Actualmente, el soporte para varios vDSO se est谩 desarrollando activamente. Ya existe una implementaci贸n de prueba de concepto y pruebas simples, pero se necesita m谩s trabajo para mejorar la confiabilidad de la implementaci贸n y determinar qu茅 opciones est谩n disponibles. El concepto actual proporciona opciones de imagen vDSO que solo exportan un subconjunto de la interfaz de llamada completa del sistema vDSO.
驴Qu茅 pasa con otros sistemas operativos?Cabe se帽alar que t茅cnicas similares ya se han utilizado con 茅xito en otros sistemas operativos. Por ejemplo, en Windows hay un ProcessSystemCallDisablePolicy :
Restricci贸n de desactivaci贸n de llamadas del sistema Win32k para restringir la capacidad de usar NTUser y GDI