【问题标题】:How do I prevent WIX CAQuietExec from logging the command line?如何防止 WIX CAQuietExec 记录命令行?
【发布时间】:2011-01-12 14:37:40
【问题描述】:

为了防止在安装过程中弹出命令窗口,我使用了 WIX 内置的自定义操作 CAQuietExec。

首先我定义命令行:

<CustomAction Id="A01" 
       Property="QtExecCmdLine" Value="&quot;MyExe.exe&quot; /password [PASSWORD]" />

注意:PASSWORD 属性定义为隐藏。这可以防止 Windows 安装程序将属性值写入日志。

然后我调用嵌入式 WIX 扩展:

<CustomAction Id="A02" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="ignore" />

这很好用。

但是,当我转到临时文件夹并打开 MSI 日志时,我看到以下条目:

CAQuietExec: "C:\Program Files\MyExe.exe" /password INCLEARTEXT

即密码以明文显示,不隐藏。

如何防止 CAQuietExec 以明文形式记录密码?

【问题讨论】:

    标签: installation wix windows-installer


    【解决方案1】:

    在 src\ca\wcautil\qtexec.cpp 是 QuietExec 函数中的这一行:

    WcaLog(LOGMSG_VERBOSE, "%ls", wzCommand);
    

    以详细模式记录命令行。没有条件阻止它记录。

    【讨论】:

      【解决方案2】:

      用几个谷歌搜索并尝试解决方案是创建属性并在将值分配给属性之前分配 Hidden="yes"。在上面的代码中,您应该在分配值之前创建一个新属性 QtExecCmdLine。

       <Property Id="QtExecCmdLine" Hidden="yes"></Property>
      

      然后

       <CustomAction Id="A01" Property="QtExecCmdLine" Value="&quot;MyExe.exe&quot; /password [PASSWORD]" />
      

      然后

       <CustomAction Id="A02" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return ....
      

      【讨论】:

        【解决方案3】:

        CustomAction 标记有一个HideTarget 属性,可以防止将自定义操作数据写入日志。

        【讨论】:

        • 谢谢,但我已经尝试过了——将它添加到所有可能的自定义操作中——但它不起作用。问题是 CAQuietExec 中的代码不遵守此属性或隐藏属性。
        【解决方案4】:

        有很多方法可以攻击您的密码。我可以看看 ORCA 中的 MSI。我可以在 WMIC 路径 win32_process 运行时运行它并查看命令行参数。从日志中隐藏它没有什么价值。

        我建议加密存储在 MSI 中的密码,并让您的 exe 能够解密它。根据此密码的用途,您可能还需要采取其他措施,例如让 EXE 在运行时生成一个随机密码并将其加密/保存在某处,以防其他进程需要能够访问它。

        如果密码来自 UI 序列中的用户输入,您可以使用自定义操作将数据加密为第二个属性,然后将其传递给 EXE。或者您可以将 C++ 源代码 fork 到 QuietExec 并将其修改为不写入日志文件。

        【讨论】:

        • 不,我没有将密码存储在 MSI 中——那太愚蠢了。将其隐藏在日志中实际上具有很大的价值,因为密码是由 IT 专业人员输入的,然后他们会将 MSI 日志邮寄给开发人员(他们不知道密码)。我不明白为什么当已经有一个隐藏属性(以及 HideTarget 属性)时,WIX 的用户必须进行额外的长度,例如加密,以防止记录敏感项目。这看起来像是 CAQuietExec 中的一个错误。
        • hide 属性是指 Windows Installer 的 msidbCustomActionTypeHideTarget 属性。它告诉 MSIEXEC 引擎是否记录 CustomActionData。一旦您实际上在延迟的自定义操作中,我不知道有任何机制可以意识到该标志。必须有另一个标志告诉 QuietExec CA 是否应该针对它在日志中捕获的内容做任何特别的事情。就像我说的,如果你 fork 源代码就可以完成,因为你提到了 WiX 中的错误......我相信 Rob 会很感激提交补丁。
        【解决方案5】:

        看看Preventing Confidential Information from Being Written into the Log File 的文章,尤其是第3 点。它基本上说,如果一个属性被隐藏,但调试策略设置为一个特殊的值,命令行仍然会以明文形式转储到日志文件中。验证这是否是您遇到上述行为的原因。

        而且我不认为这可能是 QuietExec CA 中的错误 :)

        【讨论】:

        • 感谢您的提示,但设置调试策略(这是通过注册表完成的)无效。我会继续前进,而不是在 QuietExec CA 中将此称为错误 - 以免冒犯任何人:)。
        • 我没有写 WiX,所以我没有被冒犯,我只是想准确了解这里发生的事情。让 QuietCA 支持过滤记录的内容当然是一项功能请求。您所能做的就是修补它并重建 WcaUtil 或加密您的财产并让您的 exe 解密它以在传输过程中保护它。您对如何解决您的问题还有其他想法吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多