基于远程容器化技术的动态汇编调试系统设计与实现

2024-11-22 00:00:00袁皓威温卫
电脑知识与技术 2024年26期

关键词:逆向工程;恶意代码分析;容器化技术;远程调试

中图分类号: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) 开发更加人性化的用户界面,例如提供可视化的调试界面、简化操作流程等。

随着技术的不断发展,基于远程容器化技术的动态汇编调试系统将会得到更加广泛的应用,为保障计算机系统安全做出更大的贡献。