it-swarm.dev

Quanto è sicura la "voce tastiera protetta" nel terminale di Mac OS X?

Uso Terminal in Mac OS X da anni, ma in qualche modo mi è sfuggito individuare questa funzione:

Secure Keyboard Entry in Terminal

Ora mi chiedo come funziona davvero ed è sicuro al 100%? In caso contrario, quale tecnica potrebbe essere utilizzata per ottenere ancora i tasti?

39
Ivan Kovacevic

"Secure Keyboard Entry" si associa alla funzione EnableSecureEventInput il cui concetto è descritto qui . Fondamentalmente, le applicazioni non accedono all'hardware stesso; ottengono eventi (ad es. sui tasti premuti) dal sistema operativo. Alcuni elementi nel sistema operativo decidono quale applicazione ottiene quali eventi, a seconda dei diritti di accesso e dello stato della GUI (ci sono dettagli che dipendono dall'applicazione "in primo piano").

Le applicazioni possono "spiare" l'una sull'altra, il che significa (in questo caso) che un'applicazione in esecuzione sulla macchina può chiedere al sistema operativo di inviargli una copia di tutti i tasti premuti anche se sono pensati per un'altra applicazione e/o iniettare eventi sintetici propri. Questa è una caratteristica: consente cose come "portafogli password" (che inseriscono una password come se fosse stata digitata dall'utente, dal punto di vista dell'applicazione) o "Keyboard Viewer "(la tastiera basata sulla GUI che consente di" digitare "i caratteri con il mouse e mostra anche quali tasti vengono effettivamente premuti in qualsiasi momento). EnableSecureEventInput blocca questa funzione per l'applicazione che la chiama. Provalo ! Esegui Terminal.app, abilita "Keyboard Viewer" e vedi che abilitare "Secure Keyboard Entry" impedisce a Keyboard Viewer di fare il suo lavoro.

Tutto questo instradamento degli eventi viene eseguito in alcuni processi dello spazio utente che viene eseguito come root. Questo si basa sulla separazione dei processi applicata dal kernel: il normale processo utente non può giocherellare a piacimento con la memoria allocata per un processo di root. Il kernel stesso non è a conoscenza del concetto di "evento" a livello di utente. La gestione degli eventi, in particolare l'applicazione (o meno) di EnableSecureEventInput, è fatta da un codice non kernel.

Un estratto interessante della pagina collegata sopra è il seguente:

L'implementazione originale di EnableSecureEventInput era tale che quando un processo abilitava l'immissione sicura dell'input e aveva lo stato attivo della tastiera, gli eventi della tastiera non venivano passati ai processi di intercettazione. Tuttavia, se il processo di immissione sicura fosse spostato in background, il sistema continuerebbe a passare gli eventi della tastiera a questi processi di intercettazione, poiché il focus della tastiera non era più su un processo di immissione sicura.

Recentemente, è stata rilevata una falla di sicurezza che ha permesso a un processo di intercettazione di acquisire eventi da tastiera, anche nei casi in cui era abilitato l'input di eventi sicuri e il processo di input di eventi sicuri era in background. La correzione di questo problema è di interrompere il passaggio degli eventi della tastiera a qualsiasi processo di intercettazione ogni qualvolta un processo ha abilitato l'input di eventi sicuri, indipendentemente dal fatto che tale processo sia in primo piano o in background. Ciò significa che un processo che abilita l'input di eventi sicuro e lascia abilitato l'input di eventi sicuro per la durata del programma, può influire su tutti i processi di intercettazione della tastiera, anche quando il processo di eventi sicuri è stato spostato in background.

Ciò significa che il sistema di routing degli eventi ha effettivamente sbagliato nella prima installazione della funzionalità. Questo dovrebbe ora essere risolto.

Anche supponendo che il routing degli eventi sia ora corretto e sicuro, il che significa che la semantica di EnableSecureEventInput è davvero applicata, quindi devi capire che questo è completamente relativo al sistema di separazione dei processi. Qualsiasi processo di root può ispezionare e modificare a piacere la memoria di tutti gli altri processi, e in particolare vedere tutti gli eventi; e un processo di root può anche agganciarsi al kernel e ispezionare i dati effettivi dalla tastiera bypassando completamente la nozione di evento. Un key logger che può essere installato come root farà proprio questo, e "Secure Keyboard Entry" sarà indifeso nei suoi confronti. Vedi questo per una prova del concetto opensource.

Pertanto, "Secure Keyboard Entry" è sicuro solo contro gli aggressori che potrebbero eseguire alcuni codici propri sulla macchina, ma che non potrebbero innalzare i loro privilegi locali a livello di root. Questo è uno scenario piuttosto restrittivo, poiché l'escalation dei privilegi locali tende a essere possibile su base generale:

  • Il processo locale può vedere molte macchine, quindi il "perimetro di sicurezza" da difendere è enorme in quel caso. Prevenire l'intrusione da remoto attaccanti è molto più semplice, eppure già abbastanza difficile.

  • Apple tende a mostrare alcuni mancanza di reattività nel caso di buchi di escalation di privilegi locali.


Riepilogo: Troverei eccessivamente ottimista ritenere che "Secure Keyboard Entry" fornisca una sicurezza sufficiente contro i key logger su, diciamo, i computer condivisi pubblici. Non è una cattiva funzionalità, ma mantiene le sue promesse solo se root e il kernel sono privi di alterazioni dannose, e questo è un "se" molto grande.

58
Tom Leek

C'è qualcos'altro da tenere a mente e, mi sembra, non molto apprezzato: sui sistemi POSIX, qualsiasi terminale ha il suo dispositivo "teletype". E ogni processo che esegui può leggere da quel dispositivo, indipendentemente dal fatto che tu abiliti "Secure Keyboard Entry." (Linus Åkesson fornisce un riepilogo di come i sistemi Unix gestiscono i dispositivi terminali =.)

I nomi e le autorizzazioni per tali dispositivi variano tra i sistemi. macOS, dalla versione 10.14, li nomina tty[p-w][0-f]{1,3} e concede l'accesso in lettura/scrittura all'utente che esegue il terminale (e l'accesso in sola scrittura ai membri del gruppo tty).

Puoi provare tu stesso attivando "Secure Keyboard Entry" in, diciamo, iTerm.app, chiamando tty per vedere il dispositivo terminale che sta usando, e quindi aprendo, diciamo, Terminal.app e lettura da quel dispositivo usando cat. Scoprirai che iTerm.app riceve alcuni caratteri e Terminal.app altri.

iTerm.appTerminal.app

1
Odin Kroeger