压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

沙箱:挖掘你的安全隱患

簡介

沙箱是個好點子。無論是提高兒童的免疫系統(tǒng)還是將你的app和系統(tǒng)其他部分隔離,這就是沙箱的意義。雖然沙箱具有顯而易見的好處,但是它并不常見。我們認為那是因為對于大部分開發(fā)者來說沙箱是挺模糊的概念,希望這篇文章可以解決這個問題。

t015b97118fbcb347f9

什么是沙箱?

軟件沙箱是將一個進程與其他的進程隔離開來,從而限制進程對其所需系統(tǒng)的訪問,并拒絕訪問其他所有內容。舉個簡單的例子,如果在Adobe Reader中打開一個pdf文檔。在Adobe Reader使用沙箱之后,文檔被運行在限制環(huán)境下的進程打開,使之與系統(tǒng)的其他部分隔離。這就限制了一個惡意文檔可能造成的破壞,這也是為什么可以在野外看到更多的使用第一種攻擊方式的惡意PDF文檔被丟棄,更多的用戶選擇更新支持沙箱的Adobe Reader版本。

但是沙箱并不是魔法,它只是簡單的限制攻擊者可用的工具和減少利用的影響范圍。沙箱中進程的bug依然可以拿到對系統(tǒng)關鍵部分的全部權限,使得沙箱幾乎沒有用處。

Canary沙箱

長時間以來讀者都知道Canary是我們熟知的蜜罐解決方案(如果你對快速部署和運行漏洞檢測感興趣,請通過https://canary.tools聯(lián)系我們)。

Canary是一個高質量的混合交互蜜罐。它是一個可以嵌入到你的網(wǎng)絡中的小設備,能夠模擬一大批機器(打印機/便攜電腦/文件服務器等等)。一但配置,它將運行零個或更多的服務,比如SSH,telnet,數(shù)據(jù)庫或者Windows文件共享。當有人和這些模擬的主機和服務交互的時候,你會收到一個警告(和一個你能取消你的周末計劃的高質量的信號)。

幾乎我們所有的服務都使用內存安全語言實現(xiàn),但是如果用戶想要一個Windows文件共享,我們依賴一個流行的Samba項目(在設置Samba之前,我們需要檢測其他SMB能力,像優(yōu)秀的impacket庫,但是因為我們的Canary(和他們的文件共享)可以注冊到活動目錄中所以Samba更好),在Samba作為服務運行之后,我們不能完全控制它內部的工作,它成了沙箱的重要部分:我們希望可以限制它訪問系統(tǒng)的其他部分,避免系統(tǒng)受到破壞。

Sandboxing 101

我們將用簡單的介紹解釋一下Linux提供的沙箱的一些關鍵部分。

Linux提供多種方式來限制進程,我們將考慮哪種方式適合我們的解決方案。我們實現(xiàn)了一個沙箱解決方案,你可以根據(jù)你的環(huán)境來選擇哪些方式作為組合,讓它們更有意義。

控制組

控制組是用來限制和控制對CPU、內存、磁盤、網(wǎng)絡等資源的訪問。

Chroot

這進程能看到包含更改的文件系統(tǒng)中明顯的根目錄。它確保這個進程不能接觸到整個文件系統(tǒng),但是還是能訪問到它應該能夠看到的部分。Chroot是Unix 系統(tǒng)第一次在沙箱中做嘗試,但是很快就被確定了它不足以限制攻擊者。

Seccomp

作為代表的“安全計算模式”,可以讓你限制進程進行系統(tǒng)調用。限制系統(tǒng)調用意味著這個進程只能執(zhí)行你希望它能夠執(zhí)行的系統(tǒng)操作,因此如果攻擊者危及到你的應用程序,他們將無法運行。

能力

這是指能夠在Linux系統(tǒng)上執(zhí)行的特權操作的集合。這些功能包括setuid,chroot和chown。有關的完整列表你可以在此處查看源代碼(https://github.com/torvalds/linux/blob/master/include/uapi/linux/capability.h)。然而他們也不是靈丹妙藥

命名空間

沒有命名空間,任何進程都能夠查看所有所有進程的系統(tǒng)資源信息。命名空間虛擬化如主機名,用戶ID,網(wǎng)絡資源等資源,讓進程無法查看其他進程的這些信息。

過去在你的應用程序中增加沙箱是為了使用其中一些原語(對于大多數(shù)開發(fā)人員而言這些看起來很雜亂)。幸運的是,現(xiàn)在很多項目將沙箱包裝在軟件包中方便使用。

我們的解決方案

我們現(xiàn)在需要找到一個適合我們的解決方案,但是也可以讓我們在需要時輕松擴展而不用重頭開始重建。

我們想要的解決方案至少需要解決Seccomp過濾和chroot/pivot_root的問題。如果你能獲取到完整的配置文件,那么過濾系統(tǒng)調用很容易控制,一旦過濾,你就會放心不少因為你知道服務不能執(zhí)行它不應該執(zhí)行的系統(tǒng)調用。對于我們還有另一種簡單的選擇那就是限制文件系統(tǒng)的視圖。Samba只需要訪問特定的目錄和文件,同時許多文件也可以設置為只讀。

我們評估了許多選項,最終決定的解決方案如下:

  • 隔離進程(Samba)
  • 保留真正的主機名
  • 能夠與非獨立的過程進行交互

另一個進程必須能夠攔截Samba網(wǎng)絡流量,這就意味著我們無法在沒有引入額外進程的情況下將其放入網(wǎng)絡命名空間。

這排除了像Docker這樣的東西,雖然它提供了開箱即用的高級別隔離(這在很多情況下都是完美的選擇),但是我們不得不關閉很多功能才能讓app更好的發(fā)揮作用。

Systemd 和 nsroot (看起來已經被放棄了)都更專注于特定的隔離技術(針對Systemd的seccomp過濾和nsroot的命名空間隔離),但對于我們來說還不夠。

然后我們查看了NSJail 和 Firejail(Google 與 Mozilla 比較,雖然這與我們的決定沒有任何關系)。兩者十分相似,并且在我們可以限制的范圍內為我們提供了靈活性,使它們由于其他選擇。

最后我們決定使用NsJail,但由于他們非常相似,很容易走到另一條路,比如YMMV

NsJail

Nsjail 就像在其概述中說的那樣“是一個用于linux進程隔離的工具”,由谷歌團隊開發(fā)(但是它沒有被谷歌官方認可為谷歌的產品)。它提供獨立的命名空間,文件約束系統(tǒng),資源限制,seccomp過濾器,克隆/隔離的以太網(wǎng)接口和控制組。

此外,它使用kafel(另一種非官方google產品),它允許你在配置文件中定義系統(tǒng)調用過濾策略,從而可以輕松管理/維護/重用/擴展你的配置。

使用Nsjail隔離進程的一個簡單示例:

./nsjail -Mo --chroot /var/safe_directory --user 99999 --group 99999 -- /bin/sh -i

參數(shù)的意義是:

-Mo: ????????????? launch a single process using clone/execve

–chroot: ???????? set /var/safe_directory as the new root directory for the process

–user/–group: ?? set the uid and gid to 99999 inside the jail

— /bin/sh -i: ??? our sandboxed process (in this case, launch an interactive shell)

我們將chroot設置為/var/safe_directory。這是我們事先創(chuàng)建的有效chroot。你可以使用–chroot /用于測試目的。

如果你啟動并運行ps aux 和 id,你會看到類似下面的內容:

$ ps aux
USER ????PID %CPU %MEM ???VSZ ??RSS TTY ?????STAT START ??TIME COMMAND
99999 ???1 ?0.0 ?0.1 ??1824 ?1080 ? ???????SNs ?12:26 ??0:00 /bin/sh -i
99999 ???11 ?0.0 ?0.1 ??3392 ?1852 ? ???????RN ??12:32 ??0:00 ps ux
$ id
uid=99999 gid=99999 groups=99999

你只能看到你在jail中啟動的進程

現(xiàn)在我們嘗試增加一個過濾器:

./nsjail --chroot /var/safe_directory ?--user 99999 --group 99999 --seccomp_string 'POLICY a { ALLOW { write, execve, brk, access, mmap, open, newfstat, close, read, mprotect, arch_prctl, munmap, getuid, getgid, getpid, rt_sigaction, geteuid, getppid, getcwd, getegid, ioctl, fcntl, newstat, clone, wait4, rt_sigreturn, exit_group } } USE a DEFAULT KILL' -- /bin/sh -i

參數(shù)表示:

-Mo: ????????????? launch a single process using clone/execve

–chroot: ???????? set /var/safe_directory as the new root directory for the process

–user/–group: ?? set the uid and gid to 99999 inside the jail

–seccomp_string: ?use the provided seccomp policy

— /bin/sh -i: ??? our sandboxed process (in this case, launch an interactive shell)

如果你現(xiàn)在嘗試運行id,會發(fā)現(xiàn)失敗了。因為我們需要給他權限來使用需要的系統(tǒng)調用。

$ id

Bad system call

我們的想法是使用NsJail來執(zhí)行smbd 和 nmbd(samba設置需要用到它)并且只能做事先預期的系統(tǒng)調用

構建我們的解決方案

從配置空白文件開始,專注于smbd,我們開始添加限制來鎖定服務。

首先,我們構建seccomp過濾器列表,以確保該進程只能訪問所需的系統(tǒng)調用。這點使用perf就很容易獲得:

perf record -e 'raw_syscalls:sys_enter' -- /usr/sbin/smbd -F

這記錄了smbd用于perf格式的所有系統(tǒng)調用。要以可讀的列表格式輸出系統(tǒng)調用:

perf script | grep -oP "(?<= NR )[0-9]+" | sort -nu

在這里要提到的是系統(tǒng)調用號可以根據(jù)你自己來命名成不同的方式。即使只是在‘strace’和‘nsjail’之間,一些系統(tǒng)調用名稱與linux源代碼中的名稱略有不同。這意味著如果你使用系統(tǒng)調用名稱,在不同的工具之間你不能直接使用完全相同的列表,因此需要重新命名一下他們。如果你對此感到擔心,你可以選擇使用系統(tǒng)調用號。這是一種強大的與工具無關的識別系統(tǒng)調用的方法。

在我們有了清單后,我們開始限制FS訪問以及最終設置,以確保它盡可能的被鎖定。

通過啟動shell并手動測試保護這種有趣的方法可以測試配置文件是否按照我們的預期工作,

./nsjail –config smb.cfg — /bin/sh -i

一旦這個策略通過測試,smbd就可以按照預期運行,那么我們就可以開始測試nmbd.

兩個服務都是沙箱,我們進行了幾次長時間運行的測試,以確保我們沒有錯過任何東西。主要包括在周末運行服務并通過不同系統(tǒng)連接它們來測試。經過所有測試,我們很高興的確認沒有發(fā)現(xiàn)任何錯誤。

這對我們意味著什么?

針對Samba的大多數(shù)利用希望有一個開放系統(tǒng)來訪問系統(tǒng)資源。在未來的某天,當下一個Samba 0day到來時,會證明針對samba的通用利用將會在嘗試調用我們沒有明確允許的系統(tǒng)調用時失敗。但是即使攻擊者要破壞Samba并將自己包裝一個shell,這個shell也會在文件系統(tǒng)和系統(tǒng)的限制視圖中受到功能限制。

這對你意味著什么?

我們引導你完成為Samba服務配置沙箱的過程,目的是讓你思考自己的環(huán)境以及沙盒如何在保護你的應用程序中發(fā)揮作用。我們想給你展示的是:這不是一個昂貴或復雜的任務。你應該嘗試一下,如果你想這樣做,請給我們留言!

原文地址:http://blog.thinkst.com/2018/02/sandboxing-dig-into-building-your.html

上一篇:深入研究VBScript

下一篇:緩沖區(qū)溢出小程序分析