[I.2] 个人作业:软件案例分析

项目 内容
这个作业属于哪个课程 2026年春季软件工程
这个作业的要求在哪里 [I.2] 个人作业:软件案例分析
我在这个课程的目标是 系统性的学习软件工程的知识,逐步成为一个成熟的软件开发者
这个作业在哪个具体方面帮助我实现目标 调研各领域的成品软件,了解实际的软件开发的流程

本次作业选取代码仓库管理系统进行分析,以 gitlab 作为主要分析对象。

第一部分 调研评测

软件使用

  • 项目主页:可以看到代码、提交、分支等基本信息,侧边栏提供CI/CD等丰富的功能和设置

    image-20260318183837623

  • 群组:适合多人协作,群组下可设子群组和项目,仅群组成员或项目直接成员可见。群成员划分为五级权限(Owner、Maintainer、Developer、Reporter、Guest)

    image-20260318184720503

    image-20260318184810050

  • 创建合并请求(MR)并查看代码差异

    image-20260318195521710

    image-20260318195541336

  • CI/CD流水线运行:在根目录放置 .gitlab-ci.yml,写 build 和 test 两个 job,推代码后自动触发流水线。在“CI/CD → Pipelines”里能看到每个 job 的运行状态,进入后能看详细日志。

    image-20260318184320067

软件分析

基本流程

  1. 注登登录:通过邮箱注册,支持OAuth2.0第三方登录(如GitHub)。
  2. 创建项目:输入项目名称、描述,选择可见性(私有/内部/公开),初始化仓库(含README或.gitignore)。
  3. 通过Web IDE或本地Git客户端提交代码,支持分支创建、切换、合并。
  4. 协作功能:发起合并请求(MR),指定审核人,讨论代码变更,合并至目标分支。
  5. CI/CD:配置.gitlab-ci.yml文件,自动触发构建、测试、部署流水线。

GitLab能高效解决软件开发全流程需求:从代码托管、版本控制到自动化构建、部署,尤其适合团队协作开发。其内置的CI/CD工具链显著降低了DevOps门槛,符合我们大学生课程项目、毕业设计的协作需求。

优缺点分析

维度 优点 缺点
数据量 支持TB级仓库存储,大文件通过Git LFS管理,适合长期项目积累。 免费版CI/CD runner资源有限(共享runner排队时间长),大型项目构建效率低。
界面 布局清晰,左侧导航栏分类明确(项目、合并请求、CI/CD等),新手易上手。 高级功能(如权限配置、CI变量管理)入口较深,需多次点击查找。
功能 集成代码审查、Issue跟踪、Wiki、容器镜像仓库,一站式覆盖开发全流程。 移动端适配差,手机端操作按钮过小,无法高效处理MR审核。
准确度 版本控制基于Git,历史记录不可篡改,分支合并冲突提示准确。 偶尔出现MR diff显示错误(如二进制文件误标为文本差异)。
用户体验 提供新手引导教程,支持中文界面,降低非英语用户学习成本。 权限配置逻辑复杂(如“Guest”“Reporter”等角色权限边界模糊),易出错。

改进意见

重新设计移动端UI,增大操作按钮,支持核心功能(如MR审核、代码提交)的触屏操作

简化权限配置,提供“权限模板”(如“学生项目模板”“教师审核模板”),一键应用预设权限规则,减少手动配置错误。

用户调研

采访对象

本次用户调研采访的是王德庆班的杨博帆

  • 背景:北京航空航天大学计算机学院大三本科生,目前正从事于软件工程课设项目开发

  • 需求:课程项目需多人协作,需稳定托管代码、方便老师审核代码、自动运行测试用例。

  • 使用栏目:项目主页、合并请求(MR)、CI/CD流水线、Issues

  • 问题:GitLab的MR审核时,代码行内评论无法@特定成员,需手动提及其他人用户名。

  • 亮点:GitLab的CI/CD配置可视化(.gitlab-ci.yml实时预览)

image-20260318201344764

定量评价

维度 评分标准简述 评分(1-5) 说明
功能性 核心功能覆盖率(如分支保护、CI/CD、代码审查) 5 功能完整,覆盖开发全流程,无关键缺失。
可靠性 平均无故障时间(MTBF),如 1000 次操作中出现 5 次崩溃 4 企业级稳定性,但偶发 MR diff 显示错误。
易用性 新手完成任务时间(如“创建项目并提交代码”) 3 功能强大但学习曲线陡峭,权限配置复杂。
效率 CI/CD 构建速度(如 10 个测试用例) 4 构建速度快,但免费版共享 runner 排队时间长。
维护性 bug 修复周期(如中等级别 bug 从提交到修复) 4 社区活跃,修复较快,但权限逻辑测试覆盖不足。
可移植性 跨平台兼容性(Windows/macOS/Linux) 5 全平台支持,功能一致,无兼容问题。

评测结论

D:好,不错

GitLab功能全面,尤其CI/CD集成和代码管理能力突出,能满足高校学生从课程项目到毕业设计的协作需求。虽存在移动端体验和权限配置复杂等问题,但核心功能稳定可靠,且持续更新优化,是开发者值得信赖的工具。

Bug分析与提交

量化标准

(注:由于本人测试未发现明显功能性bug,以下两处bug为上网查阅资料所得,文末已注明出处)

  • 严重性:5星(致命,系统崩溃/数据丢失)、4星(严重,核心功能失效)、3星(中等,次要功能异常)、2星(轻微,UI显示问题)、1星(建议,优化项)。
  • 影响范围:5星(影响所有用户)、4星(影响80%用户)、3星(影响50%用户)、2星(影响20%用户)、1星(影响个别用户)。
  • 复现难度:5星(极难复现,需特定环境+多次操作)、4星(较难,需特定环境)、3星(中等,常规操作可复现)、2星(较易,简单操作可复现)、1星(极易,每次操作必现)。

Bug1:CVE-2023-7028 任意用户密码重置漏洞(账户接管)

  • 测试环境

    • OS:Ubuntu 20.04 LTS
    • GitLab版本:16.6.2 (CE)
    • 容器环境:Docker
    • 攻击工具:Burp Suite、浏览器、Vozec/CVE-2023-7028 PoC脚本
  • 可复现性:满足特定条件必然发生。

  • 复现条件

    1. GitLab版本在受影响范围内
    2. 攻击者已知晓目标用户的注册邮箱地址。
    3. SMTP邮件服务配置正常,能发送邮件。
  • 复现步骤

    1. 访问GitLab登录页面,点击“忘记密码”。
    2. 在邮箱输入框填入受害者邮箱,拦截HTTP POST请求。
    3. 修改请求体,将邮箱参数改为数组形式,添加攻击者控制的邮箱:user[email][]=15xxxxxxx@163.com&user[email][]=attacker@example.com
    4. 放行修改后的请求,GitLab将向受害者邮箱和攻击者邮箱发送相同的密码重置链接。
    5. 攻击者打开邮箱中的重置链接,设置新密码,成功登录受害者账户。
  • Bug现象:攻击者通过构造恶意的多邮箱密码重置请求,诱使GitLab向攻击者邮箱发送本应仅发送给受害者的密码重置链接,从而在无需受害者交互的情况下接管其账户。

    image-20260318194636252

    image-20260318194650640

  • Bug分析

    • 成因:GitLab在处理密码重置请求时,未对提交的邮箱地址进行有效验证和过滤,错误地允许提交多个邮箱地址。后端逻辑将所有提交的邮箱视为合法接收方,导致密码重置链接被发送至未授权的攻击者邮箱。这属于业务逻辑缺陷与安全校验缺失。
    • 严重性:5星(致命)。攻击者可直接接管任意用户的GitLab账户,窃取源代码、植入后门或破坏项目,造成严重的机密性、完整性和可用性损害。
    • 影响范围:5星(影响所有用户)。任何使用受影响版本GitLab的组织和个人均面临账户被接管的风险,波及范围广。
    • 复现难度:1星(极易)。仅需知晓目标邮箱并构造一个简单的HTTP请求即可成功利用,无任何技术门槛。
  • 为何未修复

    开发团队在设计和实现密码重置功能时,未充分考虑多值参数注入的场景,缺乏对此类边界情况的测试用例覆盖。常规功能测试通常只验证单一邮箱的正常流程,未能发现这种逻辑缺陷,直至被外部安全研究人员报告。

  • 改进建议

    • 正常行为是仅向请求中提交的、且与账户绑定的已验证邮箱发送密码重置链接。

    • 在处理密码重置请求时,服务端应严格校验提交的邮箱地址是否为请求账户绑定的主邮箱或已验证的辅助邮箱。若提交多个邮箱,应仅处理第一个或明确标记的邮箱,或直接拒绝包含多个邮箱的请求,并返回错误提示。同时,应加强输入参数的类型检查和白名单过滤。

Bug2:CVE-2022-2992 Ruby反序列化远程代码执行漏洞

  • 测试环境

    • OS:Ubuntu 20.04 LTS
    • GitLab版本:15.2.2 (CE)
    • 攻击环境:Ruby 3.0.0, Python 3.8, Ngrok
  • 可复现性:满足特定条件必然发生。

  • 复现条件

    1. GitLab版本在受影响范围内。
    2. 攻击者拥有一个有效的、具有所有Scope的Access Token。
  • 复现步骤

    1. 使用Ngrok将内网攻击机(运行Python脚本的机器)暴露到公网,获取公网URL。
    2. 使用payload_gen.rb脚本生成一个反弹Shell的恶意Payload。
    3. 修改server.py脚本,填入Payload和Ngrok URL。
    4. 运行exploit.py,指定GitLab Token和目标GitLab实例地址。
    5. 在攻击机上监听对应端口,成功接收反弹Shell,获得服务器控制权。
  • Bug现象:经过身份验证的攻击者通过构造恶意的GitHub API请求,利用Ruby反序列化机制,在GitLab服务器上执行任意系统命令,完全控制服务器。

    ngrok收到请求

    image-20260318194755386

    sever端:

    image-20260318194732151

    getshell

    image-20260318194744169

  • Bug分析

    • 成因:GitLab在处理从GitHub API端点导入数据的功能中,未对传入数据进行严格的安全过滤,直接将其传递给Ruby的YAML反序列化函数。攻击者可构造恶意的YAML数据,利用Ruby Gadget链触发system()等危险方法,实现RCE。这是典型的不安全反序列化漏洞。
    • 严重性:5星(致命)。这是最高危的安全漏洞,直接导致系统被完全接管,造成核心数据泄露、服务瘫痪或被植入后门。
    • 影响范围:4星(影响80%用户)。影响所有使用受影响版本(15.1.6之前,15.2.4之前,15.3.2之前)的GitLab实例,无论公有云还是私有部署。
    • 复现难度:2星(较易)。在拥有有效Token和特定版本的环境下,按照公开的POC步骤,攻击成功率极高。
  • 为何未修复

    此类漏洞通常依赖于特定版本的Ruby语言特性,且利用链复杂,在常规功能测试和代码审计中难以发现,直到被安全研究人员(如HackerOne上的白帽)发现并提交报告后才被知晓。

  • 改进建议

    • 正常行为是安全地解析从外部API导入的数据,并将其存入数据库,不应执行任何系统命令。
    • 实施“安全反序列化”策略。禁止直接使用YAML.load()等危险方法。应改用YAML.safe_load(),该方法只允许解析基本的Ruby对象(如字符串、数组、哈希),并明确禁止加载可能包含危险方法的类(如IO, Kernel, SystemCall等)。同时,对所有外部输入进行严格的白名单验证。

第二部分 分析


工作量分析

模块 核心功能 投入人力与时间
代码托管 Git 仓库管理(HTTPS/SSH)、创建/删除仓库、分支操作、提交历史、文件浏览、Diff 可视化 3 开发 × 6 周
团队协作 Merge Request 全流程、Issue 跟踪、@提醒、跨仓库引用 3 开发 × 4 周
用户与权限 用户注册/登录、组织管理、角色权限(仓库级/分支级)、SSH 密钥 2 开发 × 3 周 + 1 测试 × 2 周
前端与 UI 仓库首页、MR 列表、代码浏览、Markdown 渲染、移动端适配 1 UI × 4 周 + 2 开发 × 1 周
CI/CD 模块 YAML 解析、Runner 调度、日志展示、流水线状态可视化 3 开发 × 3 周
其他功能 Issue 跟踪、Wiki、站内通知系统 2 开发 × 3 周 + 1 测试 × 2 周
测试与优化 单元测试、集成测试、性能调优、Bug 修复 1 测试 × 3 周 + 全体开发 × 2 周
部署与上线 Docker/K8s 部署、域名绑定、监控告警配置 1 开发 × 2 周 + 1 PM × 2 周

开发集中在前 20 周,测试与部署占后 6 周,最后 1 周缓冲。按 6 人团队并行推进,各模块时间尽量不冲突,大约在 30 周内完成 GitLab 基础功能。

软件质量分析

优劣对比(GitLab vs Gitee)

维度 GitLab Gitee
功能性 全功能一体化(CI/CD、DevOps) 基础功能齐全,CI/CD需依赖Gitee Go
可靠性 企业级稳定性,支持高并发 国内服务器稳定,但国际节点较少
易用性 功能强大但学习曲线陡峭 本土化优化好,新手友好
安全性 开源透明,权限控制精细 私有仓库加密,合规性符合国内法规
可扩展性 丰富的插件生态(GitLab Plugins) 插件较少,主要依赖官方更新

质量排名

在同类代码仓库管理系统中(GitHub、GitLab、Gitee、Bitbucket),GitLab凭借全功能集成开源灵活性,质量排名第2(仅次于GitHub的企业版,但开源社区版优于Gitee)。

软件工程改进建议

核心问题:权限配置模块的测试用例覆盖率不足(如Bug 2)。

改进措施:引入自动化权限测试框架,编写角色-权限映射的测试用例(如“Reporter能否查看日志”“Guest能否克隆私有仓库”),每次代码提交时自动运行测试,确保权限逻辑正确性。同时,定期组织“权限配置走查会”,邀请产品经理、开发、测试共同评审权限设计。


第三部分 建议和规划

市场现状

市场概况

  • 全球开发者约1亿人(Statista 2025),中国开发者约3000万(CSDN 2025)。
  • 高校学生(每年新增软件相关专业毕业生约50万)、中小企业(IT预算有限,需低成本DevOps工具)。
  • 代码托管服务市场年增长率约15%(IDC 2025),预计2026年达50亿美元。

竞争产品

  • GitHub:全球市场份额第一(60%),优势在于社区生态,开源项目多,但企业私有仓库收费较高,国内访问不稳定。
  • GitLab:开源社区版免费,CI/CD集成强,适合企业私有部署,国内用户占比约15%。
  • Gitee:国内市场份额第二(25%),本土化服务好(中文文档、短信通知),但功能相对单一,国际化不足。

产品定位与竞争态势

产品 定位 优势 劣势
GitHub 全球开源协作平台 社区活跃,开源资源丰富 私有仓库贵,国内访问慢
GitLab 一站式DevOps平台 开源免费,CI/CD集成强 学习曲线陡峭,移动端弱
Gitee 国内开发者服务平台 本土化体验好,访问速度快 功能局限,国际化不足
Bitbucket Atlassian生态集成工具 与Jira无缝联动 独立使用成本高,国内支持弱

市场与产品生态

核心用户群

个人开发者、企业开发团队、高校软件专业学生(课程项目、毕业设计协作)。

典型用户画像:

  • 我自己(21岁,计算机科学与技术专业大三学生):需与3名同学协作开发软工课设(学习助手Agent),需求包括代码托管、分支管理、老师审核MR、自动运行测试用例
  • 袁经理(35岁,中小企业技术负责人):团队10人,预算有限,需私有部署的代码管理平台,集成CI/CD和项目管理工具

用户生态

  • 师生关系:高校教师(审核代码)→学生(提交MR),可通过GitLab的“教师审核模板”权限配置简化流程。
  • 团队协作:开发者→测试→产品经理,通过Issue跟踪和MR评论串联工作流程。
  • 开源社区:个人开发者→开源项目维护者→贡献者,GitLab的开源生态吸引开发者贡献插件(如LFS扩展)。

产品生态

子产品有 GitLab Runner(CI/CD执行器)、GitLab Pages(静态网站托管)、GitLab Container Registry

产品规划

新功能设计:AI辅助代码审查助手

  • 功能描述:基于LLM(如CodeLlama),在MR提交时自动分析代码变更,提示潜在bug(如空指针)、性能问题(如循环嵌套过深)、代码规范(如命名不规范)。
  • NABCD分析:
    • Need:高校学生代码经验不足,人工审查效率低;企业团队需快速定位问题。
    • Approach:集成开源LLM API,训练代码审查模型(基于GitLab公共数据集),在MR页面显示AI建议(可一键采纳)。
    • Benefit:降低新人入门门槛,提升代码质量,减少导师/审核人的重复劳动。
    • Competition:GitHub Copilot Chat支持代码解释,但不专注审查;GitLab暂无原生AI审查功能。
    • Delivery:嵌入GitLab MR页面右侧面板,支持“一键忽略”“标记有用”反馈,持续优化模型。

团队角色配置(16周)

周次 角色分工
1-2周 PM:需求调研,制定计划;UI:低保真原型设计;开发:技术选型(Ruby on Rails);测试:制定测试计划。
3-4周 UI:高保真原型;开发:搭建框架,数据库设计;测试:编写测试用例;PM:协调进度。
5-8周 开发:代码托管模块(3人)、协作模块(2人);测试:单元测试;UI:前端页面开发。
9-10周 开发:CI/CD模块(3人)、权限模块(2人);测试:集成测试;PM:风险管理。
11-12周 开发:AI审查助手集成(2人)、其他功能(1人);测试:系统测试;UI:优化交互。
13-14周 测试:UAT(邀请学生用户试用);开发:修复bug;PM:收集反馈调整功能。
15周 部署:Docker容器化部署,配置监控;文档:编写用户手册、API文档。
16周 上线:灰度发布,收集数据;复盘:总结问题与改进点。

竞争优势

通过AI辅助审查功能,GitLab可进一步降低高校学生的代码协作门槛,同时吸引企业团队关注其智能化能力,在教育市场和中小企业市场形成差异化竞争力,与GitHub(侧重开源)、Gitee(侧重本土化)形成错位竞争。

参考资料

GitLab 安全漏洞 CVE-2025-4700 解决方案_gitlab 漏洞-CSDN博客

GitLab漏洞汇总 - FreeBuf网络安全行业门户

posted @ 2026-03-18 20:19  CircleCoder  阅读(13)  评论(0)    收藏  举报