JavaScript полностью защищает безопасные переменные

Итак, вот в чем проблема.

У меня есть что-то вроде:

// Dangerous __hostObject that makes requests bypassing 
// the same-origin policy exposed from other code.
(function(){
    var danger = __hostObject;
})();
delete __hostOBject;

Я в полной безопасности, зная, что ни один скрипт не может вмешаться или получить доступ к __hostObject?

(Если они могут, у меня есть уязвимость CSRF или хуже.)

Примечание 1. Это расширение для браузера. У меня лучшие хуки, чем у других скриптов, работающих на странице. Я выполняю перед ними, и я закончил еще до того, как они загрузились.

Примечание 2: я знаю, что об этом несколько раз спрашивали для скриптов в целом. Мне интересно, возможно ли это, если я знаю, что загружаю до любых других скриптов.


person Benjamin Gruenbaum    schedule 15.12.2013    source источник
comment
Я написал пример кода, который перезаписывает Function.prototype.call. (Не стесняйтесь отметить этот пост, если вы действительно думаете, что я помогаю злонамеренным разработчикам. На мой взгляд, потенциальные злоумышленники все равно будут знать эти методы.)   -  person ComFreek    schedule 15.12.2013
comment
@ComFreek Вы забыли return результат oldCall. Но на самом деле это общий принцип, используемый для исправления (встроенных) методов JavaScript.   -  person Rob W    schedule 15.12.2013


Ответы (2)


При условии, что __hostObject можно удалить, код в вашем вопросе безопасен.

Однако я предполагаю, что ваш реальный код немного сложнее. В этом случае требуется очень осторожное кодирование, потому что страница может изменить встроенные методы (например, Function.prototype.call), чтобы проникнуть в ваше закрытие и делать любые злые вещи, которые они хотят. Я успешно злоупотреблял функциональностью фреймворков расширений, таких как Kango и Crossrider, с помощью этого метода, когда проводил такой тест.

person Rob W    schedule 15.12.2013
comment
Ты сегодня очень сообразителен (или удачлив, но я хотел бы думать сообразителен). Это проблема, которая сейчас у нас с Crossrider. Сейчас я тестирую BHO для Internet Explorer, и мне нужно разрешить JavaScript делать запросы, которые обходят политику перекрестного происхождения и/или сохраняют межсайтовые данные в реестре. Обе очень проблемные операции. Я не мог придумать лучшего способа. (Кроме того, если бы вы могли добавить пример кода для такого эксплойта с помощью .call — это было бы действительно здорово). Есть ли надежный способ убить приложение, если что-то вроде .call было подделано? (Запоздало - они могут это сделать _после того, как я тоже загружусь). - person Benjamin Gruenbaum; 15.12.2013
comment
@BenjaminGruenbaum Код для злоупотребления функциональностью тривиален, я не буду публиковать пример кода, чтобы не кормить злонамеренных разработчиков. Я просто пишу ответ на ваш другой вопрос, следите за обновлениями;) - person Rob W; 15.12.2013
comment
Мне жаль, ребята. Я пытаюсь понять проблему и решение, но не могу. Не могли бы вы, ребята, объяснить немного больше? - person thefourtheye; 15.12.2013
comment
@thefourtheye какая проблема и какое решение? Уточните, пожалуйста, какую именно часть вы не поняли. - person Benjamin Gruenbaum; 15.12.2013
comment
@BenjaminGruenbaum Во-первых, ваш вопрос. Я не понимаю сути проблемы :( - person thefourtheye; 15.12.2013
comment
@thefourtheye У меня есть функция, доступная из расширения (она не написана на JavaScript), но мне нужно выполнить ее на JavaScript, так как это то, на чем разработано кросс-браузерное расширение. В то время как браузеры, такие как chrome и firefox, предоставляют песочницы для выполнения, IE (насколько я знаю) не означает, что мне нужно выполнить небезопасный код JS. Мне было интересно, достаточно ли поместить опасный код в замыкание и удалить любую внешнюю ссылку, чтобы предотвратить прикосновение к нему извне (как в коде вопроса). - person Benjamin Gruenbaum; 15.12.2013
comment
@BenjaminGruenbaum Разве вам не нужно было бы просто сохранять каждую ссылку на любую, за пределами доступного закрытия, функцию, которую вы вызываете в своем коде, и использовать ее вместо этого, например, вызовы, сделанные для привязки, применения, конструктора массива и т. д. - person Moritz Roessler; 15.12.2013
comment
@C5H8NNaO4 для каждой функции, которая доступна глобально? Кроме того, мне пришлось бы писать весь код функции в оболочке. - person Benjamin Gruenbaum; 15.12.2013
comment
@BenjaminGruenbaum Для каждой функции, которая доступна глобально, которую вы вызываете в своем коде и где вы передаете ссылки на объекты, где было бы небезопасно, если бы к любому члену можно было получить доступ или переназначить. Единственный способ, которым я могу придумать использование исходной ссылки для вызова, - это временное назначение исходной ссылки непосредственно вызываемой функции из пользовательской функции вызова. Вот простая скрипка - person Moritz Roessler; 15.12.2013
comment
@ C5H8NNaO4 Я предоставил Function.prototype.call просто в качестве примера. А как насчет var data = __hostObject.getSensitiveData();if(data.split(';')[0] == something) { ... }? Обертывание всех возможных вызовов наследования очень громоздко и подвержено ошибкам. Подумайте, какое удовольствие вы получите от исправления сторонних библиотек таким образом? - person Rob W; 15.12.2013
comment
@RobW Конечно. (Ой, забудь предыдущую версию, только что увидел String.prototype.split) Но какие еще существуют способы, кроме обертывания вызовов, где передаются ссылки, которые не должны утекать к пользователю? Либо вам нужно убедиться, что утечка ссылок не даст пользователю больше власти над страницей, которую он изначально имел, либо вам нужно убедиться, что ссылка не утечка, или я что-то упустил? - person Moritz Roessler; 15.12.2013
comment
@ C5H8NNaO4 Объяснение моего комментария: допустим, вы используете стороннюю библиотеку JavaScript, такую ​​как jQuery. Теперь вы хотите убедиться, что вы случайно не утечете доступ к вашему привилегированному API. Как вы собираетесь обернуть все вызовы в jquery.min.js, не нарушая работу библиотеки? , пропускаете звонок или тратите много времени? Я не знаю никакого способа решить проблему, не пожертвовав хотя бы одним из ранее упомянутых пунктов. Если вы хотите продолжить обсуждение этой темы, создайте чат на chat.stackoverflow.com и пригласите меня. - person Rob W; 15.12.2013
comment
@RobW Спасибо за объяснение :) это имеет смысл, так что на самом деле это невозможно, пока вы находитесь в том же контексте выполнения, что и страница. - person Moritz Roessler; 15.12.2013

Простое добавление точки останова и перезагрузка скрипта не выставит ваш __hostObject

person Verneri Åberg    schedule 16.12.2013
comment
Проблема не в самом пользователе, а в других сценариях, которым я не могу доверять. Насколько я знаю, другой скрипт не может этого сделать. - person Benjamin Gruenbaum; 16.12.2013
comment
Хорошо, это звучит правдоподобно. - person Verneri Åberg; 23.12.2013