现在假设有一个恶意网站 。让我们假设这个网站告诉TouchEn nxKey:“你好,用户现在在密码字段,我想要他们输入的数据 。”那个网站会得到所有的键盘输入吗?
是的,会的!它将获取用户键入的任何内容,无论当前哪个浏览器选项卡处于活动状态,或者浏览器本身是否处于活动状态 。nxKey应用程序只是遵从请求,此时不会检查它是否有意义 。事实上,它甚至会向网站提供在用户访问控制提示中输入的管理员密码 。
但肯定会有障碍 。首先,这样的网站需要一个有效的许可证 。在使用任何应用程序功能之前,它需要在get_versions调用中传递许可证:
文章插图
此特定的许可证仅对www.example.com有效 。所以只能在www.example.com网站上使用 。或者被任何声称是www.example.com的网站 。
看到上面代码中的origin属性了吗?是的,TouchEn nxKey实际上相信,而不是查看Origin HTTP标头 。因此,从一些合法使用nxKey的网站获取许可证并声称自己就是该网站是很简单的 。另一个障碍是:恶意网站接收到的数据不会被加密吗?如何解密呢?应该可以使用不同的公钥,即已知私钥的公钥 。那么人们只需要知道算法,然后解密数据就可以了 。
不过,这些都不是必要的 。如果TouchEn nxKey根本没有接收到任何公钥,它释放密钥,这样该网站将接收明文键盘输入 。
概念验证页面:
文章插图
还有第三个障碍,这大大降低了这个漏洞的严重程度,被恶意网页拦截的键盘输入不再到达目的地 。当用户开始输入密码时,肯定会感到可疑,但文本字段中却没有显示任何内容 。我对nxKey应用程序的分析表明,它只能这样工作:键盘输入要么到达网页,要么到达实际目标,但不能同时实现 。
攻击应用程序
如上所述,编写这个产品JavaScript代码的人并不精通它 。但也许是因为他们所有的专家都有c++背景?我们以前已经看到过这种情况,开发人员试图尽快放弃JavaScript,将所有任务委托给c++代码 。
遗憾的是,这还只是猜测 。与二进制代码相比,我更习惯于分析JavaScript,但应用程序本身似乎也同样充满了漏洞 。事实上,它主要使用C而不是c++的典型方法,其中有很多手动内存管理 。
上述已经提到过sprintf_s()的使用,关于像sprintf_s()或strcpy_s()这样的函数,有一个有趣的事实,虽然它们是sprintf()或strcpy()函数的“内存安全”版本,不会溢出缓冲区,但使用起来仍然很棘手 。如果没有给它们足够大的缓冲区,它们将调用无效的参数处理程序 。默认情况下,这会使应用程序崩溃 。
nxKey应用程序的缓冲区不够大,也不会改变默认行为 。因此,在许多情况下,发送过大的值会使应用程序崩溃 。崩溃总比缓冲区溢出好,但崩溃的应用程序无法再执行其任务 。这就会造成,用户的网上银行登录表单似乎正常工作,但它现在以明文形式接收你的密码 。用户只会在提交表单时注意到某些错误,从而导致错误消息,此漏洞允许拒绝服务攻击 。
另一个示例是,在所有的JSON解析器中,nxKey应用程序的开发人员选择了用c编写的解析器 。不仅如此,他们还从2014年1月起随机选择了一个存储库状态,并且从未更新过它 。空指针解引用在2014年6月修复,现在还在 。因此,向应用程序发送](一个方括号)而不是JSON数据足以使其崩溃,这是一个允许拒绝服务攻击的漏洞 。
上面提到的应用程序许可是base64编码的数据,应用程序需要对其进行解码 。解码器函数如下所示:
文章插图
我不确定这个函数来自何处,它与CycloneCRYPTO库的base64解码器有明显的相似之处 。但是CycloneCRYPTO将结果写入预先分配的缓冲区 。因此,缓冲区分配逻辑可能是由nxKey开发人员自己添加的 。
这种逻辑是有缺陷的,它明确地假设input_len是4的倍数 。但是对于像abcd==这样的输入,它的计算将导致分配2个字节的缓冲区,尽管实际输出是3个字节 。
推荐阅读
- 电脑键盘按键功能 scrolllock是什么意思
- 键盘记录器偷密码—苹果手机密码键盘可以看历史记录吗
- 联想键盘锁住了fn和什么键?键盘锁住了摁哪个键?
- 电脑键盘符号怎么打不出来~电脑上怎么打符号?
- 罗马数字怎么打出来搜狗—如何在键盘中输入罗马数字ⅰⅱⅲⅳⅴ?
- 鹿晗|鹿晗发文引争议,外网怒怼键盘侠,评论区沦陷
- 鹿晗|真爷们鹿晗引争议!60元衣服卖出1500高价,本人下场炮轰键盘侠
- 免费下载钢琴键盘 电脑键盘钢琴
- 5种快速输入√与×号的方法 键盘上的乘号
- 手机钢琴键盘模拟器 电脑钢琴软件哪个好
