
注記: このバグは Freenet チームに完全に開示し、パッチの検証にも協力しました。パッチは最新版の Freenet に導入済みです。
私は最近、Freenet において、攻撃者が対象を非匿名化したり、悪意のある文書を Freenet 経由で送信したりできる可能性があるセキュリティ脆弱性を発見しました。
この脆弱性は、ブラウザーとして Firefox を使用している Freenet ユーザーに影響します。ユーザーのコンピューター上での非匿名化やその他の悪意のある動作を可能にします。1483 までの全バージョンに存在します。
このエクスプロイトは、MIME タイプの処理における Firefox と Freenet の食い違いを悪用します。Freenet には多くの異なるコンテンツタイプに対するフィルターが同梱されており、整形式でスクリプトを含まないコンテンツのみが、ユーザーへの多数の警告なしにレンダリングされるように、多大な努力が注がれています。
Freenet は一般に、データを本来の方法で処理し、ユーザーが別の方法で処理したい場合にはそれを指定できるようにする、という良い仕事をしています。
一方、Firefox はファイルの MIME タイプを決定する方法がもう少し複雑です。具体的には、ここに文書化されています。このページに文書化されているプロセスのほとんどは、攻撃者の制御を超えています。特に、Freenet 経由で攻撃する必要がある場合はそうです。しかし、攻撃者の制御下に_ある_ものの 1 つは、挿入されるデータの MIME タイプです。データが Freenet ネットワークに挿入されるとき、ユーザーは MIME タイプを指定できます。このフィールドが null のままの場合、データは application/octet-stream として扱われ、警告に関して適切な処理をすべて受けます。
しかし、Mozilla のドキュメントの HTTP セクションに進むと、コンテンツを提供するアプリケーションが特定の条件を満たしていない場合、Firefox がデータの MIME タイプについて独自の推測を行っていることがわかります。具体的には、アプリケーションが Content-Encoding ヘッダーを送信しない場合、Firefox は実際にコンテンツをスニッフィングして、どう処理するかを決定します。データの最初のブロックがテキスト以外の場合、Firefox はファイルを拡張子によって示される MIME タイプとして扱います。
Freenet が応答でこのヘッダーを送信していなかったことが判明し、これを利用可能なものに変えることができます。データは MIME タイプ text/plain として挿入できるため、明らかに高度なフィルタリングは受けませんが、ファイル拡張子によって示される任意の MIME タイプとして配信できます。これにより、フィルタリングされていない HTML ドキュメント(または PDF、.docx...)を配信する方法が得られます。これは重大な問題です。通常、危険なコンテンツはすべて、フォルダーまたは一時領域にダウンロードし、ブラウザーの外で開くことが推奨されるからです。
これはエクスプロイトが動作している簡単なビデオです。この場合、フィルタリングされていない HTML ファイルを配信します。
動作例については、1483 以前をインストールして、次の URL にアクセスしてください。
ご自身で試される方は、最新の脆弱性のあるバージョンの Freenet をここから入手できます。
では、これを現実の世界でどのように利用できるでしょうか?
ユーザーがすでに閲覧している Freenet 内のページに悪意のあるコンテンツへのリンクを張ると、Freenet はファイルを拡張子で示されるタイプとして確実に処理することがわかります。Freenet は最初のデータがバイナリであることを検出し、ファイルが悪意のあるものであるとユーザーに警告します。
:(
つまり、ターゲットに JS を含む悪意のあるページを閲覧させたい場合は、外部からリンクする必要があります。これは実際には問題ありません。Freenet で最も人気のあるメッセージングシステムは、Freenet の Web プロキシからは動作しないからです。
たとえば、この記事のデモ URI が FMS 内でリンクされた場合、追加のチェックは行われず、ペイロードを実行させることができます。
多数の Freenet ユーザーを非匿名化するために必要なのは、興味を引くタイトルのコンテンツを作成し、最初のデータブロックをバイナリにしたファイルを挿入し、バックグラウンドで IP アドレスとアクティビティを静かに報告する説得力のある Web ページを作成することだけです。これを BeEF フレームワークのようなツールセットと組み合わせれば、興味深い機会が得られます。
もちろん、これを悪意のある PDF、.docx、その他のファイルを配信するベクターとして使用し、ユーザーのマシンにより永続的な足がかりを得ることもできます。
このバグの修正は非常に簡単です。今後、FProxy はコンテンツを配信するときに常に Content-Encoding HTTP ヘッダーを渡します。このヘッダーは、Firefox ブラウザーに、FProxy が定義する MIME タイプを明示的に処理するように指示します。その結果、text/plain タイプのデータは_常に_プレーンテキストとしてレンダリングされ、他の MIME タイプとして扱われることはありません。
このバグは、全体としてかなり単純なものでしたが、Freenet の機能に大きな影響を与える可能性がありました。MIME タイプのチェックは非常に重要であり、このバグから学ぶべき大きな教訓は、データがあるプログラムから別のプログラムに渡されるとき、MIME タイプが常に一貫した方法で処理されるとは限らないということです。
MIME タイプを text/plain にし、最初のブロックにバイナリデータのみを含むデータを Freenet に挿入するだけです。Firefox はそれをファイル拡張子が指定する任意のタイプとして扱い、Freenet によるフィルタリングを受けずにユーザーに直接配信されます。これを FMS または Frost で被害者に送信します。被害者の IP アドレスを収集するか、バイナリペイロードを実行させます。儲けましょう!