2009-07-09 12 views
10

Sto usando OS X 10.5 e sto cercando un modo per rilevare se un'applicazione tenta di accedere a Internet. A questo punto vorrei bloccare l'applicazione se corrisponde a un insieme di regole che definirò.Blocca l'accesso dell'applicazione alla rete tramite un'API Cocoa (API LittleSnitch)?

C'è il comando ipfw Unix che realizzo può essere utilizzato per bloccare l'accesso a determinate porte, ma che riguarda TUTTE le applicazioni. Ho letto le pagine man e non ho visto un modo per utilizzare ipfw per bloccare l'accesso, ma limitarlo a un'applicazione specifica .

Il mio problema principale consiste nel rilevare quale applicazione sta cercando di ottenere un accesso esterno alla rete. A livello di codice ci deve essere un modo per farlo, sia che si tratti di un comando API Mac OS X o di un comando Unix come può essere realizzato?

Aggiornamento: Essenzialmente voglio fare quello che fa Little Snitch, ma voglio scrivere da zero me stesso perché non mi piace Little Snitch. Ho solo bisogno di sapere quali API possono permettermi di realizzare il sandboxing della rete di applicazioni e come funziona esattamente Little Snitch?

risposta

9

Mi rendo conto che è un anno in ritardo, ma stavo scavando per qualcosa di simile e mi sono imbattuto in quella che penso sia la risposta. Speriamo che questo possa aiutare qualcun altro sulla linea.

Little Snitch sembra utilizzare Network Kernel Extensions per filtrare il traffico proveniente dal sistema. Ho convalidato il presente, scoprendo che installa un estensione del kernel sulla scatola:

[~] kextstat 
... 
55 0 0x687000 0x2b000 0x2a000 at.obdev.nke.LittleSnitch (2.0.46) <7 6 5 4 2> 
... 

Se a livello di codice si desidera impedire l'accesso alla rete a un'altra applicazione, questa sembra essere la soluzione migliore. Se si desidera semplicemente monitorare l'utilizzo della rete da parte di altre app, tuttavia, sono disponibili altre opzioni, ad esempio libpcap.

+0

Sì un anno di ritardo. La cintura di sicurezza non è la risposta. Questo e 'esattamente quello che stavo cercando. Qui, avere un segno di spunta e un +1 –

+0

È possibile scrivere l'estensione del kernel in una lingua diversa da Objective-C o Swift, ad esempio, C++ o Rust? – securecurve

2

Se si sta prendendo di mira OS X 10.5 (Leopard), è possibile utilizzare l'API sandboxing. sandbox_init è probabilmente un buon punto di partenza; è possibile utilizzare l'opzione kSBXProfileNoInternet per interrompere l'accesso a Internet.

C'è anche un articolo più dettagliato here che fornisce alcuni esempi di controllo più fine a grana fine utilizzando le estensioni .

+0

grazie. È un puntatore nella giusta direzione almeno –

1

L'Application Firewall in Mac OS X 10.5 fa qualcosa di simile, ma attualmente Apple supporta solo l'utilizzo per consentire/bloccare applicazioni specifiche dall'accettazione di connessioni in entrata . Questo viene fatto attraverso un'estensione del kernel, che è controllata attraverso il demone /usr/libexec/ApplicationFirewall/socketfilterfw, che a sua volta è configurato usando il pannello delle preferenze del firewall.

0

Spiacente, la domanda non chiarisce se si desidera scrivere il proprio programma per risolvere questo bisogno, o se si sta semplicemente chiedendo se c'è già qualche programma là fuori per riempire lo stesso ruolo.

Se è quest'ultimo, allora Little Snitch fa esattamente quello che chiedi. Ti dirà quale applicazione sta tentando di accedere a Internet esterno e ti darà la possibilità di consentire l'accesso o negarlo in base a un set di regole. Tuttavia non è completamente automatico.

+0

A livello di codice deve esserci un modo per farlo, sia che si tratti di un comando API Mac OS X o di un comando Unix come può essere realizzato? --- Ho pensato che fosse abbastanza chiaro. –

+0

Ok, ho aggiornato la mia domanda per renderla più chiara per te –

1

Non è possibile che un processo dello spazio utente sia in grado di eseguire ciò che viene descritto. Suppongo che nemmeno i processi vengano eseguiti come root. Ricorda: non stiamo eseguendo Windows qui.E anche se così fosse, probabilmente non dovresti aspettarti che Cocoa lo sostenga. Cocoa è per la GUI - roba di facile utilizzo di Mac OS X. Non per lo sviluppo di sistemi di basso livello.

L'unico modo per realizzare ciò che descrivi è estendere il kernel, che è quello che fa Little Snitch. Se ci fosse un altro modo intelligente, ti assicuro che Little Snitch l'avrebbe fatto diversamente. Le estensioni del kernel non sono per deboli di cuore. Quando un'estensione del kernel si blocca, l'intero sistema crashes. Quindi è meglio che tu sappia cosa fai.

È possibile, tuttavia, ottenere informazioni sui processi e le loro prese dallo spazio utente, ma senza utilizzare Cocoa. E solo i processi dell'utente, se la tua applicazione non è in esecuzione come root. Devi usare libproc, che non è documentato da Apple. Dovrai capire come lo fa lsof. E il tuo ancora non è in grado di manomettere quello che ottieni.

Immagino sia meglio usare solo Little Snitch. Il sovraccarico aggiunto da Little Snitch è marginalmente piccolo e te lo assicuro, non sentirai la differenza. Si limita a trattenere la connessione socket, fino a quando una decisione è stata presa - da te o dal software.

Se, tuttavia, dovresti comunque provare la tentazione di scrivere le tue estensioni del kernel, lo The Network Kernel Extension Programming Guide di Apple è ciò di cui hai bisogno. La sezione su "Socket Filters" descrive le interfacce utilizzate da Little Snitch.