La función Transmutar en Smack resuelve el problema de dos aplicaciones que se ejecutan con diferentes reglas de Smack que comparten datos en un solo directorio. En primer lugar, ambas aplicaciones necesitan escribir ('w') y ejecutar ('x') acceso a la etiqueta del directorio para poder escribir en él. Pero los archivos que se crearían tendrían la etiqueta Smack del proceso que los creó. Si una de las dos aplicaciones quisiera acceder a los archivos en ese directorio que fueron creados por la otra aplicación, necesitaría acceso a la etiqueta de la otra aplicación.
Para resolver eso, Smack proporciona la función de transmutación. Se necesitan dos partes:
- Las aplicaciones que escriben en el directorio deben tener acceso 't' a la etiqueta del directorio.
- El directorio debe tener un atributo de transmutación. Si es un directorio ordinario, establezca el atributo con security.SMACK64TRANSMUTE xattr establecido en "TRUE", o más sencillo con el comando "chsmack -t". Si el directorio es un punto de montaje (como / run en su ejemplo de Tizen), puede montarse con la opción de montaje smackfstransmute="some_label" para darle la etiqueta Smack deseada y habilitar la transmisión.
Esto permitirá la transmutación, afectando a las etiquetas Smack de los archivos recién creados en ese directorio. Cada archivo creado allí por una de las aplicaciones ahora obtendrá la etiqueta Smack del directorio en lugar de la etiqueta Smack del proceso que lo creó. Y cada subdirectorio creado en ese directorio también obtendrá un atributo de transmutación.
Déjame mostrar un ejemplo:
# mkdir /tmp/test
# chsmack -a dir_label /tmp/test
# chsmack /tmp/test
/tmp/test access="dir_label"
# echo "process_label dir_label wx" | smackload
# echo process_label >/proc/self/attr/current
Con el directorio / tmp / test con la etiqueta "dir_label" y el shell actual ejecutándose con la etiqueta "process_label", veamos cómo se etiquetarán los nuevos archivos y directorios:
# touch /tmp/test/file1
# mkdir /tmp/test/dir1
# chsmack /tmp/test/file1 /tmp/test/dir1
/tmp/test/file1 access="process_label"
/tmp/test/dir1 access="process_label"
Vamos a habilitar transmutar:
# chsmack -t /tmp/test
# chsmack /tmp/test
/tmp/test/ access="dir_label" transmute="TRUE"
# echo "process_label dir_label wxt" | smackload
Y transmutar en acción:
# touch /tmp/test/file2
# mkdir /tmp/test/dir2
# chsmack /tmp/test/file2 /tmp/test/dir2
/tmp/test/file2 access="dir_label"
/tmp/test/dir2 access="dir_label" transmute="TRUE"