CF10 websocket p2p可以从JavaScript调用任何CFC中的任何公共函数.这怎么不是安全风险?

Hen*_*nry 14 coldfusion coldfusion-10 cfwebsocket

在Adobe ColdFusion 10开发指南中的点对点通信使用WebSocket时mysocket,<cfwebsocket>可以调用一个invoke()方法,该方法可以从JavaScript调用Any CFC上的任何公共方法.

这怎么不是安全风险?cfc/function如何防止被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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

编辑:不是任何函数,私有函数返回:

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

更新:

我尝试移动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,Macintosh和Linux发布了ColdFusion 10的安全修补程序.此修补程序解决了一个漏洞(CVE-2013-3350),该漏洞可能允许攻击者使用WebSockets在ColdFusion组件(CFC)上调用公共方法.

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

Ada*_*ron 7

我不认为你可以用ColdFusion解决这个问题,因为它目前的情况(更新:这是在ColdFusion 10.0.11发布之前编写的;现在问题已由10.0.11解决).我不认为布鲁斯的基于CFML的答案 - 虽然它或其变体可行 - 但在现实世界中确实是可行的.

我可能会回到使用防火墙规则:Web套接字请求进入特定端口,因此您可以围绕该端口上的请求获得一组规则,以及允许哪些方法.

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

我在对原始问题的评论中指出了我对CF方面的研究,但可能更好地从这里链接到:" Web套接字安全问题:风险评估和发现 "

  • **注意:**现已在CF10 Update 11中修复:http://helpx.adobe.com/coldfusion/kb/coldfusion-10-update-11.html || 更多:http://www.adobe.com/support/security/bulletins/apsb13-19.html (2认同)

Hen*_*nry 2

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

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

应用更新 11 后调用公共方法将返回"code":4001&"msg":"The method f1 in component mycfc cannot be accessed remotely."