2009-07-09 104 views
10

我正在使用OS X 10.5,並且正在尋找一種方法來檢測應用程序是否嘗試訪問Internet。在這一點上,我想阻止應用程序,如果它符合我將定義的一組規則。阻止應用程序通過Cocoa API訪問網絡(LittleSnitch APIs)?

ipfw我認識到的Unix命令可以用來阻止訪問某些端口,但會影響所有應用程序。我閱讀手冊頁,並沒有看到使用ipfw阻止訪問的方式,但將其限制爲特定的應用程序。

我的主要問題在於檢測哪個應用程序試圖獲得外部網絡訪問權限。以編程方式,必須有辦法做到這一點,無論是通過使用一些Mac OS X API或Unix命令如何完成?

更新: 本質上我想做什麼小金斯,但我想從頭開始自己寫,因爲我不喜歡小金斯。我只需要知道什麼API可以讓我完成應用程序網絡沙盒,以及Little Snitch如何做到這一點?

回答

9

我意識到這是晚了一年,但我正在挖掘類似的東西,並且遇到了我認爲是答案的東西。希望這可以幫助其他人下線。

Little Snitch似乎使用Network Kernel Extensions來過濾進入系統的流量。我已經發現它安裝在包裝盒內核擴展驗證這一點:

[~] 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選項來停止Internet訪問。

另外還有一篇更詳細的文章here,它給出了一些使用安全帶擴展進行細粒度控制的示例。

+0

謝謝。它至少是一個指向正確方向的指針 – 2009-07-09 20:20:46

1

Mac OS X 10.5中的應用程序防火牆做了類似的事情,但目前Apple僅支持使用它來允許/阻止特定應用程序接受傳入連接。這是通過內核擴展完成的,後者通過守護進程/usr/libexec/ApplicationFirewall/socketfilterfw進行控制,後者又使用防火牆首選項窗格進行配置。

0

對不起,如果你想編寫自己的程序來解決這個需求,或者你只是問是否有任何程序已經在那裏來填補同一個角色,那麼問題並沒有說清楚。

如果是後者,那麼小金斯就會完全按照你的要求。它會告訴你哪個應用程序試圖訪問外部的互聯網,並給你選擇是否允許訪問或根據規則設置拒絕訪問。雖然它不是完全自動的。

+0

以編程方式,必須有辦法做到這一點,無論是通過使用某些Mac OS X API或Unix命令如何實現? ---我認爲這很清楚。 – 2009-07-14 05:47:36

+0

好的,我已經更新了我的問題,以便更清晰地爲您服務 – 2009-07-14 05:50:15

1

用戶空間進程無法完成您所描述的任何操作。我想甚至沒有進程作爲根運行。記住:我們沒有在這裏運行Windows。即使如此,你也不應該指望Cocoa支持它。 Cocoa適用於Mac OS X易於使用的圖形用戶界面,不適用於低級系統開發。

完成你所描述的唯一方法是擴展內核,這就是小金斯特所做的。如果還有其他一些聰明的方法,我向你保證,小史尼克會以不同的方式做到這一點。內核擴展並不是一件容易的事。當內核擴展崩潰時,整個系統crashes。所以你最好知道你做了什麼。

但是,您可以從用戶空間獲取有關進程及其套接字的信息,但不能使用Cocoa。只有用戶自己的進程,如果你的應用程序沒有以root身份運行。你需要使用libproc,這是Apple沒有記錄的。你必須弄清楚lsof是如何做到的。而你仍然無法篡改你得到的東西。

我想你最好只使用小流氓。 Little Snitch增加的開銷很小,我向你保證,你不會感覺到差異。它只是阻止套接字連接,直到做出決定 - 由您或軟件進行。

如果你仍然覺得自己想寫自己的內核擴展,蘋果的The Network Kernel Extension Programming Guide就是你所需要的。 「插座濾波器」一節介紹Little Snitch使用的接口。