ColdFusion プロジェクトを作成するか、既存のプロジェクトを使用します。プロジェクトが確実に優先サーバーに関連付けられるようにします。これを確認するには、プロジェクトのプロパティで適切なサーバーを選択します(ナビゲーター内で右クリックして、プロパティを選択します)。
セキュリティの機能強化
あらゆる Web アプリケーションにとって、セキュリティは重要な意味を持ちます。Web アプリケーションの開発では、セキュリティの落とし穴を回避することが重要です。
セキュリティコードアナライザー
セキュリティアナライザーは、Adobe ColdFusion(2016 リリース)に導入された新機能です。この機能は、ColdFusion Builder に統合され、開発者は、ColdFusion コードを記述しながら、セキュリティの落とし穴および脆弱性を回避することができます。
この機能を使用すると、次のことを表示できます。
- エディター内の脆弱なコード
- 脆弱性または攻撃のタイプ(エラーおよび警告)
- 脆弱性の厳格度レベル(高、中、低)
- 脆弱性を回避するための提案
- セキュリティアナライザーは、ColdFusion Enterprise または Enterprise(体験版)と開発者プロファイルでのみ機能します。
- セキュリティアナライザーは、ColdFusion Developer または Standard Edition と本番または本番セキュアプロファイルでは機能しません。
- セキュリティアナライザーは、ColdFusion Builder デフォルトローカルサーバーでは機能しません。
サーバーのセキュリティアナライザー機能はサービスとして公開されており、ColdFusion Builder がこのサービスへのリクエストを作成します。ファイル、フォルダーまたはプロジェクトのセキュリティ脆弱性のリストを取得できます。
ColdFusion Builder のセキュリティアナライザーへのアクセス
ColdFusion Builder のセキュリティアナライザーにアクセスするには、次の手順に従います。
- ナビゲーターパネルのプロジェクトフォルダーまたはプロジェクトファイルを右クリックします。
- セキュリティアナライザー/セキュリティアナライザーを実行を選択します。
セキュリティアナライザーには、次の 3 つのオプションがあります。
- セキュリティアナライザーを実行 - コードの脆弱性を分析および表示します。
- セキュリティアナライザーをクリーン実行 - 無視されたすべてのメッセージおよび警告の履歴をクリアします。無視される脆弱性(「セキュリティアナライザーの実行時に無視」とマークされている)をクリアし、プロジェクトの脆弱性をすべて表示します。
- セキュリティマーカーをクリア - すべてのセキュリティ警告およびリソースを削除します。リソースの脆弱性を表示するには、セキュリティアナライザーを再度実行します。
セキュリティアナライザーの使用
プロジェクトフォルダーまたはファイルにセキュリティアナライザーを使用するには、次の手順に従います。
-
-
プロジェクトフォルダーまたはプロジェクトファイルを右クリックし、セキュリティアナライザー/セキュリティアナライザーを実行を選択します。 セキュリティアナライザーがコードを分析します。タスクが完了すると、ポップアップダイアログが表示されます。
-
「OK」をクリックします。
次に示すように、エディターの下部のパネルにすべての脆弱性が表示されます。 -
脆弱性のリストを表示するには、左側のパネルの「セキュリティ問題」をクリックします。
- スナップショットの左側のパネルに表示されている脆弱性タイプ(SQL インジェクションまたは XSS 攻撃など)をクリックすると、対応する問題ステートメントが表示されます。また、右側のパネルに提案されるソリューションを表示できます。
- または、中央のパネルでエラーをクリックして、対応するステートメントとソリューションを右側のパネルに表示することもできます。
- 中央のパネルの各エラーをダブルクリックすると、対応する行がエディターに表示されます。
- 中央のパネルで、「ファイル名」、「攻撃名」、「厳格度レベル」、「タイプ」のフィルターを使用します。検索エリアにファイル名を入力して、脆弱性があるファイルを探します。すべてドロップダウンリストをクリックし、「高」、「中」、「低」の厳格度レベルに基づいて、検索を絞り込むことができます。
注意:「両方」ドロップダウンリストは、グレー表示されている場合があります。この状態は、左側のパネルでカーソルが既に「エラー」または「警告」問題タイプを指している場合に発生します。セキュリティ問題フォルダーを選択することによって、このドロップダウンリストをアクティブな状態に戻すことができます。
-
コードのエラーを修正したら、中央のパネルで対応するエラーを右クリックし、ステータスとして「修正済み」を選択します。エラーを無視する場合は、ステータスを「無視」としてマークします。
同じ手順を使用して、エラーを「修正する」ステータスに戻すこともできます。
注意:セキュリティアナライザーを再実行(セキュリティアナライザー/セキュリティアナライザーを実行)すると、無視した脆弱性は表示されなくなります。「修正済み」としてマークした脆弱性が修正されていない場合、サーバーはこれらのエラーを報告します。
-
セキュリティアナライザーパネルの右上隅にあるエクスポートをクリックして、すべての脆弱性を report.html ファイルにエクスポートします。次のように、エクスポートしたファイルで、リソースのすべての脆弱性のグラフィカル表示を確認できます。
セキュリティアナライザーのタイムアウトの延長
RDS 構成設定で、セキュリティアナライザーのタイムアウトを延長できます。
デフォルト値は 30 秒です。
- サーバーを右クリックするか、Windows/ビューを表示/Other(その他)を選択します。
- テキストフィールドに "RDS" と入力します。
その他のセットアップ設定
次のいずれかの操作を行います。
- Windows ファイアウォールでポート 8500 へのアクセスを解放します。
- IIS の /CFIDE のサイトおよび指定されたコネクタの uriworkermap.properties ファイル用の仮想ディレクトリを設定します。このファイルで、/CFIDE/* = cfusion の前の ! を削除します。
セキュリティアナライザーのワークフロー
- セキュリティアナライザーは、ColdFusion サーバーによってサービスとして公開されます。
- ファイルまたはファイルセットに対してセキュリティアナライザーを実行すると、ColdFusion Builder がこのサービスへのリクエストを作成します。
- ColdFusion Builder は、脆弱性および対応する行番号を、ファイルごとに個別のビューに表示します。
- 脆弱性をダブルクリックすると、赤いアイコンが表示され、対応する行をカーソルが指している状態で、エディターウィンドウにそのファイルが表示されます。
- また、脆弱性をシングルクリックすると、攻撃および可能な回避方法に関する簡単な説明が表示されます。
セキュリティ脆弱性のリスト
以下のサンプルコードのように、攻撃者は値を url.id 変数に渡すことによって、データベースに対して実行される任意の SQL ステートメントを作成できます。例えば、攻撃者は 1 DELETE FROM news という値を渡してテーブル内のすべてのニュース記事を削除したり、0 UNION SELECT username, password FROM users という値を渡してデータベースからユーザー名とパスワードを抽出したりできます。
<cfquery>
SELECT headline, story
FROM news
WHERE id = #url.id#
</cfquery>
脆弱性のシナリオ
- <cfquery name="SelectExample"
datasource="cfdocexamples">
select FROM Employee
WHERE Emp_ID=#var#
</cfquery>
- <cfset result = QueryExecute("select * from Employees where empid=#id5#")>
- <cfset v3="#form.vf#"><cfset employees = ORMExecuteQuery("from Employee where name=#v3#")>
上記のコードサンプルはいずれも、クエリーステートメントの内側で未知の変数を使用しているので、コードが脆弱になります。
<cfoutput>Hello #url.name#</cfoutput>
上記のコードを使用して、攻撃者は JavaScript を url.name 変数に渡し、この URL にアクセスしたユーザーのブラウザーで実行することができます。攻撃者は、データベース内に保存可能な XSS コードを投稿し、後で実行することもできます。例えば、すべての訪問者にあるページを表示するコメントを投稿します。
脆弱性のシナリオ
- <cfoutput>Hello #name2#</cfoutput>
- <cfparam name = "id12" default = "my default value" type="string">
- <cfoutput>#id12#</cfoutput>
cfparam で宣言された変数の型が "string" の場合は、脆弱なコードになります。 - <cfoutput > <b>LINK to URL:</b> <a target="_blank" href="http://#url#">#url#</a> </cfoutput>
アンカータグの url リンクに未知の変数を使用しているので、XSS 攻撃に対して脆弱です。
ColdFusion 11 で導入された cfhtmltopdf タグは、WebKit を使用した強力な HTML レンダリング機能を提供して PDF ファイルを生成します。サーバーが HTML をレンダリングするので、PDF ドキュメントで変数を使用する際は注意が必要です。
クロスサイトスクリプティングに関連するすべての予防策も、cfhtmltopdf タグ内に書かれた変数に適用されます。レンダリング時に、JavaScript を cfhtmltopdf タグ内で実行できます。
レンダリング時、JavaScript はサーバー上で実行されるので、クライアントサイドのクロスサイトスクリプティング攻撃とはリスクがまったく異なります。リスクには、Webkit の未知の脆弱性に対するサービス妨害(DoS)および悪用の可能性が含まれます。さらに、サーバーはファイアウォールの背後で他のシステムとのネットワークアクセスが可能なので、ネットワークファイアウォールを迂回することによるリスクがあります。
脆弱性のシナリオ
- <cfhtmltopdf>
<h1>Hello <cfoutput>#pf2#</cfoutput></h1>
</cfhtmltopdf>
- <cfhtmltopdf>
<h1>Hello <cfoutput>#url.name#</cfoutput></h1>
</cfhtmltopdf>
- <cfdocument format="PDF">
<cfoutput> #hello#
</cfoutput>
<cfdocumentitem type="header" >
<cfoutput>#abc#</cfoutput>
</cfdocumentitem>
</cfdocument>
クロスサイトリクエストフォージェリ(CSRF)の脆弱性が悪用される状況としては、攻撃者が認証済みユーザーをだまして URL をクリックさせたり、ユーザーの認証済みブラウザーによってリクエストされるページに URL を埋め込んだりする場合が考えられます。
脆弱性のシナリオ
- <cfform method="POST">
<cfinput type="submit" value="Make Administrator"/></cfform>
CSRFGenerateToken() 関数を使用しない場合、このコードは脆弱です。
- <cfform method="POST">
<cfinput type="hidden" name="token" value="#CSRFGenerateToken()#" />
<cfinput type="submit" value="Make Administrator" />
</cfform>
CSRFGenerateToken
関数に対応する CSRFVerifyToken () 関数がない場合、このコードは脆弱です。
- <cfset var2 = CSRFGenerateToken2("make-admin")>
<cfform method="POST" action='/csrf/dummy.cfm'>
<cfinput type="hidden" name="token" value="#var2#" />
<cfinput type="submit" value="Make Administrator" />
</cfform>
指定された action ページ内の CSRFGenerateToken
関数に対応する CSRFVerifyToken () 関数がない場合。
セッション識別子が URL クエリー文字列に追加されないようにします。エンドユーザーは、セッション識別子が URL に含まれていることを知らずに、URL を電子メールで送信または公開します。
脆弱性のシナリオ
- <cflocation url="random.cfm" addtoken="true">
"addtoken" 属性が明示的に true に設定されている場合。
- <cflocation url="random.cfm">
"addtoken" が指定されていない場合は、デフォルト値 true が使用されます。
- <cfset addtoken1 = "true">
<cflocation url="random.cfm" addtoken="#addtoken1#">
"addtoken" 属性で変数が使用され、その変数が true に設定されている場合。
Cookie は機密情報を含んでいる可能性があります。
脆弱性のシナリオ
- <cfcookie name="sample" value="random" httponly="false" secure="false">
"httponly" 属性と "secure" 属性がどちらも明示的に false に設定されている場合、このコードは脆弱です。
- <cfcookie name="sample" value="random" httponly="true" secure="false">
"httponly" 属性と "secure" 属性のどちらかが明示的に false に設定されている場合、このコードは脆弱です。
- <cfcookie name="sample" value="random" >
"httponly" 属性と "secure" 属性が設定されていない場合は、デフォルト値の false が使用されるので、コードが脆弱になります。
パスワードをプレーンテキストに格納しない。
脆弱性のシナリオ
- <cfcache action="get" timespan="#createTimeSpan(0,0,10,0)#" password="pwd">
- <cfset password = "abc">
<cfcache action="get" timespan="#createTimeSpan(0,0,10,0)#" password="#password#">
- <cfhtmltopdf ownerpassword="#pw#" userpassword="abc"></cfhtmltopdf>
上記のシナリオはいずれも、ハードコードされたパスワードを使用しているので、コードが脆弱になります。
ファイルをサーバーにアップロードする場合は常に特別な注意を払って、ファイルパスとファイルタイプを適切に検証してください。
脆弱性のシナリオ
- <cffile action = "upload" fileField = "FileContents"
destination = "c:\folder1\folder2" accept = "text/html"
nameConflict = "MakeUnique" strict="false">
- <cffile action="upload" filefield="photo" accept="image/gif,image/png,image/jpg"
destination="#getTempDirectory()#" nameconflict="overwrite" strict="false">
- <cffile action="uploadall" destination="#expandpath('./upload')#" accept="text/html" strict="false">
上記のシナリオでは、strict が明示的に false に設定されているので、コードが脆弱になります。"getTempDirectory()" 関数を destination に使用していない場合も、警告が返されます。
GET メソッドを使用して機密情報を送信しない。
脆弱性のシナリオ
- <cfform method="get" action="sayHello.cfm">
<cfinput name="userName" type="text" >
<cfinput name="token" value="#CSRFGenerateToken()#" type="hidden" >
<cfinput name="submit" value="Say Hello!!" type="submit" >
</cfform>
method が明示的に "get" に設定されている場合、このコードは脆弱です。
- <cfform action="sayHello.cfm">
<cfinput name="userName" type="text" >
<cfinput name="token" value="#CSRFGenerateToken("a")#" type="hidden" >
<cfinput name="submit" value="Say Hello!!" type="submit" >
</cfform>
method に値が設定されていない場合、デフォルトでは "get" メソッドが使用されます。
<cfinclude template="views/#header#">
上記の脆弱なサンプルコードでは、#header# 変数の値を検証せずにファイルパス内で使用しています。攻撃者は、脆弱なコードを使用して、ColdFusion がアクセス権を持つサーバー上のどのファイルでも読み込むことができます。例えば、?header=../../server-config.txt をリクエストすることによって、攻撃者は公開するためのものではない設定ファイルを読み込むことができます。
脆弱性のシナリオ
- <cfinclude template="constant/#somepath#">
- <cffile action="write" file="#filevar2#">
- <cfscript> myfile = DirectoryDelete(var); </cfscript>
上記のシナリオはいずれも、ファイルパスまたはディレクトリパスに未知の変数を使用しているので、コードが脆弱になります。