


關鍵詞:逆向工程;惡意代碼分析;容器化技術;遠程調試
中圖分類號:TP311 文獻標識碼:A
文章編號:1009-3044(2024)26-0047-03開放科學(資源服務)標識碼(OSID) :
0 引言
隨著計算機系統和應用程序的不斷發展和普及,安全威脅也日益增多,逆向工程作為分析惡意代碼、漏洞挖掘等安全領域的關鍵技術手段,在保障計算機系統安全方面發揮至關重要的作用。然而,面對日益復雜的計算機系統,如何在不同平臺和環境下處理不同架構的二進制程序,成為安全人員面臨的挑戰。傳統的動態調試工具,如GDB(GNU Debugger) ,在跨平臺和遠程調試方面存在一些局限性[1-3]。
為了解決上述問題,本課題結合容器技術和遠程GDB服務器,設計并實現了一個靈活的遠程調試平臺。該平臺利用容器化技術,構建隔離的調試環境[3-5],并通過遠程服務器提供統一的調試接口,為用戶提供跨平臺、跨架構的遠程調試體驗。文章將從系統設計、實現、安全性和測試等方面對該平臺進行詳細闡述。
1 系統設計
1.1 系統架構
本項目分為客戶端和服務端,服務端使用Rubyon Rails進行全棧開發,使用了Vue.js作為前端邏輯框架,Element Plus作為前端UI框架,Docker進行容器分發和管理,緩存使用Redis進行存儲。客戶端通過瀏覽器訪問服務端提供的Web界面,進行參數設置、文件上傳、調試操作等。
1.2 模塊設計
本項目將系統劃分成會話管理模塊、文件上傳模塊、容器管理模塊和端口映射模塊,這些模塊在Rails中以控制器的形式存在。
1.3 會話管理控制器
會話管理主要要實現以下功能:
1) 沒有UUID的用戶分配UUID:在所有接口執行前,判斷用戶是否有UUID,如果沒有,為其分配一個新的UUID。
2) 在用戶的Session到期后,銷毀用戶創建的容器:創建容器時,將用戶的UUID作為鍵,將DockerID 作為值存入Redis中,并創建一個定時器,定時檢測Session是否過期,如果過期則銷毀容器。
3) 用戶主動請求清除UUID時,清除用戶的UUID 并銷毀容器:向用戶提供一個功能并綁定到接口上,當用戶訪問接口時,清空UUID并銷毀容器。
1.3.1 文件上傳模塊
文件上傳模塊主要接收用戶上傳的文件,并將文件送入Docker容器中。
1.3.2 容器管理模塊
容器管理模塊負責對容進行控制,提供 Docker 基本信息的查詢接口,以及容器創建、重啟和刪除等功能。容器的創建、重啟和刪除流程圖如圖1和圖2 所示。
2 安全性設計
在軟件系統的設計和實現過程中,安全性是至關重要的方面。本章將詳細介紹系統在設計和實現過程中所采取的各種安全措施,以確保系統的安全性和穩定性。
2.1 用戶身份驗證
用戶身份驗證能夠確保系統只允許經過驗證的用戶訪問和使用。本項目不使用賬號和密碼機制,而是采用UUID和Session實現用戶身份驗證,這樣做可以防止用戶自身泄漏賬號密碼等原因導致資源被惡意用戶獲取,同時采用UUID和Session使得所有用戶都是臨時用戶,減少了服務端資源的使用,避免了冗余的賬戶存在。
實現用戶身份認證以及與Docker綁定主要通過在初始化器initializers 設置兩個線程安全的散列表Concurrent::Hash 分別記錄UUID 的存活時間以及UUID與Docker的對應關系。
2.2 用戶授權
用戶授權確保用戶只能訪問和操作其被授權的資源。在本項目中,用戶的可控制資源由 UUID 嚴格控制,而用戶自身無法控制 UUID。本系統中不設有權限分級,配置完全由服務端代碼以及配置文件控制,所有用戶的權限等級一致,確保用戶無法進行不被允許的操作,服務器也不存在自編寫的危險函數。這樣的設計簡化了權限管理的復雜度,同時降低了權限配置錯誤導致的安全風險。
2.3 容器鑒權
容器內運行了 Linux 系統,而為了避免其他用戶暴力猜解 Linux的 SSH 密碼,在創建容器時,會為容器的賬戶創建一個長度為16的隨機強密碼,該密碼同時包含大寫字母、小寫字母、數字以及特殊符號。這種隨機強密碼的機制大大提高了密碼的安全性,減少了密碼被猜測或破解的可能性。
創建十次生成的密碼如表1所示,可以看到生成的密碼之間沒有直接關聯,都含有大小寫以及特殊符號。
2.4 限制創建
創建容器時,不允許用戶傳入參數進行設置,而只允許用戶手動選擇限定內的選項進行設置。服務端完全不信任用戶的輸入,即使僅允許用戶選擇,也會對用戶的輸入進行白名單校驗,在校驗前不會使用用戶傳入的參數做任何操作。這種限制措施確保了容器創建過程的安全性,防止了用戶通過惡意參數來攻擊系統。
2.5 自動銷毀
在用戶 Session 到期后,系統將自動銷毀該用戶創建的容器,防止閑置的容器被惡意利用。自動銷毀機制確保系統資源能夠及時釋放,同時減少了安全隱患。
該項功能通過在初始化器initializers設置一個獨立線程實現,為了避免冗余,該功能和Session清除功能放在同一個線程中。
2.6 手動銷毀
用戶可以主動請求銷毀其容器,確保在不需要使用容器時,可以立即釋放資源。這一功能允許用戶在使用完資源后及時釋放,從而優化了資源的利用率,并且降低了資源長期占用的風險。
3 運行展示
本配置好環境后,訪問前端頁面的網址,進入站點,首先可以看見的是參數設置頁面。架構選擇x64,連接方法選擇SSH,如圖3所示。
選擇好參數以后點擊確認,會進入操作頁面,可以在操作頁面上上傳文件、查看日志、重啟、刪除容器以及查看容器運行參數,如圖4所示。
使用運行配置中的端口和密碼登錄容器SSH,在容器終端中使用gdb --version命令查看gdb的版本,可以正常查看gdb的版本,如圖5所示。
編寫并編譯連接一個簡單的程序,程序代碼如圖6 所示,這段代碼實現了讀入并輸出一個字符串的功能。
使用gdb 對程序進行調試,在運行程序前,在main函數處下一個斷點,然后再運行程序,可以看到程序到達斷點1,在終端頁面上可以清晰看到寄存器值等信息,如圖7所示。
4 總結
本文設計并實現了一個基于遠程容器化技術的動態匯編調試系統,該系統結合了容器技術和遠程GDB服務器,為用戶提供了一個靈活、高效的遠程調試平臺。系統實現了用戶身份驗證、容器管理、文件上傳、遠程調試等功能,并采取了多項安全措施,保障了系統的安全性和穩定性。實驗結果表明,該系統能夠有效地解決傳統調試工具在跨平臺和遠程調試方面的局限性,為逆向工程、惡意代碼分析等安全領域的研究和實踐提供了一種新的解決方案。未來,將進一步完善系統的功能和性能,例如:
1) 支持更多的調試工具和平臺,例如 LLDB、Win?dows 等。
2) 優化系統的性能,例如減少容器創建和銷毀的時間、提高數據傳輸效率等。
3) 開發更加人性化的用戶界面,例如提供可視化的調試界面、簡化操作流程等。
隨著技術的不斷發展,基于遠程容器化技術的動態匯編調試系統將會得到更加廣泛的應用,為保障計算機系統安全做出更大的貢獻。