возможно ли снижение привилегий в Javascript?

Интересно, можно ли сбросить привилегии в Javascript?


function takeAwaySetTimeout()
{
  var oldSetTimeout = window.setTimeout;
  window.setTimeout = function()
  {
    console.log("not working anymore!");
  };
}


setTimeout("console.log('this works');",0);  // "this works!"
takeAwaySetTimeout();
setTimeout("console.log('this works');",0);  // "not working anymore!"

к сожалению, мне это кажется сложным, так как простой delete window.setTimeout вернет привилегию! Так что для меня это кажется показательным к тому факту, что, к сожалению, Javascript не предусмотрел отнятые привилегии.

Я знаю, что термин привилегия несколько заимствован. Это предыстория вопроса о том, что я мог бы представить себе любую возможность рабочего удаления [Native Code] function (= что метод .toSource() указывает на его функцию, предоставляемую движком javascript) от доступности в какой-то части как способ защитить код, подвергнутый этому ограничение (привилегии отбрасываются) из-за того, что это не является проблемой безопасности.

уточнение

Я приветствую вашу просьбу о большей ясности и надеюсь, что вы ответите на нее ответственно и снимете "свободный" вопрос! Также обратите внимание, что получение уже двух полезных ответов показывает, что есть люди, которые смогли понять вопрос. Тем не менее, конечно, если это возможно (что-то просто нужна предыстория....), я также стремлюсь к расширению понимания.

«Немного неясно, как ограничение доступа к нативным функциям повысит безопасность. Это серверный или клиентский JavaScript?»

1) не имеет большого значения, на стороне клиента или на стороне сервера. Может быть, чуть-чуть важнее кажется, конечно, на стороне сервера. Поскольку, вероятно, существует больше функциональных возможностей (например, запись в файлы, доступ к файлам...), больше, чем, возможно, сможет сделать более ограниченный Javascript внутри браузера (но учтите мощь нового API... и риски!)

2) возможно, выбор для window.setTimeout() [собственная функция] не идеален (для ясности), так как, возможно, не очевидна прямая связь безопасности. Он был использован, потому что он хорошо известен и является заполнителем. см. (3)

3) я полагаю, что каждая функциональность, предоставляемая коду Javascript, амбивалентна. С другой стороны, за, это обогащает "что он может сделать?" положительно и из лучших побуждений код будет использовать его ответственно. Тем не менее, с против, функциональность может означать доступ к вещам, которые при злоупотреблении могут вызвать проблемы, связанные с безопасностью. Примером может служить внешний Javacript, который будет выполнять XHR и отправлять информацию на сервер, потенциально данные, которые имеют личные данные (т.е. состояние здоровья клиентов). Если бы тогда, например, можно было забрать объект XHR лучше window.XMLHttpRequest, шансы на такое злоупотребление были бы ограничены. Откровенно "нельзя стрелять в кого-то, не имея ружья!". Например, XHR (может быть, яснее, чем setTimeout) является таким оружием. Если «ненадежный код» на самом деле не нуждается в XHR, то разумно отказаться от риска, отказавшись от этой привилегии/функции.

4) Я думаю (также в контексте ответов) этот вопрос эволюционировал. Я думаю, что это ясно, но, пожалуйста, напишите комментарий, если это не так. Хотя изначально Юхана сказал:

Это немного неясно[...]

Я понимаю, что это не было полностью неясным, и, следовательно, теперь оно могло быть достаточно ясным (пожалуйста, рассмотрите полезные ответы), чтобы можно было «отложить» / «освободить Вопрос». Кроме того, если вы нашли вопрос достаточно интересным, чтобы придержать его, то сейчас самое время найти его достаточно интересным, чтобы проголосовать за него ;)


person humanityANDpeace    schedule 18.12.2013    source источник
comment
Немного неясно, как ограничение доступа к нативным функциям повысит безопасность. Это серверный или клиентский JavaScript?   -  person JJJ    schedule 18.12.2013
comment
Спасибо. На стороне сервера (хотя и не желая ограничивать его этим) предоставление доступа к fs = require("fs"); или требованию сделает невозможным внесение изменений в файловую систему любыми затронутыми частями кода. Поскольку некоторый код даже не нуждается в этом, это снизит риск. Я предполагаю, что этот код (после потери привилегии) ​​не мог создать поток для файлов.   -  person humanityANDpeace    schedule 18.12.2013


Ответы (2)


Есть так много способов получить исходную функцию, и черный список не может работать, потому что вы пропустите что-то, например.

Window.prototype.setTimeout.call(window,'alert(1)');

Одним из решений этой проблемы является создание песочницы из белого списка. Я создал такую ​​песочницу под названием MentalJS. Эта песочница переписывает весь ваш код с суффиксом $, например, предупреждение (1) становится предупреждением $ (1), что позволяет вам выбирать, какие функции/объекты разрешены в песочнице.

Код доступен здесь: http://code.google.com/p/mentaljs/.

и демо: http://businessinfo.co.uk/labs/MentalJS/MentalJS.html

person Gareth Heyes ล้้้้้้้้้้้้้้้้    schedule 18.12.2013
comment
Вау, отличная идея! Конечно, этот белый список интересен, и способ (гениальный разбор кода, который возможен в скриптовом языке!) великолепен! ... Имея, как кажется, больше, чем другие, занимающиеся этим аспектом безопасности ... можете ли вы придумать вескую причину, по которой нет простого delete window.setTimeout способа решения проблемы? .... Может быть, вы могли бы даже обогатить ответ, указав кто пришел ваш интерес к этой песочнице. - person humanityANDpeace; 18.12.2013
comment
Поскольку существует так много способов получить исходный код, как показано выше, вы ведете бесконечную войну, в которой не можете победить, одна ошибка, и ваш черный список будет обойден. Другой простой способ получить исходный setTimeout — использовать, например, iframe. Использование функций ES5, таких как defineProperty, может упростить блокировку функций, но опять же, это черный список, и требуется только одна утечка. - person Gareth Heyes ล้้้้้้้้้้้้้้้้; 18.12.2013
comment
Спасибо за уточнение. Я убежден в преимуществе белого списка над черным списком в достижении надежной ситуации с наименьшими привилегиями... Что я на самом деле хотел спросить, так это то, не обогатили бы вы, если бы в ES была функциональность для надежного белого/черного списка (следовательно, устаревание разбор). Я должен начать тестировать MetalJS, на который вы ссылались, на прорыв через обфускацию кода. Или с этим риском уже разобрались. Парсинг — это искусство - person humanityANDpeace; 19.12.2013
comment
ES5 не предлагает возможности внесения в белый список, и я поднял эту тему в списке рассылки ES. MentalJS был протестирован множеством хакеров, и парсинг очень силен. Кнопка проверки взлома проверяет все предыдущие эксплойты, чтобы убедиться, что они не повторятся, и до сих пор синтаксический анализ не прерывался какое-то время. - person Gareth Heyes ล้้้้้้้้้้้้้้้้; 19.12.2013

В таких случаях Google использует компилятор Caja. Затем непривилегированный код запускается либо в изолированной программной среде на стороне сервера, либо (в браузерах, поддерживающих ES5) в изолированной программной среде строгого режима на стороне клиента.

person Raphael Schweikert    schedule 18.12.2013
comment
Спасибо за ссылку на этот интересный инструмент. Надо дать посмотреть. Вы используете его? - person humanityANDpeace; 19.12.2013
comment
@humanityANDpeace Я использую его только в скриптах Google Apps (где Google заставляет вас использовать его). Но если мне когда-нибудь доведется работать на портале, который включает в себя виджеты из разных источников, я обязательно рассмотрю возможность его использования. - person Raphael Schweikert; 19.12.2013