QML应用程序和安全性 - 有没有?

时间:2016-01-30 00:50:57

标签: qt security qml qtquick2

我刚刚发现了一个令人震惊的发现 - 在部署QML应用程序时,项目中使用的所有“库存”QML组件都被部署为裸QML文件,在文件系统中直接可见,它们甚至没有隐藏在应用程序qrc中二进制作为用户QML文件。意味着任何人都可以打开那些人类可读的文件,并编写他需要执行的任何代码。此外,可以对QObject派生类型进行大量内省,甚至可以从QML中进行内省,您可以向下爬行对象树,分析应用程序结构,迭代对象的方法和属性。充满恶意hackery的空间​​。你甚至不需要挖掘一些低级别的被忽视的漏洞利用 - 它只是在那里进行。

是否有任何安全功能可以防止这种情况发生?是否可以检查已部署的QML源代码进行修改,即使与校验和一样基本?如果没有,是否有任何手动实施安全的策略?似乎部署过程几乎已经设置,就是这样,并且没有定制空间?

另请注意,根据我对this question的调查,似乎有可能覆盖QML文件的解析方式,但即使采用这种方式,也会如何与现有的部署方案叠加? ?是否有一种“漂亮”的方式来定制部署过程,特别是考虑到它在不同目标平台之间的差异很大。

关于保护我的代码免受抄袭的问题 ,问题是如何保护 Qt的代码篡改

由于许多人似乎对理解手头的问题有疑问,所以让我把它放在一个比喻的形式中,希望这个比喻更容易理解。可以挑选所有锁,但这并不意味着如果您的门没有任何锁,这不是问题。对于无法锁定的门而言,安全问题并不是没有根据的,因为锁是不可靠的。

是的,所有应用程序都可以被黑客攻击,但它是否会在世界上产生重大影响,这是否需要对二进制文件进行逆向工程,找到一个被忽视的低级别漏洞以及将其用于恶意攻击的方法,或者它是微不足道的打开一个文本文件,然后写下你想要发生的事情。

这不是典型的,内在的和不可避免的漏洞的情况,这是由开发人员尽可能地尽量减少,这是Qt的部署策略中设计存在的巨大的,漏洞的情况。用于QML应用程序。解决这个不仅是开发人员的责任,而且Qt的许可方案可能会阻碍开发人员完成任务。当框架级别存在不安全因素并且不允许您解决此问题时,实施安全性有点困难。

出于某种原因,人们似乎错过了这种内在缺乏安全性的逆向工程方面。在黑客开始瞄准用户之前,他必须开发黑客。这是不安全感最明显的地方。毫无疑问,黑客将拥有对自己机器的管理员/ root权限,因此任何保护QML源免于编写的方案都不会起作用。让QML引擎毫不犹豫地解释文本文件使得破解应用程序变得更加容易,比利用可执行二进制文件更容易。从那时起,还有其他路由来破坏用户的系统(并且所有广泛使用的系统都是易受攻击的),但至少从个人应用程序开发人员的角度来看,单独的受损系统不会损害用户的数据在我的应用程序中,因为它存储在文件系统上受保护,但它在应用程序中公开。让QML引擎如此不安全且幼稚地将任何代码注入到应用程序中 - 这是最重要的问题。在用户系统上破坏QML文件的容易程度是次要的,也是次要问题。 最大的问题是QML如何轻松地进行黑客的初步开发。

最后,某些人的偏见,其工作围绕Qt是可以理解的,他们的“专业职责”是淡化缺陷,这可能妨碍其采用,因此妨碍他们的业务,即使专业,也是非常不道德的用户的安全和隐私受到威胁。投入努力来破坏风险并不是提高产品声誉的最佳方式,这些风险不会因为你否认它们而消失,但如果你改进了产品,它们就会消失。承认风险并承诺修复它们肯定会比成为头条新闻的潜在高调数据泄漏更加尴尬。

2 个答案:

答案 0 :(得分:3)

With Qt 5.7,Qt的静态构建(使用-static配置Qt)将导致属于Qt模块的QML文件通过资源系统构建到插件中。例如,考虑Qt Graphical Effects模块中的relevant change。以下是更改前qtbase/qml/QtGraphicalEffects的目录列表:

Blend.qml
BrightnessContrast.qml
Colorize.qml
ColorOverlay.qml
ConicalGradient.qml
Desaturate.qml
DirectionalBlur.qml
Displace.qml
DropShadow.qml
FastBlur.qml
GammaAdjust.qml
GaussianBlur.qml
Glow.qml
HueSaturation.qml
InnerShadow.qml
LevelAdjust.qml
LinearGradient.qml
MaskedBlur.qml
OpacityMask.qml
private
qmldir
RadialBlur.qml
RadialGradient.qml
RectangularGlow.qml
RecursiveBlur.qml
ThresholdMask.qml
ZoomBlur.qml

后:

private
qmldir
qtgraphicaleffectsplugin.lib
qtgraphicaleffectsplugin.prl
qtgraphicaleffectsplugind.prl

这是使访问Qt模块的QML文件变得更加困难的一种方法。

答案 1 :(得分:0)

使用Qt资源系统管理资源文件

Qt资源系统允许将资源文件作为二进制文件存储在应用程序可执行文件中。这在构建混合QML / C ++应用程序时非常有用,因为它可以通过资源系统URI方案而不是文件系统资源的相对或绝对路径来引用QML文件(以及其他资源,如图像和声音文件)。但请注意,如果您使用资源系统,则只要更改QML源文件,就必须重新编译应用程序可执行文件,以便更新程序包中的资源。

在混合QML / C ++应用程序中使用资源系统:

创建一个.qrc资源集合文件,列出XML格式的资源文件从C ++开始,使用:/前缀将主QML文件作为资源加载,或者使用qrc方案作为URL加载

完成此操作后,将从资源系统加载由QML中的相对路径指定的所有文件。使用资源系统对QML层完全透明;这意味着所有QML代码都应该使用相对路径引用资源文件,不应该使用qrc方案。此方案应仅用于引用资源文件的C ++代码。

来源:http://doc.qt.io/qt-5/qtquick-deployment.html