Заблокировать доступ приложения к сети с помощью API Cocoa (API-интерфейсы LittleSnitch)?

Я использую OS X 10.5, и я ищу способ определить, пытается ли приложение получить доступ к Интернету. На этом этапе я хотел бы заблокировать приложение, если оно соответствует набору правил, которые я буду определять.

Существует команда ipfw Unix, которая, как я понимаю, может использоваться для блокировки доступа к определенным портам, но это затрагивает ВСЕ приложения. Я прочитал страницы руководства и не видел способа использовать ipfw для блокировки доступа, но ограничил его конкретным приложением.

Моя основная проблема заключается в обнаружении того приложения, которое пытается получить внешний доступ к сети. Программно там должен быть способ сделать это, будь то с помощью некоторых Mac OS X API или команды Unix, как это можно сделать?

Update: По сути, я хочу делать то, что делает Маленький Снитч, но я хочу написать его с нуля сам, потому что мне не нравится Маленький Снитч. Мне просто нужно знать, какой API может позволить мне выполнить сетевую песочницу приложений и как именно это делает Little Snitch?

Ответ 1

Я понимаю, что это год спустя, но я копался в чем-то подобном и натолкнулся на то, что я считаю ответом. Надеюсь, это может помочь кому-то еще по очереди.

Маленький снитч использует Расширения сетевого ядра для фильтрации трафика, поступающего в систему. Я подтвердил это, открыв, что он устанавливает расширение ядра в поле:

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

Если вы программно хотите предотвратить доступ к сети другому приложению, это, по-видимому, будет вашим лучшим выбором. Однако, если вы просто хотите контролировать использование сети другими приложениями, у вас есть другие параметры, например libpcap.

Ответ 2

Если вы ориентируетесь на OS X 10.5 (Leopard), вы можете использовать API песочницы. sandbox_init, вероятно, это хорошее место для начала; вы можете использовать параметр kSBXProfileNoInternet, чтобы остановить доступ в Интернет.

Существует также более подробная статья здесь, в которой приведены некоторые примеры более мелкозернистого управления с использованием расширений Seatbelt.

Ответ 3

Брандмауэр приложений в Mac OS X 10.5 делает что-то подобное, но в настоящее время Apple поддерживает только его использование, позволяющее/блокировать определенные приложения от приема входящих соединений. Это делается через расширение ядра, которое контролируется через демон /usr/libexec/ApplicationFirewall/socketfilterfw, который, в свою очередь, настроен с использованием панели настроек брандмауэра.

Ответ 4

Невозможно, чтобы процесс пользовательского пространства мог выполнять то, что вы описываете. Я полагаю, что даже процессы не выполняются как root. Помните: здесь мы не запускаем Windows. И даже если это так, вы, вероятно, не должны ожидать поддержки Cocoa. Cocoa предназначен для GUI-простого в использовании материала Mac OS X. Не для разработки низкоуровневой системы.

Единственный способ выполнить то, что вы описываете, - это расширить ядро, что и делает Little Snitch. Если бы был какой-то другой умный способ, я заверяю вас, что Little Snitch сделал бы это по-другому. Расширения ядра не для слабонервных. При сбое расширения ядра вся система сбой. Итак, вы лучше знаете, что вы делаете.

Вы можете, однако, получить информацию о процессах и их сокетах из пользовательского пространства, но не используя Cocoa. И только пользовательские процессы, если ваше приложение не работает как root. Вам нужно использовать libproc, который не документирован Apple. Вам нужно будет выяснить, как это делает lsof. И вы все еще не можете вмешиваться в то, что получаете.

Думаю, тебе лучше всего использовать Little Snitch. Накладные расходы, добавленные Little Snitch, незначительно малы, и я обещаю вам, вы не почувствуете разницы. Он просто сдерживает соединение сокета, пока не будет принято решение - вами или программным обеспечением.

Если, однако, вы все равно должны испытывать соблазн написать свои собственные расширения ядра, Руководство по программированию расширения сетевого ядра от Apple - это то, что вам нужно. Раздел "Socket Filters" описывает интерфейсы Little Snitch.

Ответ 5

Извините, вопрос не дает понять, хотите ли вы написать свою собственную программу для решения этой проблемы или просто спросите, есть ли там какая-либо программа для заполнения той же роли.

Если это последний, то Маленький Снит делает именно то, что вы просите. Он сообщит вам, какое приложение пытается получить доступ к внешнему интернету, и предоставит вам варианты разрешить доступ или отклонить его на основе набора правил. Это не полностью автоматическое, хотя.