14

In Using WebSocket in point-to-point communication in Adobe ColdFusion 10 Dev Guide, the javascript object mysocket created by <cfwebsocket> can call an invoke() method that can literally invoke Any public method on Any CFC from JavaScript.

How is this Not a security risk? How shall a cfc / function protect against being invoked by websocket?

1. Create a CFM page 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. Create a CFC mycfc.cfc that contains the function called from the client page.

<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>

EDIT: not Any function, private function returns:

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

UPDATE:

I tried moving mycfc.cfc to /com (outside of webroot) and added a mapping to /com and the functions can STILL be successfully invoked.

UPDATE: July 3, 2013

The Adobe Product Security Incident Response Team (PSIRT) is aware of this issue and is actively engaged with the ColdFusion Product Team to release a fix.

http://blogs.coldfusion.com/post.cfm/coldfusion-10-websocket-vulnerebility

UPDATE: July 9, 2013

Adobe has released a security hotfix for ColdFusion 10 for Windows, Macintosh and Linux. This hotfix addresses a vulnerability (CVE-2013-3350) that could permit an attacker to invoke public methods on ColdFusion Components (CFC) using WebSockets.

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

4

4 回答 4

7

我认为您无法按照目前的情况使用 ColdFusion 解决此问题(更新:这是在 ColdFusion 10.0.11 发布之前编写的;该问题现已由 10.0.11 解决)。我不认为布鲁斯基于 CFML 的答案——尽管它或它的变体会起作用——在现实世界中真的可行。

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

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

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

于 2013-06-30T11:39:41.060 回答
2

在对新文档页面和其他项目进行实际测试和进一步调查后(这件事很复杂!),Coldfusion 10 websockets 调用功能在我看来确实被破坏了。我花了一个多小时试图在调用的函数运行之前执行一些操作。我不能!

此处记录了新的“通道侦听器功能”:http: //help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d318518767eb3aa135858633ee-7ff9.html

但是,文档明确指出“调用”功能没有侦听器功能。运行调用时,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 回答
2

Adobe 已发布适用于 Windows、Macintosh 和 Linux 的 ColdFusion 10 安全修补程序。此修补程序解决了一个漏洞 (CVE-2013-3350),该漏洞可能允许攻击者使用 WebSockets 调用 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."

于 2013-07-09T17:26:08.267 回答
-3

对于 Javascript 或任何其他客户端而言,能够调用任何 CFC 上的任何公共方法当然不是安全风险。这是您选择公开的接口的预期行为。为了解决这个问题,ColdFusion 团队必须回到他们最初的 Websocket 设计并重做它。

于 2013-07-07T10:35:34.230 回答