2714491883MP
本帖最后由 2714491883MP 于 2018-9-14 13:20 编辑

原贴:https://ungeek.eu/minecraft-18-file-access/

2014年9月2日,MOJANG发布了1.8版本
并且介绍了在加载世界时使用的内置资源包,包括自定义图像和声音。
这其中包括两个数据包:资源包发送和资源包状态。



在MC的源代码中是这样的:
  1. public void handle(S48PacketResourcePackSend packet) {
  2.   String url = packet.getUrl();
  3.   String hash = packet.getHash();
  4.   
  5.   if (url.startsWith("level://")) {
  6.     String urlWithoutPrefix = url.substring("level://".length());
  7.     File savesDirectory = new File(gameController.mcDataDir, "saves");
  8.     File resourceFile = new File(savesDirectory, urlWithoutPrefix);
  9.    
  10.     if (resourceFile.isFile()) {
  11.             netManager.sendPacket(new C19PacketResourcePackStatus(hash, Action.ACCEPTED));
  12.         // snip, loading the resource.
  13.     } else {
  14.             this.netManager.sendPacket(new C19PacketResourcePackStatus(hash, Action.FAILED_DOWNLOAD));
  15.     }
  16.   } else {
  17.     // snip, handling URLs.
  18.   }
  19. }
复制代码
很明显,服务器只需要发送一个以level://这个URL开头的资源包数据包,游戏将会尝试从“saves”也就是存档目录加载文件,如果文件存在,则发送状态为ACCEPTED的数据包。 如果不是,则发送数据包FAILED_DOWNLOAD。

如果使用"../"可以遍历整个计算机,从而使整个计算机的文件数据处于可泄露的状态之中。 服务器可以检查是否存在甚至是打开计算机上文件,检举计算机用户名......并且可能更糟。 关于更多,请参阅PHP的file_exists和phar文件问题

从玩家的角度来看,这种攻击是不可见的,并且可以在游玩服务器上随时触发。通过批量发送数据包可以加速此漏洞利用。而且客户端甚至是可以将一个文件的HASH值发送给服务端,并且可以只是被检查的路径本身。

如果你的Log文件中出现这样的文字,则代表你的服务器正在尝试利用这个BUG
  1. [0913/140810:INFO:GameCallbacks.cpp(199)] game/bns (Client thread) warn Unable to parse metadata section of resourcepack: servers.dat java.util.zip.ZipException: error in opening zip file.
复制代码
值得一提的是这个漏洞本身在某些服务器上用于检查玩家电脑内是否有作弊Mod,但是这漏洞本身是一个极大的错误


在2016年2月发布的1.9中,已经不再存在这种问题,如果你因为某种原因不得不使用1.8,又不希望自己的数据泄露,可以去看看这个GitHub项目:https://github.com/Sk1er/Resource-Exploit-Fix 它解决了这个问题

2714491883MP
第一次新闻帖 如果错区希望版主能告知,因为我实在是不知道这种东西应该放在哪 1.8已经是旧版本但是很多玩家仍旧停留在1.8

nycnyc
哇,这么多年过去了才知道有这个bug...

雨中的寂寞
发布的好晚

MuChenyu
这么可怕的吗

下一页 最后一页