1 安全概念
安全就是降低風(fēng)險(xiǎn)。
一方面所有者,即產(chǎn)品或服務(wù)的受益者(用戶(hù)、制造商、企業(yè)主等)。所有者希望保護(hù)資產(chǎn),即產(chǎn)品或服務(wù)中任何有價(jià)值的東西(數(shù)據(jù)、代碼、聲譽(yù)等)。
另一方面威脅行為者,即能夠表現(xiàn)出威脅的人或事物(惡意黑客等),即任何能夠以可能造成傷害的方式對(duì)資產(chǎn)采取行動(dòng)的東西。
為了體現(xiàn)威脅,威脅者將通過(guò)攻擊矢量(威脅者用于訪(fǎng)問(wèn)或滲透目標(biāo)系統(tǒng)的方法或途徑)來(lái)探索漏洞(系統(tǒng)中的薄弱環(huán)節(jié))。
歸根結(jié)底,這就是所有者和威脅者之間的貓鼠游戲。所有者會(huì)在多大程度上保護(hù)資產(chǎn)?威脅者會(huì)在多大程度上破壞資產(chǎn)?這實(shí)際上取決于資產(chǎn)的價(jià)值。事實(shí)上,所有者和威脅行動(dòng)者對(duì)價(jià)值的認(rèn)識(shí)可能并不相同。
確定資產(chǎn)(及其價(jià)值)以降低被入侵的風(fēng)險(xiǎn),可以通過(guò)威脅建模的過(guò)程來(lái)完成。
2 威脅建模
威脅建模是一個(gè)可以識(shí)別、列舉潛在威脅并確定優(yōu)先緩解措施的過(guò)程。它基本上是一個(gè)風(fēng)險(xiǎn)評(píng)估過(guò)程,在這個(gè)過(guò)程中,你要評(píng)估資產(chǎn)的價(jià)值和保護(hù)資產(chǎn)的成本。威脅建模的結(jié)果就是產(chǎn)品的威脅模型。
在威脅建模過(guò)程中,有幾種技術(shù)和方法可以提供幫助,包括STRIDE、DREAD、VAST、OCTAVE等。
STRIDE 模型是一種非常有用的威脅分類(lèi)工具。它由微軟開(kāi)發(fā),其名稱(chēng)是六種主要威脅類(lèi)型的首字母縮寫(xiě): 欺騙(Spoofing)、篡改(Tampering)、抵賴(lài)(Repudiation)、信息泄露(Information disclosure)、拒絕服務(wù)(Denial of service)和權(quán)限升級(jí)(Escalation of privileges)。STRIDE 可用于識(shí)別系統(tǒng)資產(chǎn)可能面臨的所有威脅。
DREAD方法是一種評(píng)估計(jì)算機(jī)安全威脅風(fēng)險(xiǎn)的工具。其名稱(chēng)是五類(lèi)安全威脅的首字母縮寫(xiě): 損害(Damage:攻擊的嚴(yán)重程度)、可重現(xiàn)性(Reproducibility:重現(xiàn)攻擊的難易程度)、可利用性(Exploitability:發(fā)起攻擊的工作量)、受影響用戶(hù)(Affected users:有多少人會(huì)受到影響)和可發(fā)現(xiàn)性(Discoverability:發(fā)現(xiàn)威脅的難易程度)。
STRIDE 模型有助于識(shí)別威脅,而 DREAD 方法則有助于對(duì)威脅進(jìn)行排序。對(duì)于系統(tǒng)中的每一個(gè)威脅,您都要仔細(xì)研究每個(gè)威脅類(lèi)別,并將其分為低(1 分)、中(2 分)或高(3 分)。最后,您將得到一份威脅和緩解策略的等級(jí)列表。舉例說(shuō)明:
我們可以看到,威脅建模將為我們提供一個(gè)非常清晰的視圖,說(shuō)明我們要保護(hù)什么、我們計(jì)劃如何保護(hù)以及相關(guān)的成本。這是產(chǎn)品威脅模型的一部分,需要在每個(gè)開(kāi)發(fā)周期重新評(píng)估。因此,威脅模型將提供一份需要優(yōu)先處理的威脅清單,這樣我們就可以集中精力實(shí)施緩解措施,提高產(chǎn)品的安全性。
如何保護(hù)代碼的完整性和真實(shí)性?如何確保數(shù)據(jù)的私密性?在哪里存儲(chǔ)加密密鑰?如何最大限度地降低應(yīng)用程序被利用的風(fēng)險(xiǎn)?讓我們從安全啟動(dòng)開(kāi)始,嘗試回答所有這些問(wèn)題以及更多問(wèn)題!
3 安全啟動(dòng)
如何確保運(yùn)行的代碼是由值得信賴(lài)的個(gè)人或公司創(chuàng)建的?實(shí)施安全啟動(dòng)程序。
安全啟動(dòng)程序的目的是保護(hù)代碼的完整性和真實(shí)性。
安全啟動(dòng)通?;跀?shù)字簽名的驗(yàn)證。嵌入式 Linux 系統(tǒng)通常有三個(gè)主要組件:引導(dǎo)加載程序、內(nèi)核和根文件系統(tǒng)(rootfs)。所有這些組件都有簽名,并在啟動(dòng)過(guò)程中對(duì)簽名進(jìn)行檢查。
讓我們看看NXP iMX6 設(shè)備上的一個(gè)實(shí)際例子。
一切都始于SoC內(nèi)部的ROM代碼。在恩智浦iMX6上,有一個(gè)名為"High Assurance Boot"(HAB)的硬件組件,它能夠驗(yàn)證第一階段啟動(dòng)加載程序的簽名,從而實(shí)現(xiàn)安全啟動(dòng)過(guò)程。iMX6設(shè)備內(nèi)的高保真啟動(dòng)也可稱(chēng)為"信任根"(Root of Trust),因?yàn)槿绻黄茐模邪踩珕?dòng)過(guò)程也將受到破壞。
iMX6 SoC內(nèi)的ROM代碼使用HA 組件檢查引導(dǎo)加載程序的簽名。為此,需要生成一對(duì)密鑰(公鑰和私鑰),用私鑰簽署引導(dǎo)加載程序,并將公鑰存儲(chǔ)在SoC 內(nèi)。iMX6使用OTP保險(xiǎn)絲來(lái)存儲(chǔ)密鑰。實(shí)際上,為了降低成本,SoC中只存儲(chǔ)了公鑰的哈希值。
引導(dǎo)加載程序啟動(dòng)時(shí)(如 U-Boot),必須檢查L(zhǎng)inux內(nèi)核的簽名。為此,通常使用一種名為FIT映像的映像格式。FIT映像是支持散列和簽名的多個(gè)二進(jìn)制文件的容器,通常包含Linux內(nèi)核映像、設(shè)備樹(shù)文件和初始 ramdisk。生成一對(duì)密鑰后,我們需要用私鑰簽署FIT映像中的二進(jìn)制文件,并配置U-Boot使用公鑰檢查FIT映像的簽名。
內(nèi)核啟動(dòng)后,將運(yùn)行內(nèi)存盤(pán)鏡像中的啟動(dòng)程序。在掛載之前,ramdisk將具有驗(yàn)證最終根文件系統(tǒng)完整性的邏輯。有幾種方法可以實(shí)現(xiàn)這一點(diǎn)。一個(gè)常見(jiàn)的選擇是使用設(shè)備映射器真實(shí)性(dm-verity)內(nèi)核模塊。dm-verity 內(nèi)核模塊可對(duì)塊設(shè)備進(jìn)行完整性檢查,并要求使用只讀 rootfs(squashfs 就是一個(gè)很好的解決方案)。如果想要一個(gè)可讀寫(xiě)的根文件系統(tǒng),還可以使用IMA或dm-integrity等其他方法。
下面是整個(gè)安全啟動(dòng)過(guò)程的示意圖:
2017年7月17日,多個(gè)恩智浦設(shè)備(i.MX6、i.MX50、i.MX53、i.MX7、i.MX28 和 Vybrid 系列)的ROM代碼中的安全啟動(dòng)漏洞被公開(kāi)披露。如果你的信任鏈遭到破壞,一切都會(huì)受到影響!因此,我們需要警惕這類(lèi)漏洞(在這種情況下,它們已被新硅片修復(fù))。
雖然安全啟動(dòng)可以確保真實(shí)性和完整性,但它并不能保護(hù)設(shè)備不被偽造或威脅者從設(shè)備中提取代碼/數(shù)據(jù)。因此,如果要保護(hù)知識(shí)產(chǎn)權(quán)或確保數(shù)據(jù)保密性,就需要使用加密技術(shù)。
4 代碼和數(shù)據(jù)加密
您可能希望對(duì)嵌入式 Linux 設(shè)備中的數(shù)據(jù)或代碼進(jìn)行加密。
當(dāng)你需要保護(hù)用戶(hù)的隱私和機(jī)密時(shí),數(shù)據(jù)加密是一種常用的方法。數(shù)據(jù)是設(shè)備執(zhí)行過(guò)程中產(chǎn)生的任何信息,包括數(shù)據(jù)庫(kù)、配置文件等。
代碼加密取決于具體情況,對(duì)整個(gè)根文件系統(tǒng)進(jìn)行加密并不常見(jiàn)。通常情況下,大部分組件都是免費(fèi)開(kāi)源軟件,因此沒(méi)什么好隱藏的。此外,還有GPLv3和Tivo化的問(wèn)題(使用任何GPLv3軟件都會(huì)迫使你為用戶(hù)提供一個(gè)更新軟件的機(jī)制,如果你要對(duì)軟件進(jìn)行加密,這將會(huì)變得更加困難)。更常見(jiàn)的用例是只加密你為設(shè)備開(kāi)發(fā)的應(yīng)用程序。這通常是你的知識(shí)產(chǎn)權(quán)所在。
Linux中基本上有兩種主要的加密方法:全盤(pán)加密和基于文件的加密。
全磁盤(pán)加密提供塊級(jí)加密,整個(gè)磁盤(pán)或磁盤(pán)分區(qū)都會(huì)被加密。為此,我們可以使用Linux內(nèi)核的設(shè)備映射器加密目標(biāo)dm-crypt。
基于文件的加密提供文件系統(tǒng)級(jí)加密,每個(gè)目錄都可以單獨(dú)加密,并可選擇使用不同的密鑰。fscrypt是一些文件系統(tǒng)(如 EXT4、UBIFS 和 F2FS)上可用的API,而 eCryptFS則是一種更通用的解決方案,它是在現(xiàn)有文件系統(tǒng)上堆疊的一層。
5 加密密鑰
由于在加密中使用非對(duì)稱(chēng)密鑰算法速度太慢,因此通常使用對(duì)稱(chēng)密鑰算法。這意味著加密和解密使用相同的密鑰,而且密鑰應(yīng)存在于文件系統(tǒng)中的某個(gè)位置,這樣才能解密加密的代碼/數(shù)據(jù)。
但我們不能就這樣把密鑰留在文件系統(tǒng)中,對(duì)嗎?
有幾家公司就是因?yàn)闆](méi)有意識(shí)到這一點(diǎn)而付出了代價(jià)。例如,下圖來(lái)自第一代Xbox視頻游戲機(jī)。安全研究員安德魯-黃(Andrew "bunnie" Huang)開(kāi)發(fā)了一種專(zhuān)門(mén)的FPGA硬件,用于嗅探通信總線(xiàn),并從設(shè)備中提取加密密鑰。這只是因?yàn)槊荑€就在那里,以明文形式在通信總線(xiàn)中傳輸,沒(méi)有任何保護(hù)措施(順便說(shuō)一句,Andrew Huang 是一本非常好的硬件黑客書(shū)籍《Hacking the Xbox》的作者,你可以在他的網(wǎng)站上免費(fèi)下載)。
結(jié)論是加密代碼/數(shù)據(jù)的保護(hù)與解密密鑰的保護(hù)同樣安全!
6 密鑰存儲(chǔ)技術(shù)
在臺(tái)式機(jī)或智能手機(jī)上,用于加密文件系統(tǒng)的密鑰可以通過(guò)交互輸入的用戶(hù)密碼(口令)獲得。例如,安卓智能手機(jī)就是這樣工作的。
在嵌入式系統(tǒng)中,我們通常不會(huì)在每次啟動(dòng)設(shè)備時(shí)通過(guò)用戶(hù)交互從密碼中獲取密鑰。因此,密鑰應(yīng)加密存儲(chǔ)在文件系統(tǒng)或安全存儲(chǔ)器中。為此,我們需要硬件支持。
例如NXP i.MX 處理器有一個(gè)唯一的主密鑰(NXP預(yù)先編程),只有名為CAAM(加密加速器和保證模塊)的特殊硬件模塊才能訪(fǎng)問(wèn)該密鑰。該硬件設(shè)備可用于加密密鑰并將其存儲(chǔ)在文件系統(tǒng)中(這必須在制造過(guò)程中完成)。在啟動(dòng)過(guò)程中,CAMM模塊將用于解密密鑰,并恢復(fù)用于解密文件系統(tǒng)的普通密鑰。由于CAAM模塊內(nèi)的密鑰無(wú)法訪(fǎng)問(wèn),因此加密密鑰受到了保護(hù)。
如果處理器沒(méi)有安全功能,也可以通過(guò)安全元件或TPM設(shè)備等外部硬件實(shí)現(xiàn)相同的效果。這些外部設(shè)備通常提供安全存儲(chǔ),因此可以用來(lái)存儲(chǔ)主密鑰,用于加密/解密文件系統(tǒng)加密密鑰。這些設(shè)備還提供許多安全功能,如隨機(jī)數(shù)生成、散列計(jì)算、加密和簽名功能等。
安全元件是一種安全計(jì)算系統(tǒng)。它基本上是帶有自己的安全應(yīng)用程序的安全存儲(chǔ)(通常使用Java卡實(shí)現(xiàn),但不是必須的)。安全元素的功能非常開(kāi)放,取決于實(shí)現(xiàn)方式,但大多數(shù)安全元素都執(zhí)行公鑰密碼標(biāo)準(zhǔn)11(PKCS#11)。安全元件的例子有智能卡和SIM卡。
TPM(可信平臺(tái)模塊)是一種規(guī)范和國(guó)際標(biāo)準(zhǔn)(ISO/IEC 11889)。TPM不是安全元件,但可以在安全元件內(nèi)實(shí)施。它可以在硬件或軟件中實(shí)現(xiàn),但大多數(shù)是在硬件中實(shí)現(xiàn)的。它提供一套由標(biāo)準(zhǔn)定義的有限安全功能,包括安全存儲(chǔ)和加密功能。
安全存儲(chǔ)的第三種選擇是使用可信執(zhí)行環(huán)境。TEE(Trusted Execution Environment)是一種環(huán)境,在這種環(huán)境中,執(zhí)行的代碼和訪(fǎng)問(wèn)的數(shù)據(jù)是隔離的,并在保密性(任何人都無(wú)法訪(fǎng)問(wèn)數(shù)據(jù))和完整性(任何人都無(wú)法更改代碼及其行為)方面受到保護(hù)。我們身邊有很多設(shè)備都在使用可信執(zhí)行環(huán)境,包括智能手機(jī)、機(jī)頂盒、游戲機(jī)和智能電視。
最后,如果您希望在嵌入式Linux設(shè)備中使用加密技術(shù),那么從項(xiàng)目一開(kāi)始就必須考慮密鑰的存儲(chǔ)和管理問(wèn)題。
7 分層安全
到目前為止我們已經(jīng)討論了如何通過(guò)安全啟動(dòng)和加密來(lái)提高嵌入式Linux設(shè)備的安全性。但這還不夠。我們應(yīng)該始終分層考慮安全問(wèn)題,每一層都應(yīng)用一種緩解技術(shù),在其他層的基礎(chǔ)上提高設(shè)備的安全性。將多種緩解技術(shù)結(jié)合起來(lái),攻擊者就更難入侵設(shè)備。
想想看。您可以通過(guò)安全啟動(dòng)和加密來(lái)保護(hù)您的代碼和數(shù)據(jù),但如果您運(yùn)行的應(yīng)用程序存在可能被利用的漏洞,您的資產(chǎn)仍然會(huì)面臨風(fēng)險(xiǎn)。如果應(yīng)用程序存在攻擊向量(用戶(hù)輸入、配置文件、網(wǎng)絡(luò)通信等),漏洞就有可能被利用。特別是在使用C和C++等不安全內(nèi)存語(yǔ)言編寫(xiě)的程序中,緩沖區(qū)溢出等漏洞可能被用于堆棧粉碎和格式字符串等攻擊。
8 安全編碼
如果應(yīng)用程序存在攻擊向量(用戶(hù)輸入、配置文件、網(wǎng)絡(luò)通信等),那么漏洞就可能被用來(lái)利用系統(tǒng)。
特別是使 C/C++等不安全內(nèi)存語(yǔ)言編寫(xiě)的程序,緩沖區(qū)溢出等漏洞可能被用于堆棧粉碎和格式字符串等攻擊。
舉個(gè)例子,在 Linux 內(nèi)核(從 2.6.34 版到 5.2.x)中發(fā)現(xiàn)了一個(gè)緩沖區(qū)溢出漏洞,該漏洞存在于vhost功能將virtqueue緩沖區(qū)轉(zhuǎn)換為 IOV的方式中。在遷移過(guò)程中,擁有特權(quán)的客戶(hù)機(jī)用戶(hù)可以將長(zhǎng)度無(wú)效的描述符傳遞給主機(jī),從而利用這一漏洞提高他們?cè)谥鳈C(jī)上的權(quán)限。
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 34ea219936e3f..acabf20b069ef 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -2180,7 +2180,7 @@ static int get_indirect(struct vhost_virtqueue *vq,
/* If this is an input descriptor, increment that count. */
if (access == VHOST_ACCESS_WO) {
*in_num += ret;
- if (unlikely(log)) {
+ if (unlikely(log && ret)) {
log[*log_num].addr = vhost64_to_cpu(vq, desc.addr);
log[*log_num].len = vhost32_to_cpu(vq, desc.len);
++*log_num;
@@ -2321,7 +2321,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq,
/* If this is an input descriptor,
* increment that count. */
*in_num += ret;
- if (unlikely(log)) {
+ if (unlikely(log && ret)) {
log[*log_num].addr = vhost64_to_cpu(vq, desc.addr);
log[*log_num].len = vhost32_to_cpu(vq, desc.len);
++*log_num;
此漏洞已在CVE-2019-14835中注冊(cè),并于2019年得到修復(fù)。實(shí)際上,虛擬(客戶(hù))機(jī)中的用戶(hù)可以利用此漏洞獲得主機(jī)的 root 訪(fǎng)問(wèn)權(quán)限。這個(gè)漏洞(還有許多其他漏洞)在Linux內(nèi)核中存在了好幾年!
歸根結(jié)底,軟件總會(huì)有漏洞,但我們可以盡量減少它們。為此,我們可以使用靜態(tài)分析工具。
9 靜態(tài)分析工具
靜態(tài)分析工具能夠分析源代碼(無(wú)需運(yùn)行程序),在運(yùn)行時(shí)發(fā)現(xiàn)問(wèn)題。這些工具可以發(fā)現(xiàn)空指針取消引用、內(nèi)存泄漏、整數(shù)溢出、越界訪(fǎng)問(wèn)、初始化前使用等程序錯(cuò)誤!
有許多優(yōu)秀的開(kāi)源工具(cppcheck、splint、clang 等)和商業(yè)選擇(Coverity、PC-Lint 等)可用于靜態(tài)代碼分析,從編譯器開(kāi)始,編譯器通常有內(nèi)置的靜態(tài)分析工具,可在編譯代碼時(shí)生成警告或錯(cuò)誤。這就是為什么我們決不能忽視編譯器警告的原因,對(duì)嗎?)
因此,要將應(yīng)用程序中存在安全漏洞的風(fēng)險(xiǎn)降至最低,第一步就是絕不忽視編譯器警告并使用靜態(tài)分析工具。但有些缺陷很難,有時(shí)甚至不可能在源代碼層面上識(shí)別出來(lái)。因此,我們可能需要在應(yīng)用程序中添加運(yùn)行時(shí)保護(hù)。
10 運(yùn)行時(shí)保護(hù)
運(yùn)行時(shí)保護(hù)可以對(duì)應(yīng)用程序進(jìn)行動(dòng)態(tài)分析。這意味著您的程序?qū)⒕哂性谶\(yùn)行時(shí)執(zhí)行的保護(hù)和檢查功能。
例如,AddressSanitizer (ASan) 是Google安全研究人員創(chuàng)建的一個(gè)非常有趣的工具,用于識(shí)別C和C++程序中的內(nèi)存訪(fǎng)問(wèn)問(wèn)題。在啟用AddressSanitizer的情況下編譯C/C++應(yīng)用程序的源代碼時(shí),程序?qū)⒃谶\(yùn)行時(shí)被檢測(cè),以識(shí)別并報(bào)告內(nèi)存訪(fǎng)問(wèn)錯(cuò)誤(不適合linux+ARM)。
更多參考: https://sergioprado.blog/finding-memory-bugs-with-addresssanitizer/。
另一個(gè)例子是ASLR(地址空間布局隨機(jī)化),這是一種計(jì)算機(jī)安全技術(shù),可隨機(jī)排列進(jìn)程關(guān)鍵數(shù)據(jù)區(qū)域(文本、堆棧、堆、庫(kù)等)的地址空間位置。因此,如果你關(guān)心嵌入式 Linux 設(shè)備的安全性,就應(yīng)該啟用ASLR,至少是在Linux內(nèi)核中。
Valgrind是另一個(gè)非常有用的工具,可以幫助檢測(cè)內(nèi)存相關(guān)問(wèn)題,如泄露和數(shù)據(jù)競(jìng)賽。
當(dāng)然,這其中也有取舍。雖然這些工具可以在運(yùn)行時(shí)識(shí)別錯(cuò)誤和安全漏洞,但它們可能會(huì)影響應(yīng)用程序的性能,并增加調(diào)試系統(tǒng)的難度。
此外,要使用這些工具發(fā)現(xiàn)錯(cuò)誤,還必須確保存在錯(cuò)誤的代碼部分能夠運(yùn)行。更好的辦法是,應(yīng)用程序的測(cè)試覆蓋率應(yīng)接近100%。模糊測(cè)試工具可以幫助實(shí)現(xiàn)這一點(diǎn)。
11 模糊測(cè)試工具
模糊測(cè)試是一種自動(dòng)化軟件測(cè)試技術(shù),包括提供無(wú)效、意外或隨機(jī)數(shù)據(jù)作為程序的輸入。
然后監(jiān)控程序是否出現(xiàn)異常,如崩潰、內(nèi)置代碼斷言失敗或潛在的內(nèi)存泄漏。
目前有很多免費(fèi)的開(kāi)源模糊測(cè)試工具,包括AF(美國(guó)模糊測(cè)試循環(huán))和 syzkaller(Linux 內(nèi)核模糊測(cè)試工具 https://github.com/google/syzkaller)。
這確實(shí)是安全研究人員和威脅行為者用來(lái)查找軟件安全漏洞的工具。有時(shí),他們甚至自己編寫(xiě)模糊工具,而不是使用流行的框架。這需要付出代價(jià),因?yàn)橐恍┌踩芯咳藛T通過(guò)BugBounty平臺(tái)發(fā)現(xiàn)軟件中的漏洞,賺取了數(shù)百萬(wàn)美元(https://www.zdnet.com/article/seven-hackers-have-now-made-a-million-dollars-each-from-bug-bounties-says-hackerone/ )。
12 權(quán)限
減少漏洞利用的一種方法是不使用root(超級(jí)用戶(hù))權(quán)限運(yùn)行程序!你應(yīng)該利用操作系統(tǒng)的訪(fǎng)問(wèn)控制機(jī)制,使用非特權(quán)用戶(hù)運(yùn)行進(jìn)程,并在只允許訪(fǎng)問(wèn)運(yùn)行所需資源的組內(nèi)運(yùn)行進(jìn)程。
這就是所謂的最小權(quán)限原則,也是設(shè)計(jì)安全系統(tǒng)的規(guī)則之一。應(yīng)用程序在運(yùn)行時(shí),應(yīng)僅擁有完成工作所需的權(quán)限。
13 Linux capabilities
Linux capabilities是一種針對(duì)以root權(quán)限運(yùn)行的進(jìn)程的細(xì)粒度訪(fǎng)問(wèn)控制系統(tǒng)。
Linux內(nèi)核將與超級(jí)用戶(hù)相關(guān)的權(quán)限劃分為不同的單元,稱(chēng)為能力,這些能力可以獨(dú)立啟用或禁用。因此,我們的想法是編寫(xiě)一個(gè)能以root 身份運(yùn)行的程序,但只啟用其工作所需的功能。
你可以使用getcap工具列出特定程序運(yùn)行所需的功能:
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
14 強(qiáng)制訪(fǎng)問(wèn)控制(Mandatory Access Control)
Linux傳統(tǒng)上支持全權(quán)訪(fǎng)問(wèn)控制(DAC Discretionary Access Control)。DAC 是一種訪(fǎng)問(wèn)控制類(lèi)型,它根據(jù)主體和/或所屬組(實(shí)際上就是我們習(xí)慣的用戶(hù)和組標(biāo)志)的身份來(lái)限制對(duì)對(duì)象的訪(fǎng)問(wèn)。
另一種訪(fǎng)問(wèn)控制類(lèi)型稱(chēng)為強(qiáng)制訪(fǎng)問(wèn)控制(MAC)。MAC 指的是一種訪(fǎng)問(wèn)控制類(lèi)型,即操作系統(tǒng)限制主體訪(fǎng)問(wèn)對(duì)象或?qū)?duì)象執(zhí)行某種操作的能力。
MAC是通過(guò)Linux安全模塊(LSM)在內(nèi)核中實(shí)現(xiàn)的,LSM是一個(gè)允許Linux內(nèi)核支持各種計(jì)算機(jī)安全模型的框架。
實(shí)現(xiàn)強(qiáng)制訪(fǎng)問(wèn)控制的兩個(gè)Linux安全模塊是SELinux和AppArmor:
- SELinux 是最流行(也最復(fù)雜)的MAC實(shí)現(xiàn)之一,最初由美國(guó)國(guó)家安全局開(kāi)發(fā),如今已用于 Android 和 Fedora 等大型項(xiàng)目。
- AppArmor 也是一種流行且更友好的MAC實(shí)現(xiàn),由Canonical提供支持,并用于Ubuntu和Debian等Linux 發(fā)行版。
因此,如果需要對(duì)進(jìn)程權(quán)限進(jìn)行精細(xì)控制,就應(yīng)該考慮使用MAC機(jī)制。
但有時(shí)限制權(quán)限并不足以保護(hù)系統(tǒng)免受易受攻擊應(yīng)用程序的影響。而沙箱技術(shù)可以用來(lái)緩解這一問(wèn)題。
15 應(yīng)用程序沙箱
沙箱可以將應(yīng)用程序與系統(tǒng)的其他部分隔離開(kāi)來(lái)。
Linux內(nèi)核中最古老的沙箱機(jī)制可能就是chroot。但就安全性而言,它的作用并不大,因?yàn)樗荒芨綦x文件系統(tǒng)。
虛擬化是另一種應(yīng)用程序沙箱的形式,但成本太高,尤其是在嵌入式系統(tǒng)中。
如今,嵌入式Linux中沙箱應(yīng)用程序的兩種可行解決方案是容器和可信執(zhí)行環(huán)境(TEE)。
參考資料
- 軟件測(cè)試精品書(shū)籍文檔下載持續(xù)更新 https://github.com/china-testing/python-testing-examples 請(qǐng)點(diǎn)贊,謝謝!
- 本文涉及的python測(cè)試開(kāi)發(fā)庫(kù) 謝謝點(diǎn)贊! https://github.com/china-testing/python_cn_resouce
- python精品書(shū)籍下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品書(shū)籍下載 https://www.cnblogs.com/testing-/p/17438558.html
- https://sergioprado.blog/introduction-embedded-linux-security-part-2/
16 容器
Linux容器是一個(gè)最小文件系統(tǒng),只包含運(yùn)行特定應(yīng)用程序或一組應(yīng)用程序所需的軟件組件。容器的運(yùn)行與系統(tǒng)的其他部分完全隔離,只有內(nèi)核是共享的。
容器運(yùn)行時(shí)實(shí)現(xiàn)利用了 Linux 內(nèi)核提供的一些功能,包括
- 命名空間:隔離Linux上進(jìn)程的執(zhí)行(PID、用戶(hù)、網(wǎng)絡(luò)連接、掛載點(diǎn)等)。
- cgroups:允許按進(jìn)程或進(jìn)程組劃分系統(tǒng)資源(CPU、內(nèi)存、I/O)。
- seccomp:可限制進(jìn)程可執(zhí)行的系統(tǒng)調(diào)用。
有幾種工具可用于管理Linux中的容器,包括LXC、Systemd-nspawn、Podman 和Docker。
容器本身并不安全,但如果配置得當(dāng),我們可以限制容器內(nèi)每個(gè)進(jìn)程的權(quán)限并控制它們之間的通信,從而減少攻擊面并提高系統(tǒng)的安全性。
與安全模塊(如AppArmor或SELinux)結(jié)合使用,我們可以大大提高系統(tǒng)的安全性。
但在基于容器的系統(tǒng)中,如果內(nèi)核受到攻擊,所有操作系統(tǒng)都將面臨風(fēng)險(xiǎn)。在這種情況下,可信執(zhí)行環(huán)境是另一層安全保護(hù),可以幫助防止這種情況的發(fā)生。
17 可信執(zhí)行環(huán)境
可信執(zhí)行環(huán)境(TEE Trusted Execution Environment)是一種環(huán)境,在這種環(huán)境中,執(zhí)行的代碼和訪(fǎng)問(wèn)的數(shù)據(jù)都是隔離的,并在保密性(任何人都無(wú)法訪(fǎng)問(wèn)數(shù)據(jù))和完整性(任何人都無(wú)法更改代碼及其行為)方面受到保護(hù)。
在具有TEE的系統(tǒng)中,我們有在富執(zhí)行環(huán)境 (REE Rich Execution Environment) 上運(yùn)行的不信任應(yīng)用程序 (UA untrusted applications),以及在可信執(zhí)行環(huán)境 (TEE) 上運(yùn)行的可信應(yīng)用程序 (TA trusted application)。只有在TEE上運(yùn)行的可信應(yīng)用程序才能完全訪(fǎng)問(wèn)主處理器、外設(shè)和內(nèi)存。硬件隔離保護(hù) TA 不受在主操作系統(tǒng)(非安全世界)上運(yùn)行的不信任應(yīng)用程序的影響。
我們需要硬件支持來(lái)實(shí)現(xiàn)TEE,這樣就能對(duì)硬件(總線(xiàn)、外設(shè)、內(nèi)存區(qū)域、中斷等)進(jìn)行分區(qū)和隔離,防止不受信任的應(yīng)用程序訪(fǎng)問(wèn)受保護(hù)的資源。大多數(shù)現(xiàn)代處理器都內(nèi)置了這一功能(如 ARM 的TrustZone、RISC-V的MultiZone和Intel SGX)。
我們身邊有很多設(shè)備都在使用可信執(zhí)行環(huán)境,包括智能手機(jī)、機(jī)頂盒、游戲機(jī)和智能電視。有一些商業(yè)TEE 實(shí)現(xiàn),如 Kinibi、QSEE 和 iTrustee,也有一些開(kāi)源實(shí)現(xiàn),如Trusty 和OP-TEE。TEE可以很好地解決沙箱應(yīng)用程序、存儲(chǔ)和管理加密密鑰、存儲(chǔ)和管理憑證和敏感數(shù)據(jù)以及保護(hù)數(shù)字版權(quán)信息等問(wèn)題。
18 更新系統(tǒng)
更新系統(tǒng)應(yīng)在產(chǎn)品開(kāi)發(fā)的早期階段就設(shè)計(jì)好,如有可能,還應(yīng)具備OTA(空中下載 Over-the-Air)功能。
實(shí)施良好的更新系統(tǒng)會(huì)給產(chǎn)品開(kāi)發(fā)帶來(lái)一些真正的挑戰(zhàn),包括通信協(xié)議的安全性、更新過(guò)程的原子性、斷電保護(hù)、帶寬和存儲(chǔ)使用、回滾功能等。
嵌入式 Linux 的更新系統(tǒng)可以采用一些策略,包括
- 基于應(yīng)用程序:容易實(shí)現(xiàn),但操作系統(tǒng)的其他部分怎么辦?
- 基于軟件包:更新鏡像很小,但更新是非原子的,軟件包依賴(lài)性可能是個(gè)問(wèn)題。
- 基于image:使用 A/B 機(jī)制是一個(gè)很好的解決方案,問(wèn)題可能在于帶寬和存儲(chǔ)空間的使用。
- 基于容器:這是另一個(gè)不錯(cuò)的選擇,有利于實(shí)現(xiàn)原子更新系統(tǒng)、電源故障安全、帶寬使用更少、速度更快、停機(jī)時(shí)間最短、可回滾。
如果要進(jìn)行 OTA 更新,設(shè)備必須有網(wǎng)絡(luò)連接(Wi-Fi、以太網(wǎng)等)。這意味著網(wǎng)絡(luò)接口將增加系統(tǒng)的攻擊面,您需要增加更多層次的安全保護(hù)來(lái)抵御攻擊。
19 網(wǎng)絡(luò)安全
這里的規(guī)則很簡(jiǎn)單:盡可能減少攻擊面。這并不意味著實(shí)施起來(lái)很容易。
例如,關(guān)閉所有不使用/不需要的 TCP/UDP 端口(nmap 等工具可以提供幫助),禁用所有不使用的協(xié)議(如 IPv6、PPP 等),制定防火墻規(guī)則以防止入站/出站連接,防止DoS攻擊,防止端口掃描等。
如果需要與外部設(shè)備通信,一定要使用安全連接(VPN、反向 SSH、TLS、HTTPS 等),遠(yuǎn)程連接最好使用公鑰驗(yàn)證,并禁止以根用戶(hù)身份登錄。
20 小結(jié)
我們討論了一些安全概念、威脅建模、安全啟動(dòng)、代碼和數(shù)據(jù)加密、加密密鑰、密鑰存儲(chǔ)技術(shù)、安全編碼、靜態(tài)分析工具、運(yùn)行時(shí)保護(hù)、模糊工具、權(quán)限、Linux 功能、強(qiáng)制訪(fǎng)問(wèn)控制、沙箱、更新系統(tǒng)和網(wǎng)絡(luò)安全。
歸根結(jié)底,沒(méi)有100%安全的系統(tǒng)。攻擊者只需要一個(gè)漏洞就能入侵設(shè)備。這只是我們希望這一過(guò)程有多難、難度有多大的問(wèn)題。
因此,我們?cè)谠O(shè)計(jì)時(shí)應(yīng)考慮到安全性,并注意權(quán)衡利弊。系統(tǒng)應(yīng)該 "足夠安全"。我們應(yīng)遵循良好的安全實(shí)踐,了解可用的技術(shù)和工具,并在需要時(shí)加以使用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-711706.html
讓我們確保嵌入式 Linux 設(shè)備的安全!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-711706.html
到了這里,關(guān)于嵌入式 Linux 安全簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!