几周前,我制作了一个概念验证应用程序,展示了 LastPass 在 Chrome 中填写凭据的方法是如何不安全的。对于那些感兴趣的源是在https://github.com/activems/clipcaster
本质上,他们将一段 javascript 复制到剪贴板并让用户执行它。这包括用户名和密码。在以前的版本中,它已明确填写为:
if (l_bte) {
l_sfv(l_bte, decodeURIComponent(escape(atob('dXNlckBleGFtcGxlLmNvbQ=='))));
}
l_sfv(l_bpe, decodeURIComponent(escape(atob('cDRzc3cwcmQ='))));
'dXNlckBleGFtcGxlLmNvbQ=='是'user@example.com'的Base64,'cDRzc3cwcmQ='是'p4ssw0rd'
LastPass 最近更新了他们使用的 JavaScript。现在是(完整版在https://raw.githubusercontent.com/activems/clipcaster/master/lastpass_output_v2.js):
var l_x = function(t, l, m) {
var o = [];
var b = '';
var p = document.location.href.replace(/https?:\/\//, '').substring(0, l);
p = l_s('' + l_f(m) + p);
for (z = 1; z <= 255; z++) {
o[String.fromCharCode(z)] = z;
}
for (j = z = 0; z < t.length; z++) {
b += String.fromCharCode(o[t.substr(z, 1)] ^ o[p.substr(j, 1)]);
j = (j < p.length) ? j + 1 : 0;
}
return decodeURIComponent(escape(b));
};
....
var l_f=function(m){
var t=new Date().getTime() /
1000 | 0;
while (t % 10 != m) {
--t;
}
return t;
};
....
if (l_bte) {
l_sfv(l_bte, l_x(atob('W01cCVUlA1AVCkIDAk8AC1g='), 61, 0));
}
l_sfv(l_bpe, l_x(atob('QldeA0BREUAWDEMC'), 61, 0));
除了混淆之外,是否还有其他务实的理由来编写这样的 JavaScript?