一部変数の暗黙スコープ処理の変更について

2024年3月にリリースされた ColdFusion 2023 Update 7 / 2021 Update 13では、スコープ インジェクションの脆弱性に対処する重大な変更が含まれました。

これまでのColdFusionは、スコープが指定されていない変数(「#URL.変数名#」や「#Form.変数名#」ではなく、ただ「#変数名#」と記述した)の参照については、以下のページの「スコープが指定されていない変数の評価」の順に従って変数を探し、見つかり次第、そのスコープの変数を参照していました。

https://helpx.adobe.com/jp/coldfusion/developing-applications/the-cfml-programming-language/using-coldfusion-variables/about-scopes.html
内、「スコープが指定されていない変数の評価」を参照

また、ColdFusion 2016からは、Application.cfc のアプリケーションレベルの変数(This.searchImplicitScopes)や主にApplication.cfmで使用する<cfapplication>タグにsearchImplicitScopes属性が追加され、CGI・URL・Form・Cookie・File・Client変数については、変数を検索するかどうかを指定することもできるようになりましたが、これまでデフォルトは「True」(それら変数の検索を行う)となっていました。

https://www.samuraiz.co.jp/coldfusion/faq/dl/ColdFusion2016_seminar.pdf#page=35「Adobe ColdFusion2016最新機能のご紹介」のP.35を参考にしてください。

2024年3月以降にリリースされたUpdateを適用した後は

  • スコープが指定されていない「CGI変数」「URL変数」「Form変数」「Cookie変数」「File変数」「Client変数」については変数を探さない
  • Application.cfcのthis.searchImplicitScopesや<cfapplication>タグのsearchImplicitScopes属性を指定しなかった時のデフォルト値が「False」(それら変数の検索を行わない)に変更

となりました。

そのため、2024年3月以降にリリースされたUpdateを適用した後は、プログラム内にスコープを指定しない「CGI変数」「URL変数」「Form変数」「Cookie変数」「File変数」「Client変数」を参照している箇所がある場合は、UndefinedElementExceptionや変数 {xx} は未定義ですのエラーが発生するようになります。


このエラーに該当する場合は、以下のいずれかの方法にて対応を行ってください。

  • エラーとなった変数にスコープを付ける(#変数名#→#Form.変数名# 等)
  • 新たに用意されたJVMフラグを追加するか、Appplication.cfc / 主にApplication.cfmで使用する cfapplicationタグのsearchImplicitScopesをtrueして以前の動作に戻す

開発元のアドビでは、スコープ インジェクションの脆弱性を防ぐために、プログラム上のエラーとなった変数にスコープを付ける( searchImplicitScopes は FALSE のまま、問題が発生した場合はプログラムを修正する)ことを強く推奨しています。

ただし、プログラムの修正範囲が多いなど、すぐに対応できない場合に備え、以下のどちらかの方法で以前の動作に戻す方法も用意されています。

  • ColdFusion Administratorの「サーバーの設定 > Java と JVM」の『JVM引数』に新たに追加されたJVMフラグ『-Dcoldfusion.searchimplicitscopes=true』を指定する
    ※JVM引数に追加する際、項目と項目の区切りは空白で、改行は入れないでください
    ※※このJVMフラグは、次のメジャーバージョンアップでは廃止される予定です
  • Application.cfcで「This.searchImplicitScopes=true」を指定するか、または、主にApplication.cfmで使用する<cfapplication>タグの属性に「searchImplicitScopes=true」を追加する

その他(2024.4.4、および 2024.4.12 追記):
開発元のアドビでは、スコープが指定されていないCGI変数、URL変数、Form変数、Cookie変数、File変数、Client変数に対するプログラムの修正を支援する目的で、暗黙的に参照しているそれら変数をunscoped.logに書き出すパッチを公開しました(2024.4.12追記→)パッチの内容が更新されてログに出力される情報が増えました。初期パッチを使用している方は以下のページからパッチを再ダウンロード・再適用してください

https://helpx.adobe.com/coldfusion/kb/view-unscoped-variables-log-file.html
View unscoped variables in a log file
※ブラウザの翻訳機能などをご利用ください

上記のページ内からダウンロードできるパッチファイル(cf2023: hf202300-8888888.jar, cf2021: hf202100-9999999.jar)を、[cf_root]/{インスタンス(cfusion等)}/lib/updates ファルダ内に配置し、ColdFusionを再起動してください。

本パッチは、ColdFusion 2023 Update 6、または、2021 Update 12以降で動作します(ColdFusion 2023 Update 7 や 2021 Update 13では、以前の動作に戻している場合に動作します)。unscoped.logに書かれているログの内容については、上記のページをご確認ください。

(補足)

  • ログに書きだされるページはリクエストしたページとなり、変数が記載されているページではありません。例えばtemplate.cfmに暗黙的な変数の参照が書かれていて、index.cfmをリクエストした際にtemplte.cfmファイルをインクルード(<cfinclude>)している場合、ログにはindex.cfmと書き出されます
    • カスタムタグやcfcを呼び出した先で対象の暗黙的な変数の呼び出しがあった場合も同様です
  • (2024.4.12 追記)パッチが更新されました。更新されたパッチを使用するとunscoped.logに書き出されるログに以下の改善が行われます。
    • 暗黙的に呼び出した変数の名前に加えてスコープもログに記載されるようになりました。
      • (更新前)~略~,"C:\xxxxxx\cf_tag.cfm:TEST"
           ↓
        (更新後)~略~,"C:\xxxxxx\cf_tag.cfm:TEST,scope:FormScope"
    • <cfinclude>でインクルードしたページや、カスタムタグ・cfcの呼び出し先に対象の変数が記載されている場合、対象のページがログに記載されるようになりました。
      • (呼び出し先のCFCのメソッド内で対象の変数があった場合)
         ~略~,"C:\xxxxxx\url_test.cfc:TEST,scope:UrlScope"
      • (カスタムタグ内で対象の変数があった場合)
         ~略~,"C:\ColdFusion2023\cfusion\CustomTags\ctest.cfm:TEST,scope:UrlScope"
         
  • なお、上記のページの末尾にも記載されていますが、対象となる変数が多ければ多いほど、対象のページへのアクセスが増えれば増えるほど、ログに書き込まれる量も頻度も増えるため、パッチを適用しない場合に比べてパフォーマンスが下がる可能性があります。ですので、本番環境にパッチを当てっぱなしにするよりかは、期間を絞って一時的にパッチを配置する(配置したパッチファイルを削除すればログの出力は止まります)か、テスト環境等に入れて確認することが適していると思います。

 


記事公開日:2024年04月04日
最終更新日:2024年04月12日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.