Как я могу запретить WIX CAQuietExec регистрировать командную строку?

Чтобы предотвратить появление командных окон во время установки, я использую встроенное пользовательское действие 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" / пароль INCLEARTEXT

Т.е. пароль отображается открытым текстом и не скрыт.

Как я могу запретить CAQuietExec регистрировать пароль в виде открытого текста?

5 ответов

Решение

В src\ca\wcautil\qtexec.cpp есть эта строка в функции QuietExec:

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

который регистрирует командную строку в подробном режиме. Там нет условного, чтобы остановить его от регистрации.

Взял несколько гуглов и попытался найти решение, чтобы создать свойство и назначить 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 ....

CustomAction тег имеет HideTarget атрибут, который должен удерживать данные пользовательских действий от записи в журнал.

Есть много способов атаковать ваш пароль. Я мог бы посмотреть на MSI в ORCA. Я мог бы запустить путь WMIC win32_process, пока он работает, и увидеть аргументы командной строки. Сокрытие этого от журнала будет иметь небольшую ценность.

Я бы посоветовал зашифровать пароль, который хранится в MSI, и ваш exe-файл может его расшифровать. В зависимости от того, для чего используется этот пароль, вы можете захотеть принять и другие меры, например, заставить EXE создать случайный пароль во время выполнения и зашифровать / сохранить его где-нибудь на случай, если какой-то другой процесс сможет получить к нему доступ.

Если пароль поступает из пользовательского ввода в последовательности пользовательского интерфейса, вы можете выполнить пользовательское действие, которое шифрует данные как второе свойство, а затем передает его в EXE-файл. Или вы можете просто преобразовать исходный код C++ в QuietExec и изменить его так, чтобы он не записывался в файл журнала.

Взгляните на статью " Предотвращение записи конфиденциальной информации в статью журнала", особенно пункт № 3. В основном это говорит о том, что если свойство скрыто, но для политики отладки задано специальное значение, командные строки все равно будут выгружаться в файл журнала в виде открытого текста. Убедитесь, что это может быть причиной, по которой вы испытываете упомянутое поведение.

И я не верю, что это может быть ошибкой в ​​QuietExec CA:)

Другие вопросы по тегам