Может ли веб-страница обнаружить пользовательский скрипт тампера? - PullRequest
8 голосов
/ 30 июня 2019

Мой вопрос вроде двоякий. Сначала , как работает модель песочницы, как она влияет на сценарий пользователя, что доступно / просматривается с точки зрения веб-страницы и сценария пользователя, и если использование другой модели песочницы влияет на страницу, способную заметить ваш сценарийвводится на страницу (или нет). Второй , как скрипты внедряются в страницу, и может ли страница обнаружить это?

Первый

Из того, что я вижу, когда выиспользуйте @grant none, песочница отключена, и у вас будет доступ к веб-странице и ее javascript.Если вы вносите какие-либо изменения в javascript и / или DOM, это возможно обнаруживается по странице.

Насколько я понимаю, если вы используете @grant unsafeWindow, ваш скрипт будет изолирован в своем собственном контексте js, что угодноВы делаете, чтобы window НЕ был виден веб-страницей, НО вы можете получить доступ к веб-странице и javascript через unsafeWindow.У вас будет регулярный доступ к DOM, например, document возвращает документ обычной страницы, а не вам нужно сказать unsafeWindow.document.Очевидно, что любые изменения, внесенные вами в контекст DOM или страницы js (например, unsafeWindow.foo = 'bar';), все равно будут обнаруживаться.Причина этого unsafe не в том, что он обнаружен или нет, а в том, что вы потенциально можете предоставить ненадежной странице доступ к привилегированным функциям GM_* в этом режиме (которые не предоставляются в обычном режиме, что означает, что@grant GM_* для любой функции изолирует контекст js, и вы потеряете доступ к контексту js страницы, если вы не @grant unsafeWindow)

Второй

Какскрипты впрыскиваются на страницу?Возможно ли, что веб-страница может заметить инъекцию usercript (при условии, что скрипт user НИЧЕГО не изменяет на странице).

Например, , если скрипт был внедрен с использованием тега script, я думаю, что страница могла заметить внедрение скрипта, даже взглянуть на его код?

Играет ли модель песочницы какую-либо роль в том, как это происходит, и делает ее "более безопасной", чтобы ее не видели?Например, если контексты js изолированы, если вы используете @grant unsafeWindow, то, возможно, js на веб-странице даже не увидит никакого события загрузки пользовательского скрипта, что делает @grant unsafeWindow существенно более безопасным, если вы не измените DOM или unsafeWindowконечно.

Я также предполагаю, что нет утечки специальных функций, объектов, свойств и т. д. (например, GM_info на веб-страницу, которая выдала бы существование tampermonkey?).Ни в режиме @grant none, ни в режиме @grant unsafeWindow (при условии, что вы ничего не пропустили на страницу)

Это позволяет мне чувствовать, что unsafeWindow на самом деле безопаснее с точки зрения того, что его не обнаруживают (потому что jsконтексты изолированы), пока вы не изменяете что-либо (и особенно НЕ открывайте привилегированные GM_* функции для unsafeWindow). Например, , если вы использовали eventListener в режиме @grant none, он может быть обнаружен, но если вы используете его в режиме @grant unsafeWindow, он может не быть обнаружен из-за изоляции?Кроме того, если бы страница могла обнаружить загрузку пользовательского скрипта (я не знаю, возможно ли это на самом деле), она не знала бы, изолированные ли контексты js

В кратком изложении, может ли страница обнаружить существование вашего пользовательского скрипта или тампона, если вы его не предадите?

Являются ли какие-либо из моих вышеупомянутых мыслей неверными в каких-либоплощадь, и если да, то как это на самом деле работает?

Обновление

Небольшая информация для уточнения:

Пользовательский скрипт только пассивно считывает информацию со страницы (возможно, используя MutationObserver). Он ничего не изменяет, не использует библиотеки js (ни из скрипта пользователя, ни с веб-страницы), ни по вызовам ajax, ни по узлам скрипта, ни по определению, ни по щелчкам и т. Д. Скрипт МОЖЕТ прочитать некоторую информацию из JS-переменных страницы (предположим, что эти переменные и функции не заминированы), а также с помощью WebSocket (внутренняя служба). Использование IIFE тоже. Таким образом, вопрос, в основном, заключается в том, можно ли обнаружить tampermonkey сам по себе (и если он запускает скрипт страницы)?

В этом ответе: https://stackoverflow.com/a/8548311 Я могу исключить 1, 4, 5, 6 и 7; вероятно, 2 и 3, но я не знаю, повлияет ли сам по себе тампермонк какой-либо из этих

Ответы [ 2 ]

3 голосов
/ 15 июля 2019

Как указано в ответе https://stackoverflow.com/a/8548311, если вы делаете что-то подобное , это определенно можно обнаружить. Но, в зависимости от того, что вы хотите сделать с помощью скрипта tampermonkey, это будет легчеили более трудно обнаружить, а в некоторых случаях невозможно .

Из того, что вы просите, кажется, что вы хотите сделать, просто вызвать IIFE со страницы и просто остановитьтам, «скажем, он просто читает информацию».

Это действительно сложно записать, и обычно для этого страница должна сравнивать профилировщики и время выполнения и других пользователей с вами или некоторыми другимиПричудливые вещи, и не существует простого способа узнать, выполнил ли пользователь дополнительный JS на странице (если вы используете IIFE) с NO SIDE EFFECT .Я не говорю, что это на 100% необнаружимо, но допустим, что это действительно сложно.

Если вы собираетесь модифицировать DOM, делать вызовы API для внешней или внутренней службы, поддельные движенияпользователь или другие вещи такого рода, , которые вы будете обнаружены .Таким образом, это зависит от того, что вы хотите сделать со страницей, но вы можете быть обнаружены «довольно легко».

В кратком изложении, может ли страница обнаружить существование вашего usercript или тампера, если выне предаешь?

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

2 голосов
/ 16 июля 2019

Браузеры и Greasemonkey / Tampermonkey / Violentmonkey (в основном) улучшили, как они делают инъекции, область видимости и песочницу.Пользовательские скрипты не вводятся с использованием обычных тегов <script> (хотя вашему сценарию может потребоваться создавать такие теги в некоторых случаях).

На самом деле, в настоящее время почти нет необходимости использовать IIFE .

Но, в дополнение к методам обнаружения в ранее связанном вопросе :

  1. В режиме @grant none, , если вы @require библиотека, которая копирует себя в window scope , страница может увидеть это.Большинство библиотек этого не делают, но одна из них - jQuery .
  2. Tampermonkey фактически предоставляет версию установленного скрипта для сайтов, которые внесены в белый список в расширенных настройках.Это в основном для хостов скриптов, таких как greasyfork.org.
  3. Я не знаю, может ли страница обнаружить WebSockets, используемые в скрипте пользователя.Я сомневаюсь в этом.

Итог: для пользовательского скрипта "только для чтения" , который не require глобальные библиотеки в режиме @grant none, страницане может его обнаружить.
(Если на странице не указано greasyfork.org и т. д., а для параметра Allow communication with cooperate pages установлено значение по умолчанию.)

Если вы обнаружили утечку, при которой страница может обнаружить «пассивный» скрипт, сообщите нам, и есть вероятность, что он может быть подключен.

...