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

  • 質問

  • 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の不具合でしょうか。

    同様の報告もネット上に見当たらなかったため質問を投稿させて頂きました。


    2020年7月21日 1:20

回答

  • いままでSystem.Data.dllはSystem.Drawing.dllを参照していなかったのですが、参照されるようになったようです。
    ですがSQLCLRでデフォルトで許可されているdllにSystem.Drawing.dllはありません。
    そのため読み込みできずにエラーとなってしまうようです。

    XMLで読み込むことができる型を制限するようにしたのが今回の修正っぽい。
    (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!)

    • 編集済み gekkaMVP 2020年7月21日 12:14
    • 回答としてマーク oh.t 2020年7月27日 23:31
    2020年7月21日 12:00

すべての返信

  • いままでSystem.Data.dllはSystem.Drawing.dllを参照していなかったのですが、参照されるようになったようです。
    ですがSQLCLRでデフォルトで許可されているdllにSystem.Drawing.dllはありません。
    そのため読み込みできずにエラーとなってしまうようです。

    XMLで読み込むことができる型を制限するようにしたのが今回の修正っぽい。
    (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!)

    • 編集済み gekkaMVP 2020年7月21日 12:14
    • 回答としてマーク oh.t 2020年7月27日 23:31
    2020年7月21日 12:00
  • ありがとうございます!

    教えて頂いた回避策にてSQLCLRでReadXmlメソッドが動作するようになりました。

    フィードバックも投票しました。

    2020年7月27日 0:29
  • oh.tさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    本件、gekkaさんより参考になる投稿が寄せられたようでなによりです。

    [回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
    同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年7月27日 1:19
    モデレータ