【技术分享】CVE-2020-6828:Firefox for Android任意文件覆盖漏洞分析

【技术分享】CVE-2020-6828:Firefox for Android任意文件覆盖漏洞分析

原创 fatal0 安全客 2022-08-15 10:00

2020年4月,Mozilla
安全公告
披露并修复了我在Firefox 68.5提交的一个漏洞,漏洞编号为CVE-2020-6828。攻击者可利用该漏洞覆盖Firefox私有目录中的文件,从而控制浏览器的任意配置项,如配置代理服务器,关闭同源策略等,造成等同与任意代码执行的危害。

漏洞原理

Firefox允许外部APP调用它打开Content URI。

如果传入的URI是Content URI,会调用org.mozilla.gecko.util.FileUtils.resolveContentUri。

resolveContentUri会将Content URI转成File URI。

重点看getTempFilePathFromContentUri,它调用了getFileNameFromContentUri来从ContentProvider中获取文件名,并将其和Cache目录拼接创建了一个文件,最后调用copy从ContentProvider中读取数据写入到该文件中。

再来看getFileNameFromContentUri,它直接从ContentProvider获取_display_name作为文件名返回,没有进行任何处理。

当恶意的ContentProvider返回的_display_name为../evil时,即可跳出Cache目录,导致任意文件覆盖。

如何利用

在Firefox的私有目录中有一个文件/data/data/org.mozilla.firefox/files/mozilla/profiles.ini,其中PATH为随机生成的用户目录。

在用户目录发现了一个文件prefs.js,内容如下:

从文件的内容得知,可以在用户目录中写入一个user.js文件来修改浏览器的配置项。

创建一个恶意的ContentProvider并实现query和openFile方法。

然后调用Firefox打开Content URI。

第一步,先覆盖/data/data/org.mozilla.firefox/files/mozilla/profiles.ini文件,将用户目录PATH修改为/data/data/org.mozilla.firefox/files/mozilla/。

第二步,在/data/data/org.mozilla.firefox/files/mozilla/目录写入一个user.js文件,即可控制浏览器的任意配置项(具体配置可参见about:config),如写入以下内容就可以关闭File下的同源策略。

漏洞修复

Firefox 68.7在FileUtils新增了sanitizeFilename方法,通过File.getName来对文件名进行清洗,解决了目录遍历的问题。

时间线
– 2020-02-25 – 漏洞提交

  • 2020-03-02 – 漏洞确认

  • 2020-03-16 – 漏洞修复&赏金发放

  • 2020-04-07 – 发布安全公告和漏洞编号