La funzionalità di trasmissione di Smack risolve un problema di due applicazioni in esecuzione con regole Smack diverse che condividono i dati in una singola directory. Prima di tutto, entrambe le applicazioni devono scrivere ('w') ed eseguire ('x') l'accesso all'etichetta della directory per poter scrivere in essa. Ma i file che verrebbero creati avranno l'etichetta Smack del processo che li ha creati. Se una delle due app desidera accedere a file in quella directory che sono stati creati dall'altra app, è necessario accedere all'etichetta dell'altra app.
Per risolvere ciò, Smack fornisce la funzione di transmutazione. Sono necessarie due parti:
- Le applicazioni che scrivono nella directory devono avere accesso 't' all'etichetta della directory.
- La directory deve avere attributo transmute. Se si tratta di una directory ordinaria, si imposta l'attributo con security.SMACK64TRANSMUTE xattr impostato su "TRUE" o più semplice con il comando "chsmack -t". Se la directory è un punto di mount (come / run nell'esempio Tizen), può essere montata con smackfstransmute="some_label" opzione di mount per dargli l'etichetta Smack desiderata e abilitare transmute.
Questo abiliterà transmute, influenzando le etichette Smack dei nuovi file creati in quella directory. Ogni file creato da una delle app ora otterrà l'etichetta Smack della directory anziché l'etichetta Smack del processo che lo ha creato. E ogni sottodirectory creata in quella directory riceverà anche l'attributo transmute.
Fammi mostrare un esempio:
# 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 directory / tmp / test con etichetta "dir_label" e shell corrente in esecuzione con label "process_label", vediamo come verranno etichettati i nuovi file e le directory:
# 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"
Abilitiamo transmute:
# chsmack -t /tmp/test
# chsmack /tmp/test
/tmp/test/ access="dir_label" transmute="TRUE"
# echo "process_label dir_label wxt" | smackload
E trasmutare in azione:
# 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"