Windows Update後に発生するSHA256 ComputeHashの「-1073741816」エラー原因と対策

ある日、久しぶりにWindows Updateを済ませたあとに、自作のアプリケーションでハッシュ計算を行ったところ、突然謎のエラーが出て動作が止まってしまいました。調べてみると、同様のトラブルを抱える方が意外と多いようです。ここでは、このエラーの発生メカニズムや回避策をできるだけわかりやすくご紹介します。

エラーの概要

エラーコード-1073741816が示すもの

Windows環境のアプリケーションでSHA256のComputeHashを呼び出した際に、-1073741816という数値を含む暗号化エラーが発生することがあります。エラーメッセージは「Unknown error ‘-1073741816’」などと表示されるケースが多く、アプリケーションの継続利用が困難になるほどの深刻な問題として認識されています。実はこの-1073741816という値は、NTSTATUSで表されるSTATUS_INVALID_HANDLEに相当するといわれており、内部的にハンドル関連の処理が破綻している可能性が考えられます。

Windows Update後に顕在化する背景

従来の環境では、同様のハンドル問題があっても、暗号化ライブラリが比較的緩やかに動作していたためか、表に出ないことが多かったと推察されます。しかし、最近のWindows Updateでセキュリティ関連のモジュールや暗号化ライブラリの厳格化が進んだ結果、これまで偶然動いていた部分が明るみに出たと言われています。

具体的な原因

スレッドセーフでないSHA256インスタンスの使い回し

SHA256ManagedやSHA256Cngなどのクラスは、ドキュメント上では完全にスレッドセーフとされていないことがあります。特に同じインスタンスを複数のスレッドが同時に操作すると、内部で保持しているハンドルやメモリ領域が競合状態に陥る場合があります。Windows Updateの影響で、この競合が厳格に検知されるようになったと考えられます。

TransformFinalBlockを複数回呼び出す実装

ハッシュ計算を部分的に行う場合、TransformFinalBlockを連続して呼び出すことができます。しかし、この呼び出し順序が不適切だったり、再利用の仕方によってはハンドルの整合性が崩れ、エラーが発生するケースも報告されています。特にマルチスレッドで使い回しをしている場合、このパターンが再現しやすいようです。

特定のWindows Updateによる動作の厳格化

報告例として、KB5037771やKB5035432、KB5037591、KB5039895などのUpdateを適用した環境で、このエラーが顕著に発生するようになったとの声があります。これらのUpdateは暗号化ライブラリ周りの修正やセキュリティ強化が含まれており、暗号化処理が予期しない形で動作しているシステムでは、エラーが頻出する状況が生まれたと推測されます。

解決策と対策

推奨される解決策

マルチスレッドでインスタンスを共有しない

SHA256関連クラスは同一インスタンスを複数スレッドから同時に使用しないことが基本とされています。スレッドごとに新しいSHA256インスタンスを生成し、別々にハッシュ計算を行うことで、ハンドル競合のリスクは大きく低減できます。

排他制御(lockなど)を導入する

どうしても同じインスタンスを共有したい場合は、C#のlock構文や他の排他機能を用いて、同一タイミングで複数スレッドがアクセスしないように制御します。処理速度との兼ね合いもあるため、状況に応じてスレッドプールを調整したり、並列度を制限する必要がある場合があります。

スレッドごとに別インスタンスを生成し、しっかり排他制御することで、思わぬ暗号エラーを防ぎやすくなるのは使い勝手の良いところです。

暫定的な回避策

該当Updateのアンインストール

どうしても今すぐ業務に支障が出る場合、該当するWindows Updateを一時的にアンインストールすると問題が解決する場合があります。ただし、セキュリティ更新のアンインストールはリスクが伴うため、あくまで緊急避難策と考えた方がよいでしょう。

セキュリティアップデートを外すと、新たな脆弱性にさらされる危険があるため、一時しのぎでしかありません。

クロールや並列実行の制限

SharePointのクロール処理や、Windows Admin Centerで並列接続を行う場面では、同時実行数を制限することでエラー発生を抑えられることがあります。アプリケーションの並列動作設定をカスタマイズできる場合は試してみる価値があります。

具体的事例

Siemens TIA Portalでのエラー

Siemens製のTIA Portalでは、プログラムのダウンロードやビルド時に暗号化ライブラリを使用しており、複数のスレッドで同時にハッシュ計算を呼び出すような状況が発生しているとの報告があります。Windows Update後に同エラーが頻出してしまい、作業が進まないというユーザーも多いようです。

SharePointクロールの停止

SharePointのクロール機能は、同時に多数のファイルを取得・検証するため、暗号化ライブラリの呼び出しが高頻度で行われます。クロール インパクト ルールなどを利用して並列数を低めに設定することで、症状が軽減される例が報告されています。

Windows Admin Centerでのホスト接続不具合

Windows Admin Centerでホストに接続しようとした際に、同様の暗号化エラーが発生する場合があります。原因としては、内部でPowerShellや.NETを用いて複数タスクを同時実行しているため、暗号化ライブラリの再利用が衝突を引き起こすのではないかと推定されています。

テーブルで見る主なポイント

関連ソフトウェア 典型的なエラーシナリオ 考えられる対策
TIA Portal ビルドやダウンロード時に暗号化処理が集中 Windows Updateの一時的アンインストールか、パッチ提供を待ちつつインスタンス分離の検討
SharePoint クロール時に大量ファイルを並列処理してハッシュ計算 並列度を下げる、クロール インパクト ルールで制限を行う
Windows Admin Center 複数のホストへ並列接続時に暗号化ライブラリの衝突 接続数設定を調整、バージョンアップやパッチ適用を待つ
自作.NETアプリ マルチスレッドでSHA256インスタンスを使い回す スレッドごとにインスタンスを生成、lock導入など排他制御を徹底

私の経験談

実際に遭遇したトラブル

以前、社内用に作成したサーバーアプリケーションで、Windows Update適用直後から突然エラー発生率が上昇しました。ログを見るとSHA256のComputeHashあたりで異常が起きており、-1073741816というエラーメッセージが記録されていました。最初はライブラリの不具合かと思い込み、あちこち修正しましたが、結局はマルチスレッド周りのコードを丁寧に書き直すことで改善しました。

私の場合、一度エラーが起きるとアプリケーションを再起動するまでハッシュ計算がまったく通らなくなり、現場が大混乱になりました。その日は1日中デバッグをしていて、原因究明にかなり時間を割きました。

修正方法と効果

ハッシュ計算の処理をスレッドごとに切り分けるようにし、共有していたSHA256インスタンスを各タスクで別個に生成して使う設計に変えました。結果として、エラーはほぼゼロになりました。併せて、Windows Updateを戻す必要もなく、根本的な解決ができたことに安心を覚えました。

今後の展開

ベンダーからの対応の可能性

マイクロソフトやサードパーティソフトウェアのベンダーが、この現象を把握してアップデートやパッチを提供してくれる場合があります。実際、Siemensなどは公式のサポート情報を公開しているケースもあり、そうした情報をこまめにチェックすることで安心感を得られます。

アプリケーション開発者としての注意点

暗号化ライブラリ以外にも、Windows Updateによって内部のAPIの動作が変化する可能性はあります。マルチスレッドプログラムのテストは、従来のテスト手法では捉えきれない不具合が潜みやすいので、並列化や排他制御の部分を重点的に検証しておくとよいでしょう。日頃からテストコードを整備し、例外が出た際に迅速に原因特定できる環境を整えることも大切です。

まとめ

マルチスレッド環境での暗号化処理を見直す大切さ

今回のエラーは、今まで暗黙的に動作していたコードの不備を表面化させるものでした。Windows Updateをきっかけに問題が顕在化することは決して珍しくありません。この機会に、自身の開発したコードや使用しているソフトウェアが並列処理を適切に行っているか、改めて振り返ってみるとよいでしょう。

セキュリティ更新を外すリスクと上手な付き合い方

Windows Updateをアンインストールすれば一時的に解決する場合もありますが、セキュリティリスクを伴う行為です。できる限りパッチは適用した状態で根本対策を行い、もしアンインストールがやむを得ない場合は、最小限の期間で対処し、再度アップデートを戻す準備を進めるのが望ましい方法です。

執筆者のコメント

暗号化というと一見敷居が高く感じますが、実際に大規模アプリから小さなスクリプトまで幅広く利用されています。エラーが起きると原因を追うのもひと苦労ですが、適切に排他制御やインスタンス分離を行っていれば大抵は防げるものです。今回のような現象が発生したら、まずは並列処理の設計や実装を見直してみてくださいね。

コメント

コメントする