UserJS。 パート3:セキュリティ

この記事では、いくつかのuserjsトリックの危険性とこの危険に対処する方法について説明します。

シリーズの他の記事:

Liveconnect


この技術の危険性は明らかです。 あるアドレスから高度な機能(たとえば、クリップボードの操作)へのアクセスを許可するとすぐに、このアドレスからのすべてのスクリプトが独自の目的で(たとえば、バッファーの内容をサイトに送信します-突然パスワードがあります)

解決策は、「http://0.0.0.0/」という1つのアドレスへのアクセスのみを許可し、このアドレスでフレームを開き、XDMを介してすべてのアクションを実行することです。 欠点は、すべての呼び出しが非同期になることです。 しかし、なぜ安全のためにそれをしないのですか。 はい、そしてこれにはいくつかのプラスがあります-ページ上のスクリプトは、長い同期呼び出しを見込んでハングしません。

ここで、XDMを保護する必要があります。

Xdm


ページ上の任意のスクリプトは、iframeを見つけてメッセージを送信できます。 メッセージ形式を知っているだけです。 userjsがネットワークに投稿されている場合、見つけることは問題ではありません。 はい、userjsを自分で作成した場合でも、多くの場合、形式を推測するのは簡単です。

そのため、タスクはフォーマットを読み取り不可能にすることです。 これを行うには、次のものが必要です。


機能を保存します


しかし、これでもセキュリティを確保するには十分ではありません。

残念ながら、userjsはページのコンテキストで実行されます。 これは、ページのスクリプトによるオブジェクトのすべての変更がuserjsに反映されることを意味します。

userjsのパスワード検証が次のようになっていると仮定します。
 if(ev.data.substring(0、password.length)== password){...}


次に、ページ上のスクリプトを実行できます。
 String.prototype.substring = function(start、len){alert(this);  }

パスワードを取得します!

userjsの重要な場所で使用される関数を保存する必要があります。
 //スクリプトの最初に。
 var functionCall = Function.prototype.call;
 var stringSubstring = String.prototype.substring;

 //イベントハンドラ内。
 stringSubstring.call = functionCall;
 if(stringSubstring.call(ev.data、0、password.length)== password){...}

Source: https://habr.com/ru/post/J61840/


All Articles