【问题标题】:Block Application access to network via a Cocoa API (LittleSnitch APIs)?阻止应用程序通过 Cocoa API (LittleSnitch APIs) 访问网络?
【发布时间】:2009-07-09 19:10:37
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c macos firewall ipfw


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,晚了一年。安全带不是答案。这正是我一直在寻找的。在这里,打勾和 +1
    • 是否可以用 Objective-C 或 Swift 以外的语言编写内核扩展,例如 C++ 或 Rust?
    【解决方案2】:

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

    还有一篇更详细的文章 here 给出了一些使用 Seatbelt 扩展进行更细粒度控制的示例。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        但是,如果您仍然想编写自己的内核扩展,那么您需要来自 Apple 的 The Network Kernel Extension Programming Guide。 “套接字过滤器”部分描述了 Little Snitch 使用的接口。

        【讨论】:

          【解决方案5】:

          抱歉,这个问题没有说明您是想编写自己的程序来解决这个需求,还是只是询问是否已经有任何程序可以担任相同的角色。

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

          【讨论】:

          • 编程必须有办法做到这一点,无论是通过使用一些Mac OS X API还是Unix命令如何实现? --- 我认为这很清楚。
          猜你喜欢
          • 2011-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-26
          • 1970-01-01
          • 2020-03-06
          相关资源
          最近更新 更多