在《 Adob​​e ColdFusion 10开发指南》中的Using WebSocket in point-to-point communication中,由mysocket创建的javascript对象<cfwebsocket>可以调用invoke()方法,该方法可以从JavaScript实际调用Any CFC上的Any公共方法。
这不是安全风险吗? 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."
}

更新:
我尝试将mycfc.cfc移到/com(在webroot之外),并向/com添加了映射,但函数仍可以成功调用。
更新:2013年7月3日

Adobe产品安全事件响应团队(PSIRT)知道
此问题,并与ColdFusion产品团队积极合作以
发布修复程序。

http://blogs.coldfusion.com/post.cfm/coldfusion-10-websocket-vulnerebility
更新:2013年7月9日

Adobe已发布Windows版ColdFusion 10的安全修补程序,
Macintosh和Linux。此修补程序解决了一个漏洞
(CVE-2013-3350)可能允许攻击者调用公共方法
使用WebSocket在ColdFusion组件(CFC)上运行。

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

最佳答案

我认为您无法使用ColdFusion修复此问题(更新:此版本是在ColdFusion 10.0.11发布之前编写的;此问题现在已由10.0.11解决)。我不认为Bruce基于CFML的答案-尽管可以使用它或它的变体形式-在现实世界中确实可行。

我可能会回过头来使用防火墙规则:Web套接字请求来自特定端口,因此您可以针对该端口上的请求制定一套规则,以及允许使用哪些方法。

这不是一个很好的解决方案,但考虑到这种情况,它可能是最方便的选择。

我在对您的原始问题的评论中指出了我在CF方面的研究,但最好从这里链接到它:“ Web socket security issue: risk assessment & findings

关于coldfusion - CF10 websocket p2p可以从JavaScript调用任何CFC中的任何公共(public)功能。这不是安全风险吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17351214/

10-13 07:46
查看更多