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 クラスのプロパティ等は用意されていません。各要素を上限値以内にして回避してください。