System.Security.Cryptography.Xml.SignedXml.LoadXml メソッドの更新について

こんにちは、Platform SDK (Windows SDK) サポートチームです。2018 年 5 月 8 日に公開された CVE-2018-0765 のセキュリティ更新に伴い、 System.Security.Cryptography.Xml.SignedXml.LoadXml  メソッドに行われた変更についてご案内します。

現象

2018 年 5 月 8 日に公開された CVE-2018-0765 のセキュリティの更新をインストールいただいた環境にて System.Security.Cryptography.Xml.SignedXml.LoadXml メソッドを利用して署名用の XML ファイルをロードした場合、Reference 要素 および Transform 要素が一定数以上定義されていると、「CryptographicException: 間違った形式の SignedInfo/Reference 要素です。」 例外が発生します。具体的な上限は以下の通りになります。

・Reference 要素内の Transform 要素が 10 以上。

・SignedInfo 要素内の Reference 要素が 100 以上。

原因

この上限はセキュリティ強化のために行われており、例外の発生は想定された動作になります。これまで Reference 要素 および Transform 要素は無制限に定義可能でしたが、セキュリティ攻撃に利用される危険性があると判断し、攻撃を防ぐために上限を設定しました。この情報は下記資料に公開しています。

CVE-2018-0765 | .NET および .NET Core のサービス拒否の脆弱性

https://portal.msrc.microsoft.com/ja-JP/security-guidance/advisory/CVE-2018-0765

新しく設定された上限の実装は、下記 System.Security.Cryptography.Xml 名前空間内にあるクラスのソースコードからも確認できます。

https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/utils.cs,309

309行目 (2018 年 6 月 12 日時点)

 long maxTransforms = GetNetFxSecurityRegistryValue("SignedXmlMaxTransformsPerReference", 10);

https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/utils.cs,331

331行目 (2018 年 6 月 12 日時点)

 long maxReferences = GetNetFxSecurityRegistryValue("SignedXmlMaxReferencesPerSignedInfo", 100);

回避策

この上限を変更する SignedXml クラスのプロパティ等は用意されていません。各要素を上限値以内にして回避してください。