CF10 websocket p2p может вызывать любые публичные функции в любом CFC из JavaScript. Как это не угроза безопасности? - программирование
Подтвердить что ты не робот

CF10 websocket p2p может вызывать любые публичные функции в любом CFC из JavaScript. Как это не угроза безопасности?

В Использование WebSocket в двухточечной связи в Adobe ColdFusion 10 Dev Guide, объект javascript mysocket, созданный <cfwebsocket> может вызвать метод invoke(), который может буквально вызывать любой публичный метод для любого CFC из JavaScript.

Как этот Не риск для безопасности? Как защищать 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>

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>

EDIT: не любая функция, возвращается частная функция:

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

UPDATE:

Я попробовал переместить mycfc.cfc в /com (за пределами webroot) и добавил сопоставление в /com, и функции могут успешно запускаться STILL.

ОБНОВЛЕНИЕ: 3 июля 2013 г.

Команда реагирования на инциденты с безопасностью продуктов Adobe (PSIRT) знает о этот вопрос, и он активно сотрудничает с группой продуктов ColdFusion для освободить исправление.

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

ОБНОВЛЕНИЕ: 9 июля 2013 г.

Adobe выпустила исправление для системы безопасности для ColdFusion 10 для Windows, Macintosh и Linux. Это исправление устраняет уязвимость (CVE-2013-3350), которые могут позволить злоумышленнику использовать общедоступные методы на компонентах ColdFusion (CFC) с использованием WebSockets.

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

4b9b3361

Ответ 1

Adobe выпустила исправление для системы безопасности для ColdFusion 10 для Windows, Macintosh и Linux. Это исправление устраняет уязвимость (CVE-2013-3350), которые могут позволить злоумышленнику использовать общедоступные методы на компонентах ColdFusion (CFC) с использованием WebSockets.

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

Вызов общедоступного метода после применения обновления 11 возвращает "code":4001 и "msg":"The method f1 in component mycfc cannot be accessed remotely."

Ответ 2

Я не думаю, что вы можете исправить это с помощью ColdFusion, поскольку он в настоящее время стоит (обновление: это было написано до выпуска ColdFusion 10.0.11, проблема теперь устранена на 10.0.11). Я не думаю, что ответ Брюса на основе CFML - пока он или его вариант будет работать - действительно реально в реальном мире.

Возможно, я вернусь к использованию правил брандмауэра: запросы на веб-сокеты входят в определенный порт, поэтому у вас может быть множество правил вокруг запросов на этом порту и какие методы допустимы для него.

Это не отличное решение, но, вероятно, это наиболее целесообразно, учитывая ситуацию.

Я указал на мои исследования на стороне CF вещей в комментарии к вашему первоначальному вопросу, но, вероятно, лучше быть связанным здесь: " Web проблема безопасности сокетов: оценка риска и выводы"

Ответ 3

Функция вызова ColdFusion 10 для websockets кажется мне нарушенной после фактического тестирования и дальнейшего изучения новых страниц документации и других проектов (эта вещь сложная!). Я потратил более часа, пытаясь заставить что-то выполнить до запуска запущенной функции. Я не могу!

Здесь описаны новые функции прослушивания канала: http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d318518767eb3aa135858633ee-7ff9.html

Однако в документации четко указано, что функция "invoke" не имеет функции прослушивания. Также появляется Application.cfc, или cfc-прослушиватель вообще не выполняется при каждом запросе при запуске вызова.

Это кажется ошибкой дизайна. Языку требуется больше прослушивателей событий или вы не можете использовать веб файлы без добавления безопасности для каждой функции вашего приложения.

Безопасность внутри каждой функции может быть выполнена, как и код ниже, но не очень удобно изменять каждую функцию в приложении:

<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 и использовать регулярные выражения для проверки информации о запросе, чтобы только открытая часть вашего приложения была открыта на общедоступном порту websocket. Nginx 1.4+ теперь поддерживает проксирование websocket: http://nginx.org/en/docs/http/websocket.html Примечание. Я еще не тестировал прокси-сервер nginx. Если это сработает, это будет намного проще.

Ответ 4

Конечно, не угроза безопасности для Javascript или любого другого клиента, чтобы иметь возможность вызывать любой общедоступный метод для любого CFC. Это ожидаемое поведение интерфейсов, которые вы выбираете для публикации как общедоступные. Чтобы решить эту проблему, команда ColdFusion должна вернуться к своему оригинальному дизайну Websocket и переделать ее.