トップ回答者
2020年7月WindowsUpdateの不具合?SQLCLRでReadXmlメソッドが例外エラーを返すようになりました。

質問
-
2020年7月WindowsUpdateについて。
CVE-2020-1147に対する下記セキュリティパッチを適用すると、SQLCLRでReadXmlメソッドが例外エラーを返すようになりました。
https://support.microsoft.com/ja-jp/help/4566519/kb4566519
確認環境、発生したエラーメッセージは下記の通りです。
■確認環境
・WindowsServer2012R2・SQLServer2016
■エラーメッセージメッセージ 6522、レベル 16、状態 1、行 1
ユーザー定義のルーチンまたは集計 "PadLeft" を実行中に .NET Framework エラーが発生しました:
System.TypeInitializationException: 'Scope' のタイプ初期化子が例外をスローしました。 ---> System.IO.FileNotFoundException: ファイルまたはアセンブリ 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
System.IO.FileNotFoundException:
場所 System.Data.TypeLimiter.Scope..cctor()
System.TypeInitializationException:
場所 System.Data.TypeLimiter.Scope.IsTypeUnconditionallyAllowed(Type type)
場所 System.Data.TypeLimiter.Scope.IsAllowedType(Type type)■再現コード
Imports System Imports System.Data Imports System.Data.SqlClient Imports Microsoft.SqlServer.Server Public Class SqlClrPadding <SqlFunction()> Public Shared Function PadLeft( ByVal str As String, ByVal totalWidth As Integer, ByVal paddingChar As Char ) As String Dim stRead As System.IO.StringReader Dim dsRead As System.Data.DataSet 'ReadXmlを使用。SQLCLRにReadXmlを使用するとエラー「ユーザー定義のルーチンまたは集計 "PadLeft" を実行中に .NET Framework エラーが発生しました: 」が発生 stRead = New System.IO.StringReader("<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>") dsRead = New System.Data.DataSet dsRead.ReadXml(stRead)
Return str.ToString.PadLeft(totalWidth, paddingChar) End Function End Class
上記をビルドしてSQLCLRに登録。
以下のSELECT文をSQLServerで流すとエラーが発生します。
SELECT
dbo.PadLeft('123', 5, '0') AS PAD_LEFT
同コードをSQLCLRではなく、WindowsFormで動かすと正常に動作するので、セキュリティパッチに問題があるのでは?と思っています。
WindowsUpdateの不具合でしょうか。同様の報告もネット上に見当たらなかったため質問を投稿させて頂きました。
回答
-
いままでSystem.Data.dllはSystem.Drawing.dllを参照していなかったのですが、参照されるようになったようです。
XMLで読み込むことができる型を制限するようにしたのが今回の修正っぽい。
ですがSQLCLRでデフォルトで許可されているdllにSystem.Drawing.dllはありません。
そのため読み込みできずにエラーとなってしまうようです。
(XMLに不正な型を定義して型を誤認させることで不正な処理を行わせる攻撃?)
その制限する型としてSystem.Drawingに含まれる型を参照する必要ができてしまったと。
具体的にはSystem.DrawingのColor,Point,PointF,Rectangle,RectangleF,Size,SizeFを参照している。ですので問題の一時的な回避策としてはSQL ServerにSystem.Drawing.dllを参照追加します。
CREATE ASSEMBLY [System.Drawing] FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.dll' WITH PERMISSION_SET = UNSAFE
そして自作のライブラリもUnsafeで登録するとエラーにならずに実行できました。
フィードバックしてみたので投票してみるといいかも
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
すべての返信
-
いままでSystem.Data.dllはSystem.Drawing.dllを参照していなかったのですが、参照されるようになったようです。
XMLで読み込むことができる型を制限するようにしたのが今回の修正っぽい。
ですがSQLCLRでデフォルトで許可されているdllにSystem.Drawing.dllはありません。
そのため読み込みできずにエラーとなってしまうようです。
(XMLに不正な型を定義して型を誤認させることで不正な処理を行わせる攻撃?)
その制限する型としてSystem.Drawingに含まれる型を参照する必要ができてしまったと。
具体的にはSystem.DrawingのColor,Point,PointF,Rectangle,RectangleF,Size,SizeFを参照している。ですので問題の一時的な回避策としてはSQL ServerにSystem.Drawing.dllを参照追加します。
CREATE ASSEMBLY [System.Drawing] FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.dll' WITH PERMISSION_SET = UNSAFE
そして自作のライブラリもUnsafeで登録するとエラーにならずに実行できました。
フィードバックしてみたので投票してみるといいかも
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
oh.tさん、こんにちは。フォーラムオペレーターのKumoです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
本件、gekkaさんより参考になる投稿が寄せられたようでなによりです。
[回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。
お手数ですが、ご協力の程どうかよろしくお願いいたします。
引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~