ColdFusion 10 でのセキュリティの機能強化により、XSS および CSRF 攻撃に対する脆弱性が低下します。この機能強化は、ColdFusion セッションの効果的な管理にも役立ちます。このリリースには、他の脆弱性を軽減する修正も含まれます。

XSS 攻撃

クロスサイトスクリプティング(XSS)攻撃は、Web ブラウザーによって実施されるクライアントサイドのセキュリティメカニズムをバイパスします。これらのメソッドでは、エンコーディングに Open Web Application Security Project(OWASP)の Enterprise Security API を使用します。攻撃者は、悪意のあるスクリプトを Web ページに挿入して、ブラウザーに格納されている情報にアクセスします。

  • cform タグ内の name 属性の値として許される文字は、英数字、_(アンダースコア)、-(ハイフン)、:(コロン)、(ドット)のみです。これにより、scriptsrc フィールドに格納される XSS を防ぎます。
  • XSS 攻撃に対する脆弱性を軽減するために追加される新しいエンコーディングメソッドは、EncodeForHTMLEncodeForHTMLAttributeEncodeForJavaScriptEncodeForCSS および EncodeForURL です。コンテキストに応じてユーザー入力をエンコードします。入力文字列をデコードするために、Canonicalize メソッドが追加されました。

CSRF 攻撃

クロスサイトリクエストフォージェリ(CSRF)は、ユーザーが認証された Web アプリケーションで、ユーザーに意図しない操作を強制的に実行させるものです。例えば、電子メールやチャットを使用してアクセス権のあるユーザーに URL を送信します。URL リンクをクリックすると、ユーザーは攻撃者が意図する操作を実行させられます。

  • 次のメソッドを使用して、CSRF に対する脆弱性を軽減できます。
    • CSRFGenerateToken:ランダムなトークンを返し、セッション内に格納します。
    • CSRFVerifyToken:指定されたトークンとキーを、セッションに格納されているものと同じかどうか検証します。*例:CSRFGenerateToken* 次の例では、ユーザーは値を入力して送信します。ページではトークンが生成され、別の ColdFusion ページが呼び出されます。

      <cfset csrfToken=CSRFGenerateToken() />
      <cfform method="post" action="sayHello.cfm">
      <cfinput name="userName" type="text" >
      <cfinput name="token" value="#csrfToken#" type="hidden" >
      <cfinput name="submit" value="Say Hello!!" type="submit" >
      </cfform>

      次のページ sayHello.cfm では、生成されたトークンが検証され、CSRFverifyToken(token) の出力が表示されます。

      <cfset validate = CSRFverifyToken(token)>
      <cfoutput >#validate#</cfoutput>

注意:CSRF に対する保護のためには SessionManagement を有効にします。管理コンソールでセッション変数を無効にすると、CSRF 保護が無効になります。

セッションの向上

ColdFusion のセッション Cookie を効率よく管理できます。

CF セッション Cookie(CFID、CFTOKEN、CFAuthorization_<app-name>)

セッション Cookie を管理するための新しい機能は次のとおりです。

  • ColdFusion セッション Cookie の次のプロパティを、サーバーレベルまたはアプリケーションレベルで設定できます。
    • httponly:デフォルト値は true
    • secure:デフォルト値は false
    • domain
    • timeout:デフォルト値は 30 年
      次の例で示すように、Application.cfmas で設定を構造体として指定することで、アプリケーションレベルでセッション Cookie を設定できます。

      <cfset cookieast = {timeout=createTimeSpan(0, 0, 00, 10)}>
      <cfapplication name="sessionCookies_appcfm_allSetting" sessionmanagement="Yes" sessiontimeout="#createTimeSpan(0,0,03,0)#" scriptprotect="all" sessioncookie=#cookiest# authcookie=#cookieast#>

注意:アプリケーションレベルの設定は、サーバーレベルの設定より優先されます。

サーバーレベルでセッション Cookie を設定するには、次の新しい管理 API を使用し、パラメーター getRuntimeProperty および setRuntimeProperty を指定します。これらのメソッドは、CFIDE\adminapi\runtime.cfc ファイルで使用できます。次の例は、getRuntimeProperty() メソッドを使用した Cookie パラメーターの取得方法を示しています。Cookie パラメーターの設定は、setRuntimeProperty() メソッドを使用して同様の方法で行います。

GetRuntimeProperty("SecureSessionCookie");
GetRuntimeProperty("SessionCookieTimeout");
GetRuntimeProperty("SessionCookieDomain");

  • Application.cfc で次のように指定することにより、アプリケーションレベルでセッション Cookie を設定できます。
    • this.sessioncookie.httponly="true"
    • this.sessioncookie.secure="true"
    • this.sessioncookie.domain="value"
    • this.sessioncookie.timeout="value" (days)
    • this.authcookie.timeout= "value"(デフォルトでは -1。Cookie はブラウザーが開くまで有効です。)

      注意:SetDomainCookies プロパティを定義して、アプリケーションおよびサーバーレベルでドメインに対するセッション Cookie を設定できます。この場合、優先順位は、アプリケーションの設定、サーバーの設定、SetDomianCookies プロパティの順になります。

注意:ColdFusion 9.01 で追加されたシステムプロパティ coldfusion.sessioncookie.httponly=true は、このリリースでは不要になったので、削除されました。

注意:CFCookie タグおよび CFHeader タグを使用した ColdFusion Cookie および承認 Cookie の操作は、アプリケーションレベルまたはサーバーレベルの設定で制御できます。application.cfc または application.cfm に、sessioncookie.disableupdate=true および authcookie.disableupdate=true を追加します。CFIDE\adminapi\runtime.cfc で、GetRuntimeProperty("CFInternalCookieDisableUpdate") メソッドおよび {{SetRuntimeProperty("CFInternalCookieDisableUpdate", "true/false")}} メソッドを使用することもできます。ColdFusion Administrator でタグを設定するには、サーバーの設定/メモリ変数/セッション Cookie 設定を使用します。「ColdFusion のタグ / 関数を使用して ColdFusion の内部 Cookie を更新できないようにします」を選択または選択解除します。

  • ColdFusion 10 および ColdFusion 11:セッションのセキュリティを強化するために、ColdFusion アプリケーションで SetDomainCookies を有効にして、CFID および CFTOKEN の両方の Cookie の値にドメインハッシュを追加します。ColdFusion 10 および ColdFusion 11 HF 14 がこの動作をします。
  • ColdFusion 2016:新しい JVM 引数 "coldfusion.cookie.prefixdomainhash" が追加されました。この引数を false に設定すると、SetDomainCookies が true に設定されている場合でも、CFID および CFTOKEN へのドメインハッシュ接頭辞の追加が無効になります。新しい引数により、ColdFusion の複数のバージョンでセッションを共有できます。
  • <cflogin> タグでは、パスワードはキャッシュに保存されます。認証済みのセッションを長くするために、cfhome/lib/auth-ehcache.xml ファイル内にある authcache を変更して、diskPeristent を有効にすることができます。永続化のために使用するディレクトリは、セキュリティ保護されている必要があります。

CRLF 攻撃

キャリッジリターン(ASCII 13、¥r)ラインフィード(ASCII 10、¥n)(CRLF)攻撃は、HTTP レスポンス分割(HTTP Response Splitting)とも呼ばれます。この攻撃では、HTTP ストリームに CRLF が挿入されます。通常は、HTTP パラメーターまたは URL を変更することで行われます。それにより、CRLF をアプリケーションに挿入し、応答に含めることができます。プロキシおよびキャッシュによって解釈された CRLF は、重大なセキュリティの問題をもたらします。

  • cfheader、cfcontent、cfmail、cfmailpart、cfmailparam などのヘッダーを作成するタグに、CRLF 攻撃に対する保護が追加されています。

情報開示

この機能は、情報の開示におけるセキュリティ関連の問題を改善します。

  • このバージョンでは、すべてのサービスに対するパスワードが暗号化されます。パスワードのシードの変更は、実行中のサーバーに負荷がかかっていないときにのみ行ってください。そうしないと、サーバーで予期しない動作が発生します。

新しい HMAC メソッド

ハッシュベースのメッセージ認証コード(HMAC)は、データの整合性および送信されるメッセージの信憑性を確認するために使用されます。暗号ハッシュ機能と秘密鍵が組み合わされています。暗号ハッシュ機能には、Message Digest 5(MD5)、Secure Hash Algorithm(SHA)などを使用できます。

CFScript での cfcookie のサポート

CFScript では Cookie を構造体として設定できます。次のパラメーターを設定できます。

  • expires
  • value
  • name
  • secure
  • httponly
  • domain
  • path
  • preservecase
  • encodevalue
    例 1

cookie.mytest = {value="Adobe",expires="10",secure="true",domain=".adobe.com",path="/coldfusion"};
</cfscript>

例 2

cookie_example = structNew();
cookie_example.value = "example";
cookie_example.expires = "10";
cookie_example.secure = "true";
cookie.mycookie = cookie_example;
</cfscript>

その他の変更

  • httponly Cookie のサポートは、J2EE 1.6 をサポートする Tomcat で利用できます。
  • 新しいパラメーター numIteration が hash() メソッドに追加されました。このオプションのパラメーターは、ハッシュが繰り返される回数を指定します。更新された hash() メソッドは次のとおりです。

    hash(Object message, String algorithm, String encoding, int no-of-iterations)

    1 番目の引数には、String 型または Byte 型のオブジェクトを指定できます。

    <cfif IsDefined("Form.UserID")>
    <!--- query the data base. --->
    <cfquery name = "CheckPerson" datasource = "cfdocexamples">
    SELECT PasswordHash FROM SecureData WHERE UserID = <cfqueryparam value = "#Form.userID#" cfsqltype = 'CF_SQL_VARCHAR'>
    </cfquery>
    <!--- Compare query PasswordHash field and the hashed form password and display the results. --->
    <cfoutput>
    <cfif Hash(Form.password, "SHA","",4) is not checkperson.passwordHash> User ID #Form.userID# or password is not valid. Try again.
    <cfelse> Password is valid for User ID #Form.userID#.
    </cfif>
    </cfoutput>
    </cfif>
    <!--- Form for entering ID and password. --->
    <form action="#CGI.SCRIPT_NAME#" method="post">
    <b>User ID: </b> <input type = "text" name="UserID" ><br>
    <b>Password: </b> <input type = "text" name="password" ><br><br>
    <input type = "Submit" value = "Encrypt my String"> </form>

  • 強化された <cflogin> および承認の Cookie。クラスター環境では、スティッキーセッションを有効にします。スティッキーセッションが有効でない場合は、次のようにします。

    注意:分散キャッシュを追加する別の方法が Ehcache の Web サイトに記載されています。

    • クラスター環境用の認証キャッシュを設定します。クラスター内の各キャッシュに対して以下を行います。
    1. CF_instance/lib/auth-ehcache.xml を開きます。
    2. 「Mandatory Default Cache」という文字列を探し、次のエントリを追加します。

      <cacheManagerPeerProviderFactory
      class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
      properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
      multicastGroupPort=4446, timeToLive=32"/>
      <cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
      properties="port=40002, socketTimeoutMillis=3000"/>
      <!-- distributed caching settings part 1 ends -->

    3. 上記のエントリで、cacheManagerPeerListenerFactory プロパティポートを更新します。インスタンスごとに一意である必要があります。
    4. 「<cache name="authcache"」という文字列を探します。
    5. 「clearOnFlush="true">」の後に次のエントリを追加します。

      <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=false, replicatePuts=true, replicatePutsViaCopy=false, replicateUpdates=true, replicateUpdatesViaCopy=true, replicateRemovals=true" propertySeparator=","/>
      </cache>

注意:ColdFusion Administrator は、クラスターセットアップをサポートしていません。

注意:Remember Me タイプの機能の場合、または認証キャッシュを長時間有効にしておく場合は、認証キャッシュの設定を変更します。例えば、タイムアウトを長くしたり、永続キャッシュを有効にしたりします。

注意:認証のセキュリティを強化するには、新しい Cookie 設定を使用します。要件に応じて、サーバーレベルまたはアプリケーションレベルで設定を行います。

  • 次の場合は、一方の ColdFusion Administrator からログアウトします。
    • 同じホストから、ColdFusion(10)Administrator と古いバージョンの ColdFusion Administrator にログインしている。
  • RDS アクセスを使用している場合は、ColdFusion Administrator で、データソースとセキュリティ保護されたファイルパス権限を設定できます。
  • 新しいサンドボックスのデフォルト値は、より安全になるように変更されています。

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー