14

Adobe ColdFusion 10 開発ガイドのポイントツーポイント通信での WebSocket の使用では、mysocketによって作成された JavaScript オブジェクトは、 JavaScript から Any CFC の Any パブリック メソッドを文字通り呼び出すことができるメソッドを呼び出すことができます<cfwebsocket>invoke()

これはどのようにセキュリティ リスクではありませんか? cfc / 関数は、websocket によって呼び出されないようにどのように保護しますか?

1. CFM ページ index.cfm を作成します。

<script type="text/javascript"> 
       function msgHandler(msgobj){ 
           var txt = document.getElementById("myDiv"); 
           var message = ColdFusion.JSON.encode(msgobj); 
           txt.innerHTML += message + "<br >" + "<br>"; 
       } 
       function invokecfcfn(){ 
              var fname= document.getElementById("fnname").value; 
              if (fname == "f2") { 
                     alert("f2 selected"); 
                     mysocket.invoke("mycfc", "f2", ["echo"]); 
              } 
              else 
                     mysocket.invoke("mycfc", fname); 
              
       } 
</script> 
<cfwebsocket name="mysocket" onmessage="msgHandler"/> 
<form> 
       <select id="fnname"> 
              <option>f1</option> 
              <option>f2</option> 
              <option>f3</option> 
       </select> 
       
       <input id="invokefn" name="invokefn" value="Invoke CFC function " type="button"  onclick="invokecfcfn();"> 
       <div id="myDiv"> 
       </div> 
</form>

2. クライアントページから呼び出される関数を含む CFC mycfc.cfc を作成します。

<cfcomponent> 
       
       <cffunction name="f1" > 
              <cfreturn "Message returned from f1"> 
       </cffunction> 
       
       <cffunction name="f2" returntype="string" > 
              <cfargument name="arg1" type="string" required="true"  > 
              <cfset msg= "Message from wsssendmessage of f2 which you called with arg " & arg1> 
              <cfset wssendMessage(msg)> 
              <cfreturn "Message returned from f2"> 
       </cffunction> 
       
       <cffunction name="f3" > 
              <cfthread action="run" name="t1" > 
                     <cfloop index="i" from="1" to="10"> 
                           <cfset sleep(20000)> 
                           <cfset wssendMessage("Message #i# from wsssendmessage of f3 #now()#")> 
                     </cfloop> 
              </cfthread> 
              <cfreturn "Thread initiated in f3"> 
       </cffunction> 
</cfcomponent>

編集:関数ではなく、プライベート関数は次を返します:

{
  "clientid":39550088,
  "ns":"coldfusion.websocket.channels",
  "reqType":"invoke",
  "code":4001,
  "type":"response",
  "msg":"The method f1 was not found in component mycfc.cfc."
}

アップデート:

(webroot の外部) に移動しようmycfc.cfcとしましたが、マッピングを追加しましたが、関数は引き続き正常に呼び出すことができます。/com/com

更新: 2013 年 7 月 3 日

Adobe Product Security Incident Response Team (PSIRT) はこの問題を認識しており、ColdFusion 製品チームと積極的に連携して修正をリリースしています。

http://blogs.coldfusion.com/post.cfm/coldfusion-10-websocket-脆弱性

更新: 2013 年 7 月 9 日

アドビは、Windows、Macintosh、および Linux 用の ColdFusion 10 のセキュリティ ホットフィックスをリリースしました。このホットフィックスは、攻撃者が WebSocket を使用して ColdFusion コンポーネント (CFC) でパブリック メソッドを呼び出すことを可能にする脆弱性 (CVE-2013-3350) に対処します。

http://www.adobe.com/support/security/bulletins/apsb13-19.html

4

4 に答える 4

2

アドビは、Windows、Macintosh、および Linux 用の ColdFusion 10 のセキュリティ ホットフィックスをリリースしました。このホットフィックスは、攻撃者が WebSocket を使用して ColdFusion コンポーネント (CFC) でパブリック メソッドを呼び出すことを可能にする脆弱性 (CVE-2013-3350) に対処します。

http://www.adobe.com/support/security/bulletins/apsb13-19.html

Update 11 の適用後に public メソッドを呼び出すと、"code":4001&が返されます。"msg":"The method f1 in component mycfc cannot be accessed remotely."

于 2013-07-09T17:26:08.267 に答える
2

Coldfusion 10 の websockets 呼び出し機能は、実際のテストと、新しいドキュメント ページや他のプロジェクトの詳細な調査 (これは複雑です!) の後で、私には壊れているように見えます。呼び出された関数が実行される前に、何かを実行するために 1 時間以上費やしました。私はできません!

ここに文書化された新しい「チャネルリスナー関数」があります: http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d318518767eb3aa135858633ee-7ff9.html

ただし、ドキュメントには、「呼び出し」機能にはリスナー機能がないことが明確に記載されています。また、invoke の実行時に Application.cfc または cfc リスナーが各リクエストでまったく実行されないように見えます。

これは設計上の欠陥のようです。この言語にはより多くのイベント リスナーが必要です。さもなければ、アプリケーションのすべての関数にセキュリティを追加しないと Websocket を使用できません。

各関数内のセキュリティは以下のコードのように行うことができますが、アプリケーション内のすべての関数を変更することはあまり現実的ではありません:

<cfscript>
local.meta=GetMetaData(this[url.method]);
if(not structkeyexists(local.meta, 'access') or local.meta.access NEQ 'remote'){
   throw("Function access must be set to remote.");
}
</cfscript>

また、Coldfusion の前に Web サーバー プロキシを使用することを検討し、正規表現を使用してリクエスト情報を検証して、アプリケーションの Websocket 部分のみをパブリック Websocket ポートで開く必要があるようにすることもできます。Nginx 1.4+ は Websocket プロキシをサポートしています: http://nginx.org/en/docs/http/websocket.html 注: nginx Websocket プロキシを使用してまだテストしていません。それが機能する場合、これははるかに簡単なソリューションになります。

于 2013-06-29T17:24:22.343 に答える
-3

任意の CFC で任意のパブリック メソッドを呼び出すことができることは、Javascript やその他のクライアントにとってセキュリティ上のリスクではありません。これは、パブリックとして公開することを選択したインターフェイスの予想される動作です。これを解決するために、ColdFusion チームは Websocket の元の設計に戻ってやり直す必要があります。

于 2013-07-07T10:35:34.230 に答える