none
Visual C++、「空白のアプリ」を作って、そのままコンパイルすると「この実装は Windows プラットフォーム FIPS 検証暗号化アルゴリズムの一部ではありません。」と出てXAMLのコンパイルに失敗する

    質問

  • Visual Stuido 2017 Enterpriseを使って新しいプロジェクトを、Visual C++のテンプレートから「空白のアプリ」を作成し、コンパイルすると、

    「WMC9999 この実装は Windows プラットフォーム FIPS 検証暗号化アルゴリズムの一部ではありません。」

    と表示されます。

    MainPage.g.hや、App.g.hといったファイルが生成されないため、その後のコンパイルできないようです。

    OSは、Windows 10 Enterprise 1607の64bitを使っています。

    2017年4月27日 7:22

すべての返信

  • 私もまったく同じ現象に陥っています。

    エラーメッセージは、

    1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\WindowsXaml\v15.0\8.2\Microsoft.Windows.UI.Xaml.Common.targets(266,5): Xaml Internal Error error WMC9999: この実装は Windows プラットフォーム FIPS 検証暗号化アルゴリズムの一部ではありません。

    の通りです。

    Windows10 Enterprise 1709

    Visual Studio 15.6.5です。

    FIPSポリシーをDisableにする方法が、海外のサイトで紹介されていますが、Windows 10 Enterpriseでは、レジストリエントリを操作しても、FIPSをDisableにできないため、正直対策が無い状況です。

    Windows 10 Enterprise環境では、C++/CXのUniversalアプリを開発するのはまだ時期尚早なのでしょうか・・・

    2018年4月9日 9:49
  • 私もまったく同じ現象に陥っています。

    「私も」と書かれていますが、ご自身の 1 年前の質問ですよね。

    FIPSポリシーをDisableにする方法が、海外のサイトで紹介されていますが、Windows 10 Enterpriseでは、レジストリエントリを操作しても、FIPSをDisableにできないため、正直対策が無い状況です。

    Enterprise だからというよりは、グループポリシーで有効化されていて、変えても戻るだけでは?
    組織として必須ではなければシステム管理者にお願いしてそのポリシーを外してもらえれば良いでしょう。

    無理そうなら、そのビルドプロセスで使われている exe に対して下記の config を書いてやるしかなさそうですね。
    https://docs.microsoft.com/ja-jp/dotnet/framework/configure-apps/file-schema/runtime/enforcefipspolicy-element

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe がそれに相当するようなので、そこにある MSBuild.exe.config をどこかにコピーし、バックアップを残した上で、runtime タグ内に <enforceFIPSPolicy enabled="false"/> を書いて保存し、元の場所に上書きコピーすることで回避できると思います。
    (手元では回避できることを実験済み。VS がいる間はバックグラウンドで MSBuild.exe が生きているので、VS の再起動が必要)

    2018年4月9日 14:32
    モデレータ
  • 回答ありがとうございます。

    疑問なのですが、XAMLのビルドにおいてFIPSのエラーが出ているため、なんらかビルドしたバイナリの妥当性を保証・検証する過程で、古い暗号など、(DES/MD5/SHA1)が利用されていることを意味していると思うのですが、非FPISの暗号を使用したバイナリは配布しても、FIPSのポリシーに違反しなければ、妥当性を検証できないことにならにのでしょうか?、

    そのため、やはりグループポリシーの変更は最後の手段と考えております。

    MSBuild.exe.configは、私の環境では書き換え自体が不可能でした。ファイルのアクセス許可に書き込みを設定できませんでした。所有権をTrustedInstallerから変更すればいいのかもしれませんが、悪影響はないのでしょうか?

    2018年4月10日 8:15
  • 疑問なのですが、XAMLのビルドにおいてFIPSのエラーが出ているため、なんらかビルドしたバイナリの妥当性を保証・検証する過程で、古い暗号など、(DES/MD5/SHA1)が利用されていることを意味していると思うのですが、非FPISの暗号を使用したバイナリは配布しても、FIPSのポリシーに違反しなければ、妥当性を検証できないことにならにのでしょうか?、

    質問されるよりはご自身で検証することが速いでしょう。
    私はそのあたり詳しくないので、どうしても知りたい場合は有償サポートで聞き出してみてください。
    (FIPS の制限は「絶対の仕組み」ではなく、「通り道によっては制限がかかる」というものという認識です)

    あなた方が FIPS をどのように解釈し、このような回避をすることの是非をどのように考えるかは、あなた方の判断によるので、なんとも言えません。

    MSBuild.exe.configは、私の環境では書き換え自体が不可能でした。ファイルのアクセス許可に書き込みを設定できませんでした。所有権をTrustedInstallerから変更すればいいのかもしれませんが、悪影響はないのでしょうか?

    そのまま開いて編集は UAC が有効な環境ではできませんよ。
    手順を読み直してください。

    2018年4月10日 14:15
    モデレータ
  • たびたびご回答ありがとうございます。

    今回のやり取りを振り返ると、不具合(不具合と考えない方もいるかもしれません・・・)を報告しようと、こちらのフォーラムにたどり着いたとしても、不具合と認識していただくことが難しいと感じております。(私の使い方が悪かったのでしょうか・・・)

    また、不具合を指摘するために有償サポートを使うのもなんとなく違うと考えております。

    そのうえで、今回の事象(エラーメッセージ)はバイナリのセキュリティに係る部分です。

    ご提示頂いた回避方法について、私自身で判断するため、検証しようにも、XAMLコンパイラのソースコードが開示されているわけでもないので不可能と考えております。

    不具合として、いずれ修正されるまでの回避策であるとの確信も得られないため、今回は、Universal化を断念します。いろいろありがとうございました。

    2018年4月11日 4:38
  • 不具合(不具合と考えない方もいるかもしれません・・・)を報告しようと、こちらのフォーラムにたどり着いたとしても、不具合と認識していただくことが難しいと感じております。(私の使い方が悪かったのでしょうか・・・)

    ここは「報告する場所」ではなく、「ユーザー同士で情報交換する場所」です。
    従って、現象に対する推察、回避策についてコメントした次第です。

    また、不具合か否かは主観によるものだと考えています。
    作者と利用者が合意した、明示的な仕様(ドキュメント)がない限り、利用者が不具合とみても、作者は仕様であるとか、設計によると評価することがあるものなので、仕様か不具合かをここで議論することは意味がないものと考えています。

    Microsoft の考えを明確に聞き出したい場合は、有償サポートに聞くしかないでしょう。

    また、不具合を指摘するために有償サポートを使うのもなんとなく違うと考えております。

    先にも書きましたが、ここは不具合の報告の場所ではありません。
    Microsoft のレスポンスを期待しなくても良い、不具合と思える報告については、ヘルプ - フィードバックの送信 - 問題の報告 からどうぞ。

    ビジネスインパクトがある、Microsoft の見解を聞きたいといった場合は有償サポートへどうぞ。

    ご提示頂いた回避方法について、私自身で判断するため、検証しようにも、XAMLコンパイラのソースコードが開示されているわけでもないので不可能と考えております。

    つまり、「内部情報がわからない場合、FIPS に沿うかどうか判断できないので使えない」というように厳しく評価すると判断されたということですか?
    そうであれば、修正されない限りは使えないと言うことですし、UWP を検討された動機がある以上は Developer Community に登録するなど、先を見据えた一手も取られてはいかがでしょうか。

    2018年4月11日 13:21
    モデレータ
  • そのうえで、今回の事象(エラーメッセージ)はバイナリのセキュリティに係る部分です。

    どうなんでしょう。エラーはあくまで暗号化アルゴリズムが使用できないことを指摘しているだけです。なぜそのようなエラーが起きるのかは問題個所を特定しないことにはわかりませんが、例えば歴史的にソースコードやバイナリの一致確認(変更検出)などにMD5やSHA-1が使われています。ソースコードの変更検出、そこに脆弱なアルゴリズムを使用することで誤検出が発生したとして、それがセキュリティに係る問題なのかどうか疑問です。

    例えばVisual C++ではドキュメントされていないコンパイルオプション /ZH:SHA_256 を指定することでこの動作を変更することもできます。今回はXamlとのことなのでこの方法では解決できませんが、ともあれ原因個所を調査するしかないかと。

    2018年4月11日 14:16
  • mscorlib.dll!System.Security.Cryptography.MD5CryptoServiceProvider.MD5CryptoServiceProvider()
    Microsoft.Windows.UI.Xaml.Build.Tasks.dll!Microsoft.Windows.UI.Xaml.Build.Tasks.Utilities.MD5CryptoHelper.Instance.get()
    Microsoft.Windows.UI.Xaml.Build.Tasks.dll!Microsoft.Xaml.XamlCompiler.CodeGenerators.BaseXamlCodeGen.LookupXamlFileFullPathAndMd5CheckSums()
    Microsoft.Windows.UI.Xaml.Build.Tasks.dll!Microsoft.Xaml.XamlCompiler.XamlCodeGenerator.GenerateCodeBehind(Microsoft.Xaml.XamlCompiler.XamlClassCodeInfo codeInfo, Microsoft.Xaml.XamlCompiler.XamlProjectInfo projectInfo, Microsoft.Xaml.XamlCompiler.XamlSchemaCodeInfo schemaInfo, out System.Collections.Generic.List<Microsoft.Xaml.XamlCompiler.FileNameAndChecksumPair> xamlFilesChecksumPairs)
    Microsoft.Windows.UI.Xaml.Build.Tasks.dll!Microsoft.Windows.UI.Xaml.Build.Tasks.CompileXamlInternal.GeneratePageOutputFiles(Microsoft.Xaml.XamlCompiler.XamlClassCodeInfo classCodeInfo)
    Microsoft.Windows.UI.Xaml.Build.Tasks.dll!Microsoft.Windows.UI.Xaml.Build.Tasks.CompileXamlInternal.DoExecute()
    Microsoft.Windows.UI.Xaml.Build.Tasks.dll!Microsoft.Windows.UI.Xaml.Build.Tasks.CompileXaml.Execute()

    例外発生時の呼び出し履歴はこんな具合なので、Microsoft.Windows.UI.Xaml.Build.Tasks.dll の実装が変わらない限りは、グループポリシーか config で回避するしかありませんね。

    2018年4月11日 15:22
    モデレータ
  • > LookupXamlFileFullPathAndMd5CheckSums()

    私が挙げた例がドンピシャで当たっていたんですね。

    > MD5CryptoServiceProvider.MD5CryptoServiceProvider()

    Microsoft.Windows.UI.Xaml.Build.Tasks.dllのソースコードに

    md5CryptoProvider = new MD5CryptoServiceProvider();

    と書かれていそうですね。これが

    md5CryptoProvider = MD5.Create();
    
    // or
    
    md5CryptoProvider = HashAlgorithm.Create("MD5");
    

    と書かれていたら、作成する暗号化アルゴリズムを別のものに差し替え可能だったのですが…と思ったらMD5にはManaged実装がないので差し替え先もありませんでした。SHA-1なら有ったのに残念。

    2018年4月11日 21:10
  • 実装を推測するところまで調査頂き恐縮です。

    本題とはずれますが、後学のため、本フォーラムの使い方について確認させてください。

    https://www.visualstudio.com/my/priority-forums-vse

    から,[Visual Studio の一般的な質問 ]を選び、こちらのフォーラムに来ました。

    上記のURLのページには、「Microsoft のエンジニアが 2 営業日以内に回答を返します。」とあるのですが、今回ご回答頂いたAzuleanさん、佐祐理さんの回答が、Microsoft のエンジニアからの回答に相当すると考えてよろしいのでしょうか?

    2018年4月12日 3:23
  • このスレッドでコメントしているメンバーは Microsoft とは関係しない、第三者です。

    なお、話題にあげられている件は以下のスレッドを確認してください。結論から言えば、そのサービスは英語の該当フォーラムのみです。

    https://social.msdn.microsoft.com/Forums/ja-JP/e4f8cce9-7414-41dc-a48f-82bcc82f613a/24314123902106936890124261239512300207782080812469125091254012?forum=suggestja

    2018年4月12日 3:33
    モデレータ