12

我正在使用 OS X 10.5,并且正在寻找一种方法来检测应用程序是否尝试访问 Internet。在这一点上,如果应用程序符合我将定义的一组规则,我想阻止它。

我意识到有ipfw Unix 命令可用于阻止对某些端口的访问,但这会影响所有应用程序。我阅读了手册页并没有看到使用 ipfw 阻止访问但将其限制为特定应用程序的方法。

我的主要问题在于检测哪个应用程序试图获得对网络的外部访问。以编程方式必须有一种方法可以做到这一点,无论是通过使用一些 Mac OS X API 还是 Unix 命令如何实现?

更新: 本质上我想做小飞贼所做的,但我想自己从头开始写,因为我不喜欢小飞贼。我只需要知道哪些 API 可以让我完成应用程序网络沙盒以及 Little Snitch 究竟是如何做到的?

4

5 回答 5

13

我意识到这已经晚了一年,但我正在寻找类似的东西并发现了我认为的答案。希望这可以帮助其他人。

Little Snitch 似乎使用网络内核扩展来过滤进入系统的流量。我通过发现它在盒子上安装了一个内核扩展来验证这一点:

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

如果您希望以编程方式阻止对其他应用程序的网络访问,这似乎是您最好的选择。但是,如果您只是想监控其他应用程序的网络使用情况,您还有其他选择,例如libpcap.

于 2010-08-17T02:45:10.333 回答
2

如果您的目标是 OS X 10.5 (Leopard),您可以使用沙盒 API。sandbox_init可能是一个不错的起点;您可以使用该kSBXProfileNoInternet选项停止 Internet 访问。

这里还有一篇更详细的文章,其中提供了一些使用安全带扩展进行更细粒度控制的示例。

于 2009-07-09T19:32:17.643 回答
1

Mac OS X 10.5 中的应用程序防火墙做了类似的事情,但目前 Apple 仅支持使用它来允许/阻止特定应用程序接受传入连接。这是通过内核扩展完成的,该扩展通过 daemon 控制/usr/libexec/ApplicationFirewall/socketfilterfw,而后者又使用 Firewall Preferences 窗格进行配置。

于 2009-07-09T22:32:42.210 回答
1

用户空间进程无法执行您所描述的操作。我想甚至没有以root身份运行的进程。请记住:我们这里没有运行 Windows。即使是这样,你也不应该期望 Cocoa 支持它。Cocoa 用于 Mac OS X 的 GUI 易于使用的东西。不用于低级系统开发。

完成您所描述的唯一方法是扩展内核,这就是 Little Snitch 所做的。如果有其他聪明的方法,我向你保证,小飞贼会以不同的方式做到这一点。内核扩展不适合胆小的人。当内核扩展崩溃时,整个系统崩溃。所以你最好知道你在做什么。

但是,您可以从用户空间获取有关进程及其套接字的信息,但不能使用 Cocoa。并且只有用户自己的进程,如果您的应用程序没有以 root 身份运行。您需要使用 Apple 未记录的 libproc。您必须弄清楚lsof是如何做到的。而且你仍然无法篡改你得到的东西。

我想你最好只使用小飞贼。Little Snitch 增加的开销很小,我向你保证,你不会感觉到差异。它只是阻止套接字连接,直到您或软件做出决定为止。

但是,如果您仍然想编写自己的内核扩展,那么 Apple的网络内核扩展编程指南就是您所需要的。“套接字过滤器”部分描述了 Little Snitch 使用的接口。

于 2011-01-24T23:49:54.297 回答
0

抱歉,如果您想编写自己的程序来解决这个需求,或者您只是询问是否已经有任何程序可以担任相同的角色,这个问题并不清楚。

如果是后者,那么小飞贼就会按照你的要求去做。它会告诉您哪个应用程序正在尝试访问外部互联网,并根据规则集为您提供是允许访问还是拒绝访问的选项。虽然它不是全自动的。

于 2009-07-14T05:16:59.687 回答