JusticeFighterDance / JusticeFighter110

田柯宇 (Tian Keyu)恶意攻击集群事件的证据揭露
650 stars 42 forks source link

【纯粹好奇】“修改pytorch"源代码,难道是整个组共用一个环境然后自己去改的代码? #1

Closed CiaoHe closed 1 month ago

CiaoHe commented 1 month ago

不得不说给给位做实验的上了一课

login256 commented 1 month ago

同问,难道是内部有什么pypi源或者没有用conda?

adolli commented 1 month ago

我猜是注入的吧,肯定不能重新编译pytorch,那个编译一次一小时多,并且容器里也不会重新安装pytorch。pytorch的checkpoint load是pickle反序列化,要注入代码就在checkpoint 的任意一个文件加进去就行了

tanjuntao commented 1 month ago

我比较好奇的是,不同人不应该是使用不同的服务器账号吗,怎么能访问到别人的 python 环境,修改别人安装的包,还有修改别人的模型权重,不应该没有权限吗(如果设置不同账号工作目录不能访问的话)?

crj1998 commented 1 month ago

我比较好奇的是,不同人不应该是使用不同的服务器账号吗,怎么能访问到别人的 python 环境,修改别人安装的包,还有修改别人的模型权重,不应该没有权限吗(如果设置不同账号工作目录不能访问的话)?

参考pickle包的官方文档。 Warning The pickle module is not secure. Only unpickle data you trust. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling. Never unpickle data that could have come from an untrusted source, or that could have been tampered with. 连yaml都有safe_load的,pickle这种二进制更是会包含攻击性代码。而且修改pytorch源码不一定要编译,只有c部分的需要编译,python部分直接源码修改就行。

curehabit commented 1 month ago

我比较好奇的是,不同人不应该是使用不同的服务器账号吗,怎么能访问到别人的 python 环境,修改别人安装的包,还有修改别人的模型权重,不应该没有权限吗(如果设置不同账号工作目录不能访问的话)?

参考pickle包的官方文档。 Warning The pickle module is not secure. Only unpickle data you trust. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling. Never unpickle data that could have come from an untrusted source, or that could have been tampered with. 连yaml都有safe_load的,pickle这种二进制更是会包含攻击性代码。而且修改pytorch源码不一定要编译,只有c部分的需要编译,python部分直接源码修改就行。

safetensors可以避免吧?

jinzhuer commented 1 month ago

应该是通过ckpt注入代码,在运行的过程中新代码把原有的pytorch里的函数覆盖掉?这样查不到任何代码文件被修改过。只能看到ckpt被修改,但是没人想到ckpt被注入了代码...

cutecutecat commented 1 month ago

你的怀疑有道理,即使是基于ckpt的注入攻击,很明显他们整个组的工作模式中,存在大量的权限混乱和模型共用,要么:

这两件事不管是哪种情况,都是有一个赛一个的离谱。

除此之外,他还修改了一个公用的 HuggingFace 的ckpts目录,只要别人用这里的pretrain模型,就会直接gf(go fail),相当于直接挂了。不过也有网友说到,他可能修改了自己的pretrained model,而这个model parameters是用ckpt文件保存的,其他人在训练的时候会load他的模型参数(也就是注入恶意代码的ckpt文件),所以会导致训练一直出问题也不容易发现。

jinzhuer commented 1 month ago

你的怀疑有道理,即使是基于ckpt的注入攻击,很明显他们整个组的工作模式中,存在大量的权限混乱和模型共用,要么:

  • 无授权:全组30个人共用同一个base model文件,而且大伙都能任意读写
  • 有授权:全组30个人都在用实习生预训练的base model做微调

字节的实习生当正式工用,至少在权限方面,实习生和正式工没啥区别。

可能确实是没有权限管理,因为模型训练这块比较特殊,它不直接参与上线,上线的模型和代码肯定是稳定的。它类似于开发中的调试代码过程,你在本地测试好了再合并到主分支然后上线。在你没训练出最终模型之前,属于你自己的调试过程,由自己负责,所以基本没什么版本控制和权限管理,毕竟你的模型出问题想让别人给你看看怎么回事,大多人为了方便会直接把所有权限打开。

只不过训练模型这个“调试过程”太费时间和算力了,确实应该像上线代码一样更规范一些。当然,也可能字节卡多不在乎。

Tangent-90C commented 1 month ago

应该是通过ckpt注入代码,在运行的过程中新代码把原有的pytorch里的函数覆盖掉?这样查不到任何代码文件被修改过。只能看到ckpt被修改,但是没人想到ckpt被注入了代码...

应该是通过ckpt加载pickle格式的模型,而这个pickle保存的模型是可以写入恶意代码的

jinzhuer commented 1 month ago

应该是通过ckpt注入代码,在运行的过程中新代码把原有的pytorch里的函数覆盖掉?这样查不到任何代码文件被修改过。只能看到ckpt被修改,但是没人想到ckpt被注入了代码...

应该是通过ckpt加载pickle格式的模型,而这个pickle保存的模型是可以写入恶意代码的

是的,huggingface加载.ckpt的load_checkpoint底层就是pickle。录音中说一开始注入代码只是为了debug,后来升级成了攻击代码。我很好奇一开始它的应用场景是什么,load checkpoint这个过程不是在训练模型最开始吗?那为什么不直接写在代码文件里,而要把代码放进ckpt来进行debug?

Tangent-90C commented 1 month ago

应该是通过ckpt注入代码,在运行的过程中新代码把原有的pytorch里的函数覆盖掉?这样查不到任何代码文件被修改过。只能看到ckpt被修改,但是没人想到ckpt被注入了代码...

应该是通过ckpt加载pickle格式的模型,而这个pickle保存的模型是可以写入恶意代码的

是的,huggingface加载.ckpt的load_checkpoint底层就是pickle。录音中说一开始注入代码只是为了debug,后来升级成了攻击代码。我很好奇一开始它的应用场景是什么,load checkpoint这个过程不是在训练模型最开始吗?那为什么不直接写在代码文件里,而要把代码放进ckpt来进行debug?

估计是编的理由,哪怕字节没有严格的权限管理策略,也有代码审查的,想夹带私活还是得靠这些漏洞。

conn4575 commented 1 month ago

世界就是一群草台班子组成,这种不上生产环境的实验性项目,没有严格的权限管理也算正常吧