2009-07-09 9 views
10

Estoy usando OS X 10.5 y estoy buscando una manera de detectar si una aplicación intenta acceder a Internet. En este punto, me gustaría bloquear la aplicación si coincide con un conjunto de reglas que definiré.Bloquear el acceso a la aplicación a la red a través de una API Cocoa (API LittleSnitch)?

Existe el comando ipfw Unix que me doy cuenta que se puede usar para bloquear el acceso a ciertos puertos, pero eso afecta TODAS las aplicaciones. Leí las páginas man y no vi una forma de usar ipfw para bloquear el acceso, pero lo limito a una aplicación específica.

Mi problema principal consiste en detectar qué aplicación está tratando de obtener acceso externo a la red. Programado debe haber una manera de hacer esto, ya sea mediante el uso de algún Mac OS X API o comando de Unix, ¿cómo se puede lograr esto?

Actualización: Básicamente quiero hacer lo que hace Little Snitch, pero quiero escribir desde cero a mí mismo porque no me gusta Little Snitch. Solo necesito saber qué API puede permitirme cumplir con el sandboxing de la red de aplicaciones y cómo hace exactamente Little Snitch esto?

Respuesta

9

Me doy cuenta de que este es un año tarde, pero estaba buscando algo similar y encontré lo que creo que es la respuesta. Con suerte, esto podría ayudar a alguien más en la línea.

Parece que Little Snitch usa Network Kernel Extensions para filtrar el tráfico que ingresa al sistema. He validado este mediante el descubrimiento de que se instale una extensión del kernel en la caja:

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

Si desea mediante programación para impedir el acceso a la red a otra aplicación, esta parece ser la mejor opción. Sin embargo, si simplemente desea monitorear el uso de la red por otras aplicaciones, tiene otras opciones, como libpcap.

+0

Sí, un año tarde. El cinturón de seguridad no es la respuesta. Esto es exactamente lo que estaba buscando. Aquí, tiene un tic y un +1 –

+0

¿Es posible escribir la extensión Kernel en un idioma distinto de Objective-C o Swift, por ejemplo, C++ o Rust? – securecurve

2

Si su objetivo es OS X 10.5 (Leopard), puede utilizar la API de sandboxing. sandbox_init es probablemente un buen lugar para comenzar; puede usar la opción kSBXProfileNoInternet para detener el acceso a Internet.

También hay un artículo más detallado here que ofrece algunos ejemplos de control más fino utilizando las extensiones Cinturón de seguridad.

+0

gracias. Es un puntero en la dirección correcta al menos –

1

Application Firewall en Mac OS X 10.5 hace algo similar, pero actualmente Apple solo admite su uso para permitir/bloquear aplicaciones específicas para que acepten conexiones entrantes. Esto se hace a través de una extensión de kernel, que se controla a través del daemon /usr/libexec/ApplicationFirewall/socketfilterfw, que a su vez se configura utilizando el panel de Preferencias del Firewall.

0

Disculpe, la pregunta no deja en claro si desea escribir su propio programa para resolver esta necesidad, o si simplemente está preguntando si ya hay algún programa para completar el mismo rol.

Si es el último, entonces Little Snitch hace exactamente lo que usted pregunta. Le indicará qué aplicación está intentando acceder a Internet y le dará la opción de permitir el acceso o denegarlo en función de un conjunto de reglas. Aunque no es completamente automático.

+0

. Debe haber una forma de hacerlo programáticamente, ya sea mediante el uso de alguna API Mac OS X o un comando Unix, ¿cómo se puede lograr esto? --- Pensé que eso lo dejaba bastante claro. –

+0

De acuerdo, he actualizado mi pregunta para que quede más clara para usted –

1

No hay forma de que un proceso de espacio de usuario pueda hacer lo que usted describe. Supongo que ni siquiera los procesos se ejecutan como root. Recuerde: no estamos ejecutando Windows aquí.E incluso si es así, probablemente no deberías esperar que Cocoa lo respalde. Cocoa es para las cosas fáciles de usar de la GUI de Mac OS X. No para el desarrollo de sistemas de bajo nivel.

La única manera de lograr lo que describes, es ampliar el kernel, que es lo que hace Little Snitch. Si hubiera alguna otra manera inteligente, te aseguro que Little Snitch lo habría hecho de manera diferente. Las extensiones Kernel no son para corazones débiles. Cuando una extensión del kernel falla, todo el sistema crashes. Entonces es mejor que sepas lo que haces.

Sin embargo, puede obtener información sobre los procesos y sus tomas del espacio de usuario, pero no utiliza Cocoa. Y solo los procesos del usuario, si su aplicación no se ejecuta como raíz. Necesita usar libproc, que no está documentado por Apple. Tendrás que averiguar cómo lo hace lsof. Y todavía no puedes manipular lo que obtienes.

Supongo que es mejor que solo use Little Snitch. La tara añadida por Little Snitch es marginalmente pequeña y te lo prometo, no notarás la diferencia. Simplemente retiene la conexión del zócalo, hasta que se haya tomado una decisión: usted o el software.

Si, sin embargo, aún así debería sentirse tentado de escribir sus propias extensiones de kernel, The Network Kernel Extension Programming Guide de Apple es lo que necesita. La sección de "Socket Filters" describe las interfaces que usa Little Snitch.

Cuestiones relacionadas