10个Bug环环相扣,你能解开几个?

简介:由阿里云云效主办的2021年第3届83行代码挑战赛已经收官。超2万人围观,近4000人参赛,85个团队组团来战。大赛采用游戏闯关玩儿法,融合元宇宙科幻和剧本杀元素,让一众开发者玩得不亦乐乎。

今天请来决赛赛题设计者杜万,给大家分享一下设计与解题思路。

搭配《用代码玩剧本杀?第3届83行代码大赛剧情官方解析》使用效果更佳。

第四题整体是一个C/S架构,客户客户端是一个编译好的命令行程序,不可被修改,服务端是一个 Spring Boot 的 Web 应用;赛题要求,找出服务端程序的 BUG 并修复;客户端有两个职责,一个是说去向服务端发送正常 HTTP 请求,让参赛者发现BUG。

另一个是验证 bug 修复情况,然后发送给远端的评分程序,获得评分。整个赛题是跑在我们阿里云 DevStudio 上面,在 DevStudio 里我们启动一个Intellij IDEA 的社区版,内置了应用观测器(AppObserver) 插件。

Bug 1 :修复 Regex

我们来看第一个bug 如何修复吧。运行 ‘mvn test’,10 个测试有 9 个错误。

这里有好几个BUG,我们先看正则表达式相关的,我们先修复ExtractHtmlTest,翻阅源码,很快能定位到 Utils.stripHtmlTag 方法,方法名字面意思是去除 HTML Tag 标签,然后仔细查看日志会发现。

删除的Tag内容包括了 > 和 ,那说明正则有问题,下图是对正则的剖析。

所以该 BUG上述两种修复方法都是 OK 的。

解法:将 Utils.java 里的正则表达式`<(?.*)>`改为`<(?[^>]*)>`。 

Bug 2:修复尾串缺失

再次执行 mvn test,发现还有单测没有通过,我们会发现字符串少了一截。

再次查看 Utils.stripHtmlTag 方法,发现 matcher.appendReplacement 方法,如果不熟悉该方法,查看JDK的注释后,会发现 matcher.appendReplacement 和 matcher.appendTail 是成对出现的。所以在循环外补上 matcher.appendTail(builder)。

看图是 matcher.appendReplacement 和 matcher.appendTail 的工作机制,巧用该方法,替换字符串更得心应手。  

Bug 3:修复 EOFException

再次执行 mvn test,仅剩下 EOFException 错误了,很快能定位到报错的方法是 Utils.decodeMessage。

通过分析 ReactiveWebSocketHandler 的头部注释和 Utils.encodeMessage 的方法,我们了解到二进制的包结构:

/*** 二进制包格式* byte 字符集长度; n1* byte[n1] 字符集数据;n1 = 字符集长度* byte[n2] 有效数据;n2 = 包总长度 - n1 - 1*/
@Component("ReactiveWebSocketHandler")
public class ReactiveWebSocketHandler implements WebSocketHandler {
public static byte[] encodeMessage(String message, Charset charset) {ByteArrayOutputStream out = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(out);
byte[] charsetNameBytes = charset.toString().getBytes(ISO_8859_1);try {dos.write((byte) charsetNameBytes.length);  dos.write(charsetNameBytes);dos.write(message.getBytes(charset));dos.flush();} catch (IOException e) {e.printStackTrace();}return out.toByteArray();}

然后在对比 Utils.decodeMessage 可以发现是一个调用时序问题,改正方法如下:

return new String(dis.readAllBytes(), charsetNameDecoder.apply(dis));=>String charsetName = charsetNameDecoder.apply(dis);
return new String(dis.readAllBytes(), charsetName);

此单测 Bug 已经修完了,接下来我们来修运行态的BUG。

配置应用观测器

首先我们先配置一下应用观测器(AppObserver),在赛题的DevStudio中,已经预安装了 AppObserver ,这里配置一下IDEA的启动器,加上应用观测器的 Agent 就好了。

配置好应用观测器后,通过 Spring Boot 的 main 函数启动 Server 端进程。

Bug 4:修复CSRF

执行项目根目录的客户端程序 round4

$./round4___          _       ___ _____/ __\___   __| | ___ ( _ )___ // /  / _ \ / _` |/ _ \/ _ \ |_ \
/ /___ (_) | (_| |  __/ (_) |__) |
\____/\___/ \__,_|\___|\___/____/「第四关」    致命真相
当你直面致命的真相,你是否能面对这残酷的现实?::  通关要求                ::  达到 60 分以上
::  获胜要求                ::  分数最高且用时最短启动客户端程序....=== Step 1 ====
成功获得数据通道: ["/ws/Codeup","/ws/AppObserver","/ws/DevStudio",
]=== Step 2 ====
添加用户 reporter 失败!响应状态码: 403 Forbidden, 响应消息: "An expected CSRF token cannot be found", 请求头:"Authorization: Basic YWRtaW46YWRtaW4xMjM="=== Step 3 ====
使用 reporter 用户无法连接到:ws://localhost:8080/ws/DevStudio, 响应状态码: 401 Unauthorized, 请求头: {"authorization": "Basic cmVwb3J0ZXI6cmVwb3J0ZXI="}

Step2 有一个 CSRF 的报错,由于无法修改客户端程序,需要在 Server 端解决这个问题,关闭掉 CSRF 校验。

使用上面的报错关键字Google一下,很快能找到Spring Security的修改方法。

然后照下午修改,再验证一下,发现响应码从 403 变成了 401,所以修改生效了。

Bug 5:修复 Admin 用户密码错误

上一步再次执行 ./round4 ,Step2 返回了 401,并提示了请求头:"Authorization: Basic YWRtaW46YWRtaW4xMjM=",这里可以看出,使用了HTTP Basic的验证方式,然后401提示,可能是用户名和密码不对,所以这里可以用 base64 解开认证头,修改一下服务端的用户名密码。

Bug 6:Admin 角色不对

再次执行 ./round4 后我们发现,又变回了 403,但是返回错误变成了 Access Denied。看来密码对了,但是没有权限访问,打开 WebSecurityConfig 文件,我们会发现admin角色有两种写法“ADMIN”和“admin”,问题就出在这里,我们统一改成大写试试。

Step2,算过了,接下来出来Step3 的问题了。

Bug 7:缺失 REPORTER 角色

Step 3 报错,使用 reporter 用户无法连接到:ws://localhost:8080/ws/AppObserver, 响应状态码: 403 Forbidden, 请求头: {"authorization": "Basic cmVwb3J0ZXI6cmVwb3J0ZXI="}。

又是一个权限问题,先解开 base64 编码的 Authorization,发现用户密码都是 reporter。接下来需要借助于应用观测器,使用应用观测器在 Round4Controller.addUser 加上虚拟断点,虚拟断点和普通断点一样可以获得执行上下文的线程堆栈和变量信息,但是虚拟断点不会阻塞执行,这个特性对于生产系统非常有用。

具体操作如下图所示

通过虚拟断点,我们发现 reporter 用户的角色名为 REPORTER,而 endpoint "/ws/**", 当前只允许ADMIN角色访问,所以在Security配置里,给该路径添加 REPORTER 角色即可。

解决了角色问题,4 个 Spring Security 相关的 BUG 都已经已经修复掉了。重启服务并执行 ./round4 我们会先发有乱码,那看看乱码怎么修

Bug 8:共享 Buffer

通过对 ReactiveWebSocketHandler 里一连串mapper的分析,我们会发现 getBufferConverter 方法返回了定长的buffer,而这个buffer后面会有一连串的0值,这个很可疑。仔细看代码发现,多次调用之间共享了同一个buffer,而没有清空。解法也很简单,把共享buffer改成每次新建即可。如下图所示:

修复以后,再次执行 ./round4 乱码没有,但是返回内容有点少了,说明还有其他问题。

Bug 9:修复 NPE

修掉上面乱码问题以后,从客户端 round4 的运行输出里已经看不到明显的错误了,这是发现内容有点短,看Server这边的日志,会看到一个NPE的报错:

NPE比较好修,很快能排查到一个 return null。

改成 return ""; 即可。

Bug 10:去除 ThreadLocal

重启服务端,并再次执行 ./round4,内容多了,不过再次乱码。

最后一个Bug,不太好调试,需要靠认证的阅读代码,理解一下上下文,能看到有一个奇怪的ThreadLocal 变量用于缓存 charsetName。

在一个Thread里charset是不变的?去掉估计也不会影响效果,最多性能差一点,尝试去掉。

重启服务端,并再次执行 ./round4。

这下一切正常了。

提取线索

上面三个频道的返回包含了大赛的线索,所以我们可以使用 grep 工具赛选出来。

剧情题我们这里就不讨论了,可以看另外一篇解密文章。

小结

共计修了 10 个 Bug

  • Regex 2个
  • Spring Security 4个
  • NPE 1个
  • EOF 1个
  • 共享状态 2个

赛题涉及到的技术

  • Spring Boot
  • Spring Security
  • Spring WebFlux
  • Java IO
  • JUnit 5
  • Regex
  • Websocket
  • CSRF
  • HTTP Basic Auth

工具

  • DevStudio(Web 版 Intellij IDEA)
  • AppObserver (CloudToolkit 插件)

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小小智慧树机器人_国网营业厅“AI新势力”,科沃斯商用机器人解锁智慧服务新模式!...

智慧营业厅新格局&#xff0c;AI机器人成标配&#xff1f;AI加持&#xff0c;万物互联、万物智能。2019年&#xff0c;应用人工智能的门槛下降&#xff0c;大量人工智能催生的新产品、服务和最佳实践轮番出现。人工智能正在重塑各行各业&#xff0c;传统营业厅网点该如何搭上AI…

AIoT时代存储如何升级?长江存储发布高速闪存芯片UFS 3.1

2022年4月19日&#xff0c;长江存储科技有限责任公司&#xff08;简称“长江存储”&#xff09;宣布推出UFS 3.1通用闪存——UC023。这是长江存储为5G时代精心打造的一款高速闪存芯片&#xff0c;可广泛适用于高端旗舰智能手机、平板电脑、AR/VR等智能终端领域&#xff0c;以满…

零信任策略下云上安全信息与事件管理实践

简介&#xff1a;随着企业数字化转型的深入推进&#xff0c;网络安全越来越被企业所重视。为了构建完备的安全防御体系&#xff0c;企业通常会引入了防火墙(Firewall)、防病毒系统(Anti-Virus System&#xff0c;AVS)、入侵防御系统(Intrusion Prevention System&#xff0c;IP…

kl散度度量分布_数据挖掘比赛技巧——确定数据同分布

在数据挖掘比赛中&#xff0c;很重要的一个技巧就是要确定训练集与测试集特征是否同分布&#xff0c;这也是机器学习的一个很重要的假设[1]。但很多时候我们知道这个道理&#xff0c;却很难有方法来保证数据同分布&#xff0c;这篇文章就分享一下我所了解的同分布检验方法。封面…

Inclavare Containers:云原生机密计算的未来

简介&#xff1a;本文为你详细的梳理一次 Inclavare Containers 项目的发展脉络&#xff0c;解读它的核心思想和创新技术。 作为业界首个面向机密计算场景的开源容器运行时&#xff0c;Inclavare Containers 项目于 2020 年 5 月开源&#xff0c;短短一年多时间内发展势头非常迅…

没有操作系统程序可以运行起来吗?

作者 | 陆小风来源 | 码农的荒岛求生现在的程序员对操作系统已经习以为常了&#xff0c;但是你有没有想过&#xff0c;如果没有操作系统的话我们可以让程序运行起来吗&#xff1f;先说答案&#xff0c;当然是可以的&#xff0c;而且必须是可以的。你可以从这个角度来思考&#…

sysAK(青囊)系统运维工具集:如何实现高效自动化运维?| 龙蜥技术

简介&#xff1a;What is sysAK、典型工具介绍、开源 3 方面介绍了 sysAK 系统&#xff0c;目前 sysAK 工具集已经在龙蜥社区开源&#xff0c;并且在系统运维 SIG、跟踪诊断 SIG 一起共建&#xff0c;希望大家后期加入 SIG 一起讨论共建。 编者按&#xff1a;本文整理自「云栖…

quill鼠标悬浮 出现提示_CHERRY MC8.1鼠标评测:超前设计延续军火箱信仰

CHERRY作为机械键盘品牌拥有非常高的知名度&#xff0c;许多朋友的第一把机械键盘就是CHERRY品牌。在CHERRY产品线中&#xff0c;最具信仰的一定是军火箱MX8.0键盘。键盘本身手感颜值俱佳&#xff0c;独特的军火箱包装更是收获了大批粉丝。至于最配这把键盘的鼠标却一直让网友们…

高并发IO的底层原理

作者 | 阿辉来源 | Andy阿辉思考&#xff1a;作为程序员的我们&#xff0c;在编写软件进行文件读取&#xff0c;网络收发数据时&#xff0c;是不关心其具体的内部数据传输的。只关心把数据传输到缓冲区或及时从缓冲区读取数据。那么内部究竟是如何实现的呢&#xff0c;今天这篇…

新能源汽车太猛了,这些卡脖子技术你了解吗?

简介&#xff1a;从汽车行业的变化&#xff0c;我们即可初步看出芯片的重要性&#xff0c;那么&#xff0c;芯片对汽车行业的发展具体有哪些重要影响呢&#xff1f; 根据全球汽车咨询机构Auto Forecast Solutions统计的数据&#xff0c;截至10月10日&#xff0c;由于芯片短缺&…

龙蜥社区成立系统运维SIG,开源sysAK系统运维工具集

简介&#xff1a;系统运维SIG致力于打造一个集主机管理、配置部署、监控报警、异常诊断、安全审计等一系列功能的自动化运维平台。 OpenAnolis 龙蜥社区&#xff08;以下简称“龙蜥社区”&#xff09;正式成立系统运维&#xff08;System Operation&Maintenance, sysOM&…

奔跑吧兄弟变成机器人是哪一期_奔跑吧预告,郑恺郭麒麟回归,而我却被女嘉宾的颜值吸引了...

哈喽小伙伴们&#xff0c;近期大家都看了《奔跑吧黄河篇》吗&#xff1f;现在已经播到第二期了&#xff0c;相信大家依旧是对跑男系列节目非常感兴趣的&#xff0c;播放量非常高&#xff0c;稳稳占据TX和AQY两大视频平台的综艺播放第一名的位置&#xff0c;可见网友们真的是非常…

院士专家热议如何拥抱“东数西算”,第二届中国IDC行业Discovery大会顺利召开

4月21日&#xff0c;一场别开生面的主题为“聚光奔赴”的数据中心行业大会圆满落下帷幕。由中国通信工业协会数据中心委员会指导&#xff0c;中国IDC圈与世纪互联共同主办的“2022年第二届中国IDC行业Discovery大会”在线上召开&#xff0c;会议聚焦国家“双碳”目标、“东数西…

一文理解 K8s 容器网络虚拟化

简介&#xff1a;本文需要读者熟悉 Ethernet&#xff08;以太网&#xff09;的基本原理和 Linux 系统的基本网络命令&#xff0c;以及 TCP/IP 协议族并了解传统的网络模型和协议包的流转原理。文中涉及到 Linux 内核的具体实现时&#xff0c;均以内核 v4.19.215 版本为准。 作者…

应对 Job 场景,Serverless 如何帮助企业便捷上云

简介&#xff1a;函数计算作为事件驱动的全托管计算服务&#xff0c;其执行模式天生就与这类 Job 场景非常契合&#xff0c;对上述痛点进行了全方面的支持&#xff0c;助力“任务”的无服务器上云。 作者&#xff1a;冯一博 任务&#xff08;Jobs&#xff09;&#xff0c;是互…

Gartner发布新兴技术研究:深入洞悉元宇宙

供稿 | Gartner 出品 | CSDN云计算 根据Gartner预测&#xff0c;2026年全球30%的企业机构将拥有元宇宙产品和服务。 元宇宙是一个由独立但相互连接的网络所组成的持久、沉浸式数字环境&#xff0c;但目前尚未确定这些网络将使用的通信协议。元宇宙能够实现持久、去中心化、可…

双11实时物流订单实践

简介&#xff1a;随着双11的开启&#xff0c;物流业也迎来了年度大考。2021年双11期间&#xff0c;递四方作为物流仓储服务方&#xff0c;布局仓库和分拣点超40个&#xff0c;50w平米作业场地&#xff0c;单日订单峰值达千万级别&#xff0c;海量购物订单由递四方配送到家&…

阿里云徐立:面向容器和 Serverless Computing 的存储创新

简介&#xff1a;以上为大家分享了阿里云容器存储的技术创新&#xff0c;包括 DADI 镜像加速技术&#xff0c;为容器规模化启动奠定了很好的基础&#xff0c;ESSD 云盘提供极致性能&#xff0c;CNFS 容器网络文件系统提供极致的用户体验。 作者&#xff1a;徐立 云原生的创新…

鸿蒙2.0beta报名,鸿蒙OS 2.0 Beta版系统在哪报名-报名方法介绍

鸿蒙OS系统一直以来深受大家的关注&#xff0c;最近全新推出了鸿蒙OS 2.0 Beta版&#xff0c;那么鸿蒙OS 2.0 Beta版在哪报名呢&#xff1f;小编为大家分享一下关于鸿蒙OS 2.0 Beta版的报名方法介绍&#xff0c;对鸿蒙OS 2.0 Beta版感兴趣的不要错过了。鸿蒙OS 2.0 Beta版系统报…

不改一行代码,轻松拥有企业级微服务治理|MSE微服务治理专业版发布

简介&#xff1a;随着业务的发展&#xff0c;微服务拆分越来越复杂&#xff0c;微服务的治理也成了一个比较令人头疼的问题。有没有更加简单且高效的方法来解决微服务治理的难题&#xff1f; 作者&#xff1a;十眠 随着业务的发展&#xff0c;微服务拆分越来越复杂&#xff0…