




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、內(nèi)網(wǎng)一體化安全防護系統(tǒng)中內(nèi)網(wǎng)一體化安全防護系統(tǒng)中蒲堪峰:內(nèi)部局域網(wǎng)中USB設(shè)備分類監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)安全與保密內(nèi)部局域網(wǎng)中USB設(shè)備分類監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)蒲堪峰(電信科學(xué)技術(shù)第十研究所 陜西 .西安 710061)摘 要:分析了Windows 2000 操作系統(tǒng)下采用HOOK系統(tǒng)IRP消息的方式實現(xiàn)對USB設(shè)備分類監(jiān)控,可對用戶的USB設(shè)備操作行為進行實時監(jiān)控。該系統(tǒng)采用集中式管理,分布式控制架構(gòu),具有動態(tài)的USB設(shè)備變更檢測、類型檢測、敏感USB設(shè)備控制,安全警報,日志審計等功能。作為內(nèi)網(wǎng)一體化安全防護系統(tǒng)的一個子系統(tǒng),通過實際使用表明,該系統(tǒng)能夠有效地控制和降低 USB 設(shè)備對內(nèi)部網(wǎng)造
2、成的信息安全風(fēng)險。關(guān)鍵詞:USB IRP WDM 設(shè)備監(jiān)控 HOOK 在我國,國家政府部門、企事業(yè)單位已經(jīng)越來越多地使用計算機網(wǎng)絡(luò)開展日常工作和業(yè)務(wù),利用計算機網(wǎng)絡(luò)發(fā)送和處理大量的內(nèi)部秘密文件。越來越龐大的計算機網(wǎng)絡(luò)及其不斷更新的相關(guān)技術(shù)也帶來了不斷增長的安全隱患,網(wǎng)絡(luò)安全已經(jīng)成為了一個國際化的問題。防病毒、防黑客、物理隔離、數(shù)據(jù)備份、防火墻等是人們常用的防止外部網(wǎng)絡(luò)侵害的信息保護手段。然而更大的安全隱患來源于網(wǎng)絡(luò)內(nèi)部,據(jù)統(tǒng)計,大約有80% 的安全破壞是在網(wǎng)絡(luò)內(nèi)部發(fā)生的。所以防范來自內(nèi)部的攻擊更為重要、更為迫切,一旦因為各種原因?qū)е聝?nèi)部涉密文件泄漏,將對國家穩(wěn)定和社會安全造成巨大威脅。因此,針
3、對內(nèi)部網(wǎng)絡(luò)終端使用者行為、移動存儲設(shè)備、用戶身份認證管理等開發(fā)的“內(nèi)網(wǎng)一體化安全防護系統(tǒng)”,將從技術(shù)上解決這個問題,使已發(fā)生的事件不再是無法追查,并能夠做到有理有據(jù)。USB接口是計算機網(wǎng)絡(luò)信息傳輸?shù)囊粋€重要途徑,同時也是內(nèi)部網(wǎng)病毒的傳播源,因此很多保密單位都在物理上禁用 USB端口。但由于USB設(shè)備種類眾多且使用廣泛,僅僅簡單地禁用 USB 接口會使無威脅的外圍設(shè)備如USB 鼠標(biāo)、鍵盤和USBKEY 等無法使用,給用戶帶來很多不便。本文講述了“內(nèi)網(wǎng)一體化安全防護系統(tǒng)”中基于微軟Windows 2000操作系統(tǒng)下的USB設(shè)備監(jiān)控系統(tǒng)USBMon的實現(xiàn)。該子系統(tǒng)可以根據(jù)管理員制定的策略分類管理US
4、B設(shè)備,方便管理員對網(wǎng)絡(luò)中各主機的USB設(shè)備進行細粒度的管理。一、USBMon監(jiān)控系統(tǒng)的基本原理1Windows 2000系統(tǒng)結(jié)構(gòu)Windows 2000操作系統(tǒng)使用IRP與內(nèi)核模式驅(qū)動程序(NT4和WDM)通信1 。圖1是以用戶視點所看到的Windows 2000操作系統(tǒng),該圖描述了驅(qū)動程序開發(fā)者所關(guān)心的特征。當(dāng)用戶模式程序需要讀取設(shè)備數(shù)據(jù)時,它就調(diào)用Win32 API函數(shù),如ReadFile。Win32子系統(tǒng)模塊(如Kernel32.dll)通過調(diào)用平臺相關(guān)的系統(tǒng)服務(wù)接口實現(xiàn)該API,而平臺相關(guān)的系統(tǒng)服務(wù)將調(diào)用內(nèi)核模式支持例程。在ReadFile調(diào)用中,調(diào)用先到達系統(tǒng)DLL(Ntdll.d
5、ll)中的一個入口NtReadFile函數(shù),然后這個用戶模式的 NtReadFile函數(shù)接著調(diào)用系統(tǒng)服務(wù)接口,最后由系統(tǒng)服務(wù)接口調(diào)用內(nèi)核模式中的服務(wù)例程,該例程同樣名為NtReadFile。系統(tǒng)中還有許多與NtReadFile相似的服務(wù)例程運行在內(nèi)核模式中,為應(yīng)用程序請求提供服務(wù),并以某種方式與設(shè)備交互。它們首先檢查傳遞給它們的參數(shù),以保護系統(tǒng)安全或防止用戶模式程序非法存取數(shù)據(jù),然后創(chuàng)建一個稱為“I/O請求包(IRP) ”的數(shù)據(jù)結(jié)構(gòu),并把這個數(shù)據(jù)結(jié)構(gòu)送到某個驅(qū)動程序的入口點;NtReadFile將創(chuàng)建一個主功能代碼為IRP_MJ_READ的IRP,執(zhí)行IRP的設(shè)備驅(qū)動程序最后可能會訪問硬件;驅(qū)
6、動程序完成一個I/O操作后,通過調(diào)用一個特殊的內(nèi)核模式服務(wù)例程來完成該IRP。完成操作是處理IRP的最后動作,它使等待的應(yīng)用程序恢復(fù)運行。同樣,對于USB設(shè)備的所有操作都是通過向USB設(shè)備發(fā)送相應(yīng)的IRP 完成的。USBMon攔截所有發(fā)往USB設(shè)備的IRP,并對其中的內(nèi)容進行分析。如果發(fā)現(xiàn)USB設(shè)備處于配置階段,說明新插入USB設(shè)備,這時,USBMon會通過發(fā)送相應(yīng)的IRP得到新插入USB設(shè)備的設(shè)備類型,如存儲類設(shè)備、USB集線器類設(shè)備或者廠商自定義設(shè)備等,再根據(jù)策略文件來決定是否啟用這個設(shè)備。USBMon中的關(guān)鍵問題是IRP攔截、判斷新設(shè)備的加入以及對廠商自定義類設(shè)備的管理。2HOOK 系統(tǒng)
7、的IRP消息Windows 2000下,設(shè)備和驅(qū)動程序的有著明顯的堆棧式層次結(jié)構(gòu):處于堆棧最底層的設(shè)備對象稱為物理設(shè)備對象,或簡稱為PDO,與其對應(yīng)的驅(qū)動程序稱為總線驅(qū)動程序;在設(shè)備對象堆棧的中間某處有一個對象稱為功能設(shè)備對象(FDO),其對應(yīng)的驅(qū)動程序稱為功能驅(qū)動程序;在FDO的上面和下面還會有一些過濾器設(shè)備對象(FiDO);位于FDO上面的過濾器設(shè)備對象稱為上層過濾器,其對應(yīng)的驅(qū)動程序稱為上層過濾器驅(qū)動程序;位于FDO下面( 但仍在PDO之上)的過濾器設(shè)備對象稱為下層過濾器,其對應(yīng)的驅(qū)動程序稱為下層過濾器驅(qū)動程序。這種棧式結(jié)構(gòu)可以使I/O請求過程更加明了。每個影響到設(shè)備的操作都使用IRP,
8、通常IRP先被送到設(shè)備堆棧的最上層驅(qū)動程序,然后逐漸過濾到下面的驅(qū)動程序。根據(jù)設(shè)備以及該IRP所攜帶的內(nèi)容,每一層驅(qū)動程序都可以決定如何處理IRP,有時驅(qū)動程序不做任何事,只是向下層傳遞該IRP;有時驅(qū)動程序直接處理完該IRP不再向下傳遞;有時驅(qū)動程序既處理了該IRP又把該IRP傳遞下去。USB設(shè)備驅(qū)動程序在與硬件設(shè)備進行通信時,一般使用USB總線驅(qū)動程序接口(USBDI,USB Driver Interface),而不直接使用HAL函數(shù)與硬件通信。USB驅(qū)動程序為了向其硬件設(shè)備發(fā)送一個請求,先創(chuàng)建一個USB請求塊(URB),再把 URB提交到總線驅(qū)動程序。例如:為了配置一個USB設(shè)備,USB
9、設(shè)備的驅(qū)動程序需要提交幾個URB來讀取各種描述符或發(fā)送命令,向USBD的調(diào)用被轉(zhuǎn)化為帶有主功能代碼為IRP_MJ_INTERNAL_DEVICE_CONTROL的IRP;然后,這個IRP會被發(fā)往由USB集線器驅(qū)動為USB設(shè)備創(chuàng)建的PDO對象。微軟提倡的IRP攔截方法是創(chuàng)建一個上層過濾設(shè)備對象,并將它加到要攔截設(shè)備所在的設(shè)備堆棧中,其過程為:先通過IoCreateDevice創(chuàng)建自己的設(shè)備對象;然后獲得要攔截設(shè)備的設(shè)備對象指針;最后通過IoAttachDeviceToDeviceObject將自己的設(shè)備放到設(shè)備堆棧上成為一個過濾器。這種方法是最可靠,也是最常用的。但是,在USBMon中使用這種方
10、法會有些問題。假如有一個USB存儲設(shè)備接到USB Hub上,USB Hub的驅(qū)動程序會為這個USB存儲設(shè)備創(chuàng)建一個PDO,然后由USB存儲設(shè)備的驅(qū)動程序(Windows 2000下為usbstor.sys)創(chuàng)建FDO對象并加到PDO上。此時如果把過濾設(shè)備對象加入設(shè)備堆棧,過濾設(shè)備將在設(shè)備堆棧的最上層,I/O管理器發(fā)給USB設(shè)備的IRP 將先經(jīng)過過濾設(shè)備;而如果先加好了過濾驅(qū)動,再插入閃存時就會形成圖2所示的設(shè)備堆棧結(jié)構(gòu)。絕大多數(shù)的IRP都是由USB Hub驅(qū)動建立的PDO對象完成,此時根本達不到過濾的效果,因而這種方法只有在USB設(shè)備加入后才能攔截IRP,這就使它無法檢測到設(shè)備的動態(tài)插入。如果
11、僅僅是對設(shè)備的操作進行記錄,而不需要檢測設(shè)備的動態(tài)插入,這到不失為一種理想的方法。USB設(shè)備USB設(shè)備對應(yīng)的FDO(由USBHUB驅(qū)動建立)過濾設(shè)備對象USB Hub設(shè)備對象圖2 添加過濾設(shè)備形成的設(shè)備棧USBMon使用了HOOK驅(qū)動設(shè)備對象派遣函數(shù)的方法來攔截IRP,對于發(fā)往設(shè)備的IRP,I/O管理器會使用DeviceObject中的DriverObject反向指針來定位相應(yīng)的驅(qū)動程序?qū)ο螅缓蟾鶕?jù)IRP和IRP堆棧中的參數(shù)調(diào)用相應(yīng)的驅(qū)動程序例程。從IRP處理過程可看出,只要將驅(qū)動程序例程指針用相應(yīng)的鉤子函數(shù)來代替就可達到攔截IRP的目的。這種方法最簡單直接,而且攔截IRP時不會受到過濾設(shè)備
12、必須在設(shè)備堆棧棧頂?shù)南拗?。這里選擇了HOOK USB集線器驅(qū)動程序的分發(fā)例程。通過動態(tài)調(diào)試發(fā)現(xiàn),驅(qū)動程序開發(fā)中,經(jīng)常使用的IRPTrace工具,通過HOOK IoCallDriver等IRP處理過程中必須使用的I/O服務(wù)例程來達到攔截IRP的目的,它使用的方法類似上層截獲API調(diào)用的方法,直接改寫ntokrnl.exe的PE頭導(dǎo)出節(jié)。這種方法可以截獲到系統(tǒng)內(nèi)所有的IRP,適用面很廣,與上面的方法相比,只是實現(xiàn)的難度和系統(tǒng)開銷稍微大了一點。另一種方法是通過給USB集線設(shè)備添加過濾驅(qū)動程序來攔截IRP。這種方法最保險且穩(wěn)定。3通過分析IRP獲取設(shè)備加入通知USBMon要完成的功能是根據(jù)設(shè)備策略禁用
13、USB設(shè)備,并不關(guān)心USB設(shè)備的具體操作,因此鉤子函數(shù)的工作僅僅是監(jiān)控新設(shè)備的加入并根據(jù)策略及時對設(shè)備的啟用進行控制。所有新加入的設(shè)備都要通過配置才能使用,USBMon通過設(shè)備配置過程中的某些特殊操作來獲得新設(shè)備加入的通知,并根據(jù)策略及時阻止。以下是USB設(shè)備連接時的總線列舉過程。(1)USB集線器發(fā)現(xiàn)有USB設(shè)備插入時,會向主機報告其下行端口上有 USB設(shè)備連接。主機接到該通知后,會向集線器發(fā)出GetPortStatus請求,以了解更多信息;(2)主機向該集線器發(fā)出GetPortStatus請求(集線器設(shè)備類請求),以復(fù)位這個USB設(shè)備;(3)主機使用默認地址向USB設(shè)備發(fā)出GetDescr
14、iptor請求,以取得其缺省控制管道所支持的最大包長度;(4)主機向USB設(shè)備發(fā)出SetAddress請求,為其分配一個唯一的設(shè)備地址;(5)主機使用新地址向USB設(shè)備發(fā)出GetDescriptor請求,以讀取其設(shè)備描述符的全部字段,以了解該設(shè)備的總體信息,如供應(yīng)商ID、產(chǎn)品ID等;(6)主機向USB設(shè)備循環(huán)發(fā)出GetDescriptor請求,以讀取其全部配置信息;(7)主機根據(jù)USB設(shè)備的配置信息如供應(yīng)商ID、產(chǎn)品ID等,為其選擇一個合適的驅(qū)動程序;(8)加載USB設(shè)備驅(qū)動程序以后,主機發(fā)出SetConfiguration(x)請求為該設(shè)備選擇一個合適的配置(x代表非0的配置值)。以上過程都
15、是配置USB設(shè)備必不可少的。在鉤子函數(shù)中阻止上面任何一步的正確完成,都可以達到禁用設(shè)備的目的。但USBMon是需要獲得一些設(shè)備信息來判斷新加入的設(shè)備是否應(yīng)該被禁用,獲取信息的過程只能在主機分配設(shè)備地址之后才能完成,因此選擇將SetConfiguration(x)請求作為有新設(shè)備加入的標(biāo)志。SetConfiguration請求并不是配置過程特有的,或許在某些情況下也要使用這個請求(測試中暫時還沒發(fā)現(xiàn)這種情況),但只要有設(shè)備加入就一定會有 SetConfiguration(x)請求。一旦USBMon攔截到SetConfiguration(x)請求,說明有新設(shè)備加入,這時它將會去獲取設(shè)備類型信息。如
16、果此類設(shè)備是被禁用的, USBMon直接完成這個請求并返回狀態(tài)NTSTATUS_UNSUCCESSFUL;否則將請求交給正常的驅(qū)動程序服務(wù)例程。二、USBMon監(jiān)控系統(tǒng)的設(shè)計實現(xiàn)USBMon監(jiān)控系統(tǒng)采用C/S 模式、分布式控制技術(shù),整個系統(tǒng)由一個監(jiān)管控制臺(Console)和若干監(jiān)管代理(Agent)組成,Console和Agent之間采用socket 進行通信,如圖3所示。管理員通過監(jiān)管控制臺統(tǒng)一設(shè)置和分發(fā)各個節(jié)點的安全策略,監(jiān)管代理駐留在各個受控主機的節(jié)點上,以安全中間件的方式嵌入到系統(tǒng)內(nèi)核,按照安全策略對本機節(jié)點上接入的各種USB 設(shè)備進行管理,并對用戶行為進行監(jiān)視,一旦發(fā)現(xiàn)用戶有違規(guī)操
17、作USB設(shè)備的行為,立即加以阻斷,并向控制臺發(fā)出報警信號。同時,違規(guī)行為的相關(guān)信息被記錄在日志文件中,作為追究違規(guī)者責(zé)任的依據(jù)和憑證。1- 2圖3 USBMonitor系統(tǒng)監(jiān)控模型客戶端程序 Agent 由 Ring 0 級和 Ring 3 級2個部分組成,如圖4所示。Ring 0 級模塊是注入到設(shè)備堆棧的監(jiān)控驅(qū)動程序,負責(zé)新設(shè)備插入和設(shè)備狀態(tài)變更的監(jiān)視;Ring 3 級是監(jiān)控進程,在收到監(jiān)控驅(qū)動后進行設(shè)備識別和設(shè)備控制。監(jiān)控驅(qū)動通過一個信號量與監(jiān)控進程進行通信,當(dāng)監(jiān)控進程收到監(jiān)控驅(qū)動的消息有新USB 設(shè)備接入時,會對設(shè)備進行識別,然后根據(jù)識別出的設(shè)備類型,進行策略匹配。如不符合管理員設(shè)定的設(shè)
18、備控制策略,則將本設(shè)備禁用。圖4 Agent 監(jiān)控模型當(dāng)管理員更新了安全策略,Agent 會枚舉所有USB 設(shè)備并依次進行策略匹配。如果用戶在客戶端試圖啟用違禁設(shè)備,Agent 就會報警,重新對所有USB 設(shè)備進行一次策略匹配,將用戶非法啟用的設(shè)備禁用。在某些特殊情況下,如策略文件丟失或被破壞,Agent 將按照默認策略實施控制,以防違禁設(shè)備被非法使用。Agent由應(yīng)用層程序和驅(qū)動程序兩部分組成。應(yīng)用程序負責(zé)從服務(wù)器下載策略文件并在必要時通知管理員對策略進行更新。驅(qū)動程序主要由初始化過程、鉤子函數(shù)的實現(xiàn)及策略控制構(gòu)成。1初始化過程應(yīng)用程序傳遞驅(qū)動程序使用的信息,驅(qū)動程序禁用監(jiān)控系統(tǒng)啟動前就插入
19、的違規(guī)設(shè)備。(1)應(yīng)用程序創(chuàng)建一個Event對象并將句柄發(fā)給驅(qū)動程序用于兩者間的通信;(2)應(yīng)用程序通過SetupDiEnumDeviceInterfaces API獲得USB Hub設(shè)備的句柄并發(fā)給驅(qū)動程序,驅(qū)動程序通過這個句柄獲得USB Hub設(shè)備對象,然后獲得相應(yīng)的驅(qū)動對象指針;(3)HOOK USB Hub驅(qū)動程序的分發(fā)例程;(4)應(yīng)用程序讀取策略并將策略發(fā)送給驅(qū)動程序;(5)驅(qū)動程序通過USB Hub驅(qū)動對象中的設(shè)備鏈表枚舉設(shè)備,如果設(shè)備對象中的AttachedDevice域不為空,說明有USB設(shè)備在設(shè)備堆棧上,這時進行策略匹配。對于被禁止的USB設(shè)備,向設(shè)備對象發(fā)送副功能碼為IRP
20、_MN_QUERY_STOP_DEVICE和IRP_MN_ STOP_DEVICE的PnP IRP,達到禁用設(shè)備的目的。2HOOK IRP流程圖5給出了鉤子函數(shù)的流程圖圖5鉤子函數(shù)的流程圖USB設(shè)備識別就是識別出與系統(tǒng)連接的USB設(shè)備類型,特別是會危害到內(nèi)部網(wǎng)信息安全的設(shè)備,如USB存儲設(shè)備、USB通信設(shè)備等。USB設(shè)備識別是通過檢查設(shè)備在其設(shè)備描述符中所回答的設(shè)備類型來完成(調(diào)用函數(shù)UsbBuildGetDescriptorRequest),可以通過詢問一臺設(shè)備描述符并對該描述符進行語法分析來確定設(shè)備類型。代理軟件可通過GET_DESCRIPTOR請求來獲取這些描述符;獲取設(shè)備類型是通過讀取
21、設(shè)備的接口描述符完成的。SendAwaitUrb用來構(gòu)造IRP并將其發(fā)送給DeviceObject(DeviceObject為I/O管理器傳進來的參數(shù),表示I/O管理器發(fā)送此IRP的目標(biāo))。一個USB設(shè)備可有多個接口,對于多功能設(shè)備,各接口的接口類型可能是不一樣的,USBMon需要枚舉SetConfiguration(x)請求中第x 配置下的所有接口。3策略控制按照標(biāo)準(zhǔn)USB設(shè)備分為音頻設(shè)備類、通信設(shè)備類、HID設(shè)備類、顯示設(shè)備類、海量存儲設(shè)備類、電源設(shè)備類、打印機設(shè)備類、集線器設(shè)備類和廠商自定義設(shè)備類等,不少廠商會把其生產(chǎn)的設(shè)備歸入自定義類。如在實驗中使用的HP USB刻錄機,雖然它更像是一個海量存儲設(shè)備,這給設(shè)備的管理帶來了一些麻煩,因此USBMon對廠商的自定義類設(shè)備進行單獨管理。策略文件中保存了所有接入過主機的自定義類設(shè)備的字符串描述符和使用字符串描述符獲得的散列值(使用散列可以提高查找效率),當(dāng)有自定義設(shè)備插入時,USBMon在策略中查找設(shè)備,如果沒找到,說明設(shè)備是第一次使用,USBMon會先禁用該設(shè)備,然后讀取字符串描述符并通知管理員有新設(shè)備插入,由管理員來決定設(shè)備是否可用,無論管理員做出什么決定,這個設(shè)備的相關(guān)信息都會被加入策略文件。管理員事先設(shè)定USB設(shè)備安全策略,選擇允許用戶使用的USB設(shè)備類別生成
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度教育機構(gòu)講師團隊合作協(xié)議
- 公司文員勞動協(xié)議
- 全球環(huán)境治理項目資金捐贈協(xié)議
- 中國地理讀后感
- 《數(shù)學(xué)競賽題庫設(shè)計與復(fù)習(xí)教學(xué)教案》
- 大宗商品貿(mào)易管理流程手冊
- 委托貸款借款合同
- 農(nóng)產(chǎn)品質(zhì)量安全追溯手冊
- 互聯(lián)網(wǎng)軟件開發(fā)合同協(xié)議
- 綠化工程承包合同協(xié)議
- 小兒抽動癥中西醫(yī)治療
- 一年級下冊《綜合實踐活動》全冊教案【完整版】
- 人教版小學(xué)一年級英語課本上冊課件
- 電子對抗原理與技術(shù)PPT完整全套教學(xué)課件
- 烹飪美學(xué)PPT完整全套教學(xué)課件
- 人美版初中美術(shù)知識點匯總九年級全冊
- 中交第三航務(wù)工程局有限公司安全管理制度匯編(2020版)
- 公路工程崗位安全操作規(guī)程
- 中藥知識全解及分類大全
- 中醫(yī)學(xué)理論體系的基本特點(中醫(yī)基礎(chǔ)理論課件)
- 川74取心筒說明書
評論
0/150
提交評論