版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
精品文檔-下載后可編輯ARM的Trustzone是怎樣保證硬件安全的-設(shè)計應(yīng)用Trustzone可以追溯到十多年前,ARMv7公布的時候就有了,可惜一直沒有什么實際應(yīng)用。直到近幾年開始,才真正的有廠商開始把這個方案大規(guī)模用于芯片里。目前看到的主要有四個應(yīng)用領(lǐng)域:是無人機(jī)芯片,大疆已經(jīng)走在了前面,第二名連影子都沒看見。無人機(jī)上幾大應(yīng)用,圖像傳輸,圖像處理,識別,飛控,存儲,每一塊都有安全的訴求。利用Trustzone可以做到,在芯片里流動的數(shù)據(jù),每一步都在安全系統(tǒng)的控制之下,哪怕飛機(jī)被人搶去,都需要極大的代價才能拿到閃存以及內(nèi)存里面的數(shù)據(jù)。如果以后上安卓或者其他操作系統(tǒng),哪怕軟件系統(tǒng)被黑客攻破,數(shù)據(jù)和控制還是安全的。,如果國家或者行業(yè)出臺政策,要求實施禁飛區(qū),那么哪怕無人機(jī)的主人自己去修改閃存和軟件,都可以被強(qiáng)制接管。這些功能必須在芯片設(shè)計階段就考慮到,大疆在這方面的眼光確實比別人長遠(yuǎn)。第二是DRM,數(shù)字版權(quán)管理,也就是內(nèi)容保護(hù)。如果國內(nèi)用戶要在手機(jī)上看好萊塢大片,那么播放設(shè)備必須經(jīng)過一個,這個可以用trustzone來實現(xiàn)。國內(nèi)已經(jīng)在積極的推動這個事情,估計再過一段時間就可以實現(xiàn)了。當(dāng)然,這是一把雙刃劍,肯定也有用戶反而不愿買支持DRM的設(shè)備,而去看盜版。用了Trustzone本身并不限制盜版,只不過多了一個看好萊塢大片的渠道。第三是支付。把Trustzone用于支付支付在技術(shù)上沒有困難,對芯片性能要求也不高,難的是把各個利益方擺平。銀行和運營商想把支付控制權(quán)握在自己手里,所以會去大力推廣NFC,會去和蘋果合作。而手機(jī)支付軟件廠商,比如支付寶和微信,想通過和手機(jī)芯片和硬件廠商,把所有功能都自己的平臺上實現(xiàn)。目前的支付大多數(shù)還是基于軟件和遠(yuǎn)端密鑰驗證。如果有人把手機(jī)破解,那還是可以讀取到支付圖層的密碼的。而trustzone做的,就是硬件上杜絕這類情況。第四是物聯(lián)網(wǎng)。物聯(lián)網(wǎng)的安全有好幾種做法,可以把安全檢測放在服務(wù)器端或者末端芯片上。末端通常是一個MCU加上傳感器和互聯(lián)模塊,面積較小。用硬件trustzone實現(xiàn)的話,加解密和密鑰管理等功能會需要額外內(nèi)模塊,可能比MCU本身都大,成本太高。但如果是附加值高的芯片就沒什么問題。讓我們從技術(shù)層面來定義Trustzone到底能做什么:1、防止操作系統(tǒng)被攻破后關(guān)鍵數(shù)據(jù)泄密,關(guān)鍵數(shù)據(jù)存放在特定內(nèi)存區(qū)域,而那塊區(qū)域,只有安全操作系統(tǒng)才有可能讀到。2、防止通過JTAG等調(diào)試接口讀到寄存器,緩存,內(nèi)存或者閃存數(shù)據(jù)。3、從芯片制造開始,初的密鑰可以用芯片熔絲實現(xiàn),往后啟動的每一步都需要特權(quán)級和密鑰驗證,建立信任鏈,杜絕軟件被替換或者被惡意讀取。4、防止邊帶攻擊,比如量取內(nèi)存顆粒的信號猜測數(shù)據(jù),制造故障讓檢驗?zāi)K停止工作,替換外圍器件,輸入特定數(shù)據(jù)確定電磁信號特征,打開芯片直接量內(nèi)部信號線等。
上圖是一個典型的ARMSoC內(nèi)部結(jié)構(gòu),在這個結(jié)構(gòu)里,Trustzone做的事情是保護(hù)數(shù)據(jù)在芯片內(nèi)部的安全,不允許非授權(quán)的訪問,哪怕這個訪問來自CPU。初看有些復(fù)雜,不過我們可以拆開慢慢分析。從硬件角度開始比軟件更清楚些,說不定哪天過的時候需要答辯,從頭到尾解釋系統(tǒng)安全設(shè)計。首先,按照Trustzone的劃分,一個芯片內(nèi)被劃分為安全世界和非安全世界。上圖中,中間黑色的部分是總線,總線上面是主設(shè)備,下面是從設(shè)備(主設(shè)備中的緩存是例外,這個以后說)。讀寫請求總是從主設(shè)備發(fā)往從設(shè)備的。作為從設(shè)備,區(qū)分它是不是屬于安全世界相對簡單。如果一個從設(shè)備不存在成塊的空間映射,比如I2C或者PWM,那么我只要在總線訪問它的時候,額外的加入一個管腳(取名為PROT),就可以告訴它本次訪問是不是來自安全世界。如果從設(shè)備本身是完全屬于被保護(hù)的安全世界,不接受非安全的訪問,那么只要簡單的拒絕,返回錯誤或者無意義數(shù)據(jù)即可。同樣,如果從設(shè)備本身處于非安全世界,那么對于安全和非安全訪問,都可以返回正確數(shù)據(jù)。還有,從設(shè)備所處于的世界,是可以動態(tài)配置的,且動態(tài)配置本身需要處在安全世界,這個以后討論。對于塊設(shè)備,包括閃存,sram和內(nèi)存等,它們的某些地址塊需要處于安全世界,其他的處于非安全世界。為了實現(xiàn)這一點,就需要在它們前面插入一個檢驗?zāi)K(例如圖中左方,DDR上面的TZC400),來判斷某個地址是不是能被訪問。當(dāng)?shù)刂繁凰偷竭@個檢驗?zāi)K,模塊會結(jié)合PROT管腳去查表,看看本次訪問是不是被允許,然后做相應(yīng)措施。表本身和之前的動態(tài)配置一樣,必須是在安全世界里面配置的。至此,從設(shè)備就分析完了,是不是感覺特別簡單?還有些細(xì)節(jié),在把主設(shè)備也講完后,我們會從系統(tǒng)角度來關(guān)注。對于一般主設(shè)備,不考慮自帶的緩存時,其實和從設(shè)備也差不多,也分為安全和非安全,可以在安全世界動態(tài)配置。配置完成后,這些主設(shè)備會按照自己所處的世界,驅(qū)動PROT管腳和地址來訪問從設(shè)備,得到相應(yīng)返回。不過這里的一般主設(shè)備不包括中斷控制器,系統(tǒng)MMU,調(diào)試模塊和處理器,接下來對這些例外模塊進(jìn)行具體分析。
首先是處理器。在上圖情況,接了CCI總線后,處理器接在緩存一致性端口ACE上(不明白的請參考以前的文章),它的緩存是可以被別人訪問的,并且這個訪問,是從主設(shè)備到主設(shè)備(當(dāng)然,在處理器內(nèi)部是從端口),不會經(jīng)過總線送到內(nèi)存,也不會經(jīng)過檢驗?zāi)KTZC400。這時就有個漏洞,通過操縱一個非安全世界的模塊,比如上圖的橙色主設(shè)備,假裝去讀一個被安全世界保護(hù)的內(nèi)存地址。這個地址本來存在于內(nèi)存,被TZC400保護(hù),可是由于總線的監(jiān)聽功能,讀請求有可能被發(fā)往處理器緩存,從而繞過保護(hù)。為了防止這種情況,處理器在所有的頁表和緩存都做了特殊設(shè)計,加了一個標(biāo)志位,標(biāo)志本緩存行是否屬于安全世界。如果別的非安全世界主設(shè)備來監(jiān)聽安全世界緩存行,由于安全位不同,處理器會認(rèn)為這是兩個不同地址,哪怕它們的地址一致,返回緩存未命中。這樣,就不會把數(shù)據(jù)泄漏。有人會問,這個標(biāo)志位于頁表,改了頁表中的這一位不就可以訪問了?其實不行。因為安全世界頁表位于被保護(hù)的內(nèi)存區(qū)域或者緩存,就算破解了操作系統(tǒng)也無法訪問。又有人會說,那改了非安全世界的頁表中安全位,并偽造一個安全世界的地址,豈不是可以讓CPU模擬出一個訪問安全世界的傳輸,送到總線和TZC400?TZC400或者對端緩存一看地址和PROT管腳都是符合要求的,應(yīng)該就會返回保密數(shù)據(jù)吧?想法是不錯,可是當(dāng)CPU位于非安全世界時,它會忽略頁表中的安全位,所以不可能發(fā)出PROT為安全的傳輸。所以,我們可以對這點放心。以上是別的主設(shè)備訪問處理器,那如果處理器本身處于非安全世界,有沒有可能訪問其他主設(shè)備的安全緩存?當(dāng)然有。所以不要把其他主設(shè)備接到ACE端口,以免被監(jiān)聽,一般主設(shè)備是不會做緩存上的安全與非安全區(qū)分的。接到ACE-Lite接口無所謂,反正設(shè)計上就無法被讀取緩存數(shù)據(jù)。除此之外,還存在一個例外,就是GPU。在的ARMG71圖形處理器上,是支持雙向硬件一致性的。也就是說,GPU也可以被監(jiān)聽緩存的。為了簡化設(shè)計,圖形處理器被設(shè)成永遠(yuǎn)處于非安全世界,CPU盡管讀,不在乎,它使用另外一種機(jī)制來保護(hù)數(shù)據(jù),以后介紹。對處理器緩存熟悉的人可能會想到用跨緩存行的非安全變量來訪問被保護(hù)的數(shù)據(jù)。沒用的,處理器設(shè)計者早就想到這點,要不就是非對齊訪問異常(包含exclusiveaccess的時候),要不就不會給你數(shù)據(jù),具體到每個處理器有所不同。還有一個漏洞沒堵上,那就是緩存維護(hù),TLB和分支預(yù)測操作。ACE端口包含了DVM操作來維護(hù)它們,安全性如何保障?同樣的,地址中也有安全和非安全位。不過話說回來,DVM操作無非就是無效化某些緩存,分支預(yù)測和TLB項,不存在安全數(shù)據(jù)被讀取,TLB被篡改的情況。到這里可能你會覺得有點暈,不少漏洞需要堵。我們可以回顧一下,需要記住的是各種緩存操作,通過安全標(biāo)志位保護(hù),避免漏洞。對比處理器設(shè)計者所要考慮的情況,這點漏洞不值一提。杜絕了緩存漏洞后,還有別的隱患,比如仿真器。調(diào)試模塊可以被用來訪問各個從設(shè)備,也可以訪問和影響處理器內(nèi)部資源。從設(shè)備側(cè)的防護(hù)很容易,把調(diào)試模塊當(dāng)成一般的主設(shè)備處理就行。處理器內(nèi)部的寄存器,緩存等資源,需要處理器從設(shè)計開始,就要為所有資源定義安全級別。被保護(hù)的資源對于來自調(diào)試模塊的未授權(quán)訪問會被禁止。只有通過安全啟動鏈,安全世界的軟件才能打開寄存器SDER,從而允許外部仿真器影響被保護(hù)的安全世界資源和處理器運行狀態(tài),訪問被保護(hù)的資源。那處理器內(nèi)部的資源是怎么劃分的?以ARMv8舉例,如下圖:
這幅圖相信很多人都看到過。ARMv8的處理器被分成四個特權(quán)等級,通常EL0跑用戶態(tài)程序,EL1內(nèi)核,EL2虛擬機(jī)。EL0-1分為安全與非安全,EL3只有安全世界,EL2不區(qū)分,兩個世界的切換必須經(jīng)過EL3。我們談到的處理器內(nèi)部資源,包括寄存器,緩存,異常,MMU,很多都會分組,組之間看不到或者低級不可訪問,從而保證安全。沒有分組的,比如通用寄存器,就需要軟件來維護(hù),防止非安全世界的看到安全世界的數(shù)據(jù)。引起安全切換的會有幾種可能:中斷和SMC指令。中斷分為如下幾種情況:
非安全世界下,在EL1或者EL0,當(dāng)一個非安全中斷來臨,那么系統(tǒng)沒必要切換安全狀態(tài),作為一般中斷處理,切到EL1即可。非安全世界下,在EL1或者EL0,當(dāng)一個安全中斷來臨,那么系統(tǒng)必須先切到EL3,不然就沒法做安全世界切換。安全世界下,在EL1或者EL0,當(dāng)一個安全中斷來臨,沒必要做安全世界切換,作為一般中斷處理,切到EL1即可。安全世界下,在EL1或者EL0,當(dāng)一個非安全中斷來臨,那么系統(tǒng)必須先切到EL3,不然就沒法做安全世界切換。當(dāng)跳到EL3的SecureMonitor程序處理上下文切換時,IRQ/FIQ中斷屏蔽位不起作用,哪怕打開了也不會觸發(fā),直到SecureMonitor處理完,向下跳到相應(yīng)的安全世界EL1時,才會讓原來的中斷屏蔽恢復(fù),從而觸發(fā)中斷。此時處理中斷的是安全世界的中斷程序,處于被保護(hù)的內(nèi)存區(qū)域,杜絕非安全世界的程序篡改。那怎樣觸發(fā)安全與非安全中斷呢?這在中斷控制器里有定義,早年的定義中只有FIQ可以作為安全中斷,后期的可配置,并且,相應(yīng)的安全世界配置寄存器只有在處理器的安全世界中才可以訪問。SMC指令和中斷觸發(fā)類似,只不過軟件就可以觸發(fā),切換到SecureMonitor。這里,非安全軟件可以提出觸發(fā)請求,在通用寄存器填入?yún)?shù),卻無法控制安全世界的處理程序做什么,也依然看不到被保護(hù)內(nèi)存數(shù)據(jù)。所以防止數(shù)據(jù)泄密的任務(wù)就靠安全操作系統(tǒng)了。至此,安全啟動后的基本硬件防護(hù)已經(jīng)完成,但如果你以為這就是Trustzone,那就錯了,精彩的在后面。我們可以把Trustzone放到實際應(yīng)用里面看看是不是可行。以DRM舉例,如下圖:
在播放授權(quán)視頻的時候,視頻流來自網(wǎng)絡(luò)或者閃存,它們不需要在安全世界,因為數(shù)據(jù)本身就是加密過的。然后被解密并放到被保護(hù)內(nèi)存,等待解碼。上圖中,密碼保護(hù)和解密是通過安全硬件模塊Crypto來完成的,這個我們以后再分析,先處理解密完成后的視頻流。此時有兩種方案:中,非常自然的,可以把所有的過程在安全世界完成,那么圖形處理器,視頻處理器和顯示模塊必須都工作在安全世界,能訪問安全世界的數(shù)據(jù),才能完成工作??蛇@樣就帶來一個問題,那就是驅(qū)動。我們知道,圖形處理器的驅(qū)動是非常復(fù)雜的,并且手機(jī)上只存在Linux和windows下的圖形驅(qū)動,和OpenGLES/DirectX配合。而安全世界的操作系統(tǒng)(TEE,TrustedExecutionEnvironment)是完全不兼容的安全系統(tǒng),甚至有的都不支持SMP,完全不存在可能性把圖形驅(qū)動移植上去,也沒有任何意義。這樣的話,就只能把圖形處理器從流程中挖掉,只留下相對簡單也不需要生態(tài)的視頻和顯示模塊的驅(qū)動,工作在安全世界,而GPU的輸出送到顯示模塊,由顯示模塊進(jìn)行混合。這是一種可行的方案,也確實有公司這么做。但是從長遠(yuǎn)看,圖形處理器總是會參與到這個過程的,別的不說,只說VR和AR流行以后,要是虛擬個顯示屏出來,上面播放視頻,然后放在一個虛擬出的房間,那他們之間肯定是要進(jìn)行互動的,此時顯示模塊就需要把視頻圖層送回GPU進(jìn)行運算。如果GPU不在安全世界,那就會造成泄密。為了解決上述問題,有了第二種解決方案,稱作TZMP1(TrustzoneMediaProtection1),引入了保護(hù)世界的概念。保護(hù)世界工作于非安全世界,這樣才能兼容圖形驅(qū)動。那安全怎么辦?它需要添加四根管腳NSAID,類似于安全世界的PROT信號,只不過做了更細(xì)的劃分,使得GPU/視頻/顯示模塊要訪問被保護(hù)內(nèi)存時,預(yù)先定義好了權(quán)限。而這個權(quán)限的設(shè)置,也是通過前文的TZC400來實現(xiàn)的,在安全啟動鏈中就完成。CPU的權(quán)限通常是0,也就是。而顯示控制器權(quán)限是只讀。這樣一來,我們之前的老問題,惡意緩存監(jiān)聽,又回來了。在新的A73和G71加CCI500/550總線系統(tǒng)里,可以支持雙向硬件一致性。這意味著GPU也能被監(jiān)聽。這下大家都在非安全世界,緩存里的安全位不起作用,怎么解決?這需要總線的配合。ARM的總線CCI500/550,有一個保護(hù)模式,打開后,不光支持上文的NSAID管腳,還可以在監(jiān)聽的時候,把監(jiān)聽傳輸替換成緩存行無效化命令,直接讓目標(biāo)把相應(yīng)緩存行無效化。這樣一來,數(shù)據(jù)還是需要從內(nèi)存讀取,保證安全。并且這個過程對軟件透明,無需做任何改動。可是此時,辛辛苦苦設(shè)計的硬件一致性就完全起不到加速作用了,性能受到影響。好在運行OpenGLES的時候,GPU是不會發(fā)出共享傳輸?shù)?,CPU也不會沒事去監(jiān)聽GPU的數(shù)據(jù)。而下一代的圖形接口Vulkan,會開始使用GPU雙向一致性,那時候會有影響。還有一點不利的是,如果同時運行OpenCL和DRM,OpenCL也用不上雙向硬件一致性,必須重啟系統(tǒng)切換到非保護(hù)模式才行。還有,在實際使用中,現(xiàn)有的TZC400作為內(nèi)存保護(hù)模塊,有幾個致命的缺陷。,它的配置只能在啟動時完成,無法動態(tài)改變,也就是說,一旦某塊內(nèi)存給了安全世界,就無法再被非安全世界的操作系統(tǒng)使用,哪怕它是空閑的。在4K視頻播放時,需要分配幾百兆內(nèi)存,還不止一塊。如果一直被占著,這對于4GB內(nèi)存手機(jī)來說是個沉重的負(fù)擔(dān)。怎么解決?只能改成動態(tài)配置。此時,如果內(nèi)存不夠了,非安全操作系統(tǒng)提請求給安全系統(tǒng),讓它把暫時不用的物理內(nèi)存設(shè)到非保護(hù)內(nèi)存區(qū),并定個時間收回。不過這樣一來內(nèi)存分配機(jī)制就復(fù)雜了,說不定還得改內(nèi)核,很危險。如果忽視這點,繼續(xù)往下走,還會遇到第二個問題。TZC400和它的改進(jìn)版多只能支持顆粒度為2MB的內(nèi)存塊管理。為什么不弄細(xì)些呢?很簡單,如果設(shè)成4KB,和系統(tǒng)頁大小一致,那么4GB的物理內(nèi)存就需要一百萬條目來管理。如果做成片上內(nèi)存,比二級緩存還大,不現(xiàn)實。而做內(nèi)存映射,就和MMU一樣了,經(jīng)過CPU的MMU后,數(shù)據(jù)訪問還要再穿越MMU,延遲顯然大。此外,這一層的MMU無法利用一二級緩存放頁表,效率極低。如果繼續(xù)保持2MB的顆粒,那么在分配內(nèi)存的時候,很快就會因為塊太大而用完。就算使用了上一節(jié)的方法,問題也沒法很好解決。這就是TZMP2V1。在這種情況下,第三種基于虛擬機(jī)的方案就出現(xiàn)了。不過這個方案基本上推翻了Trustzone初的設(shè)計意圖,我們來看下圖:
在這里,作為內(nèi)存保護(hù)的TZC400完全移除,而系統(tǒng)MMU加了進(jìn)來。內(nèi)存保護(hù)怎么做?靠物理地址重映射。先看處理器。在啟動鏈中,從EL3向EL2跳的過程時,就定義好保護(hù)內(nèi)存,并且EL2,也就是虛擬機(jī)的頁表存放于保護(hù)內(nèi)存,EL1的安全頁也同樣放在保護(hù)內(nèi)存。這樣,當(dāng)處理器進(jìn)入到EL1,哪怕通過篡改EL1非安全頁表的安全位,也終會被映射到它所不能訪問的安全內(nèi)存,從而起到保護(hù)作用。同樣的,給處于非安全世界的控制器也加上系統(tǒng)MMU,讓設(shè)備虛擬化,同樣可以控制安全。這就是TZMP2V2。有了系統(tǒng)MMU,頁表可以做成4KB大小了,也不用擔(dān)心CPU那里穿越兩次MMU。這時候,也不用擔(dān)心惡意監(jiān)聽緩存,因為所有穿過二級MMU的訪問里,安全位都是經(jīng)過檢驗的的。但是,不看別的,光是為設(shè)備加入這些系統(tǒng)MMU,就會增加很多面積。還有,光加MMU不夠,還要加入系統(tǒng)的三級甚至四級緩存,才能讓MMU效率更高,不然延遲太大。當(dāng)然,如果設(shè)備使用的頁表并不很多,可以對MMU簡化,比如增大顆粒度,減少映射范圍,直接使用片內(nèi)內(nèi)存。這需要系統(tǒng)設(shè)計者來做均衡。對于GPU來說,要支持雙向一致性,還得考慮讓監(jiān)聽傳輸通過MMU,不然功能就出問題了。如果使用了TZMP2V2,那么虛擬化就變成了一個切實需求。然后會發(fā)現(xiàn),ARM的中斷和設(shè)備的虛擬化還很不完善。接下來我從硬件角度解釋下虛擬化。說到虛擬化,先要解釋系統(tǒng)MMU。
如上圖所示,系統(tǒng)MMU其實很簡單,就是個二層地址轉(zhuǎn)換。層,虛地址到實地址,第二層,實地址到物理地址。請注意,沒有第二層轉(zhuǎn)換時,實地址等同于物理地址。這個模塊既可以兩層都打開,也可以只開一層,看情況而定。
上圖比較清楚的顯示了一層映射的過程。其中,設(shè)備發(fā)出的虛地址請求,會先經(jīng)過TLB,它里面存了以前訪問過的頁表項,如果有,就直接返回,沒有就往下走到第二步tablewalk。第二步里,MMU會按照預(yù)設(shè)的多級基址寄存器,級訪問到終頁表。如果MMU位于CPU內(nèi),那tablewalk過程中每次訪問的基址和表項,都可以存放于緩存中,大大提高效率。如果在設(shè)備上,只有內(nèi)建的TLB表項,后面沒有緩存,那未命中TLB的都是訪問DDR,效率自然下降。所以CPU和GPU等經(jīng)常訪存的設(shè)備,都是自帶層MMU和緩存。而對于沒有內(nèi)部MMU,切換頁表又不是很頻繁的設(shè)備,比如DMA控制器,可以在下面掛層MMU,此時驅(qū)動就簡單了,直接把應(yīng)用程序看到
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2175-2024水溶性酸測定儀校準(zhǔn)規(guī)范
- 速寫交通課件教學(xué)課件
- 2024年度金融服務(wù)技術(shù)外包合同
- 認(rèn)識雪 課件教學(xué)課件
- 2024年度建筑項目工程終止合同
- 2024年度太陽能系統(tǒng)安裝合同
- 2024年度企業(yè)咨詢服務(wù)外包合同
- 2024年修訂版:農(nóng)產(chǎn)品冷鏈物流配送協(xié)議
- 2024年建筑合同糾紛解決策略
- 2024小區(qū)智能化系統(tǒng)工程施工合同協(xié)議書范本
- 四肢關(guān)節(jié)病癥推拿治療-梨狀肌綜合癥患者的推拿治療
- 房產(chǎn)開發(fā)地塊收購項目可行性研究報告(完美版)
- JJF 2133-2024海洋資料浮標(biāo)傳感器校準(zhǔn)規(guī)范
- HGT 6333-2024《煤氣化灰水阻垢分散劑阻垢性能測定方法》
- 高三一?!叭松枰獙W(xué)會繞行”審題立意及范文(彩色高效版)
- 2023-2024學(xué)年江蘇省南京玄武區(qū)中考語文最后一模試卷含解析
- 職場心理學(xué)智慧樹知到期末考試答案章節(jié)答案2024年山東工商學(xué)院
- 2024中國通信服務(wù)股份限公司招聘公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 中醫(yī)養(yǎng)生活動策劃方案
- 汽車坡道玻璃雨棚施工方案
- 漫畫解讀非煤地采礦山重大事故隱患判定標(biāo)準(zhǔn)
評論
0/150
提交評論