フェイスブックの投稿を保護するため、Datarmineを試してみました

先日、Datarmineというすばらしいブラウザエクステンションを試してみました。このブラウザエクステンションの目的はソーシャルネットワークの投稿を保護することです。フェイスブックやツイッターなどに使えます。投稿が暗号化され、シークレットキーを持つ人のみがそれを解読できるというわけです。その他の人は代わりの偽投稿を見ることになります(その投稿は自分で選べます)。

これがDatarmineで暗号化された投稿です。解読の権限を与えられていない人たちに表示されるテキストはエンドユーザーが選びます(このフランス語のテキストは「私はDatarmineを試しているところです」という意味です)。

これが上のメッセージを解読した本物の投稿です。

フェイスブックの投稿の暗号化に関する2010年の私の記事のことは誰も覚えていないと思いますが、基本的に考え方は同じです。Datarmineブラウザエクステンションのほうが、うんと使いやすくなっています。GPGを使う必要や、公開鍵とプライベートキーを使い分ける必要や、暗号作成法について理解する必要はまったくありません。Datarmineで使うのは1つのシークレットキーだけです。それを渡す人を自分で決めるだけです。チュートリアルビデオがいろいろと提供されていますので、DatarmineのWebサイトをご覧ください。

「でも、フェイスブックにはすでに投稿者が自分の投稿にアクセスできる人を選択できる機能がありますよね?」

その通りですし、その機能は私も良いと思っています。しかし、それはフェイスブックが提供しているサービスです。フェイスブックのサーバがもしセキュリティ侵害を受けたらどうなるでしょうか?サーバ側の脆弱性、バグ、そして悪名高きKoobfaceのようなワームのことを考えてみてください。このような状況でもあなたのデータは安全でしょうか?そうとは言えません。そんなことは起こりえない、とは言わないでくださいね。常に起こりえますし、すでに起こっているわけですから(フェイスブックに限ったことではありません)もしフェイスブックが第三者企業へあなたのデータを売り、それがあなたの信用していない企業だったら? つい先日のNSAとPRISMのプライバシー問題は言うまでもありませんね。

そのためにDatarmineを使うのです。Datarmineは投稿が「クラウド上」に格納されていても、その投稿を保護してくれます。Datarmineを使えば、フェイスブックは(ツイッターや他のソーシャルネットワークも)、まったくの他人のようなものです。つまり、フェイスブック側も投稿を読むことはできないというわけです。

しかし、セキュリティを当たり前だと考えるのはやめましょう。私はリバースエンジニアなので、自分で調べてみたいと思います。

下がDatarmineのHTTPプロトコルの図解です。

DatarmineのHTTPプロトコル
DatarmineのHTTPプロトコル

Datarmineは新たなコンセプトを取り入れており、それを「インセンティブ」と呼んでいます。インセンティブとは「偽投稿」のことです。シークレットキーを持たない人たちが本物の投稿の代わりに見るテキストのことです。幸いなことに、Datarmineのエンドユーザーはどのインセンティブが自分の投稿の代わりに使われるかを自分で決めることができます。インセンティブのカタログ(スポーツ、ニュース、慈善など)から選ぶ(そしてカスタマイズする)ことができるのです。

最初の2つのリクエスト(getIncentiveとfind_by_user_id)が投稿に使うインセンティブを処理するものです。1つ目のリクエストがデフォルトのインセンティブを読み出し、2つ目のリクエストがDatarmineのアカウントで私が選択した特定のインセンティブのソースを読み出します。

投稿の準備ができたら、HTTP POSTを介してDatamineのサーバー(publishNew request -下記画像参照)に送信されます。このパケットには私のユーザーID、投稿を読む権限を与えられた人(Robin Wood)、暗号化された投稿(暗号パラメータとともに)、そして使用するインセンティブが含まれています。

Datarmine で新たな投稿を作成する際のHTTPパケットのキャプチャ
Datarmine で新たな投稿を作成する際のHTTPパケットのキャプチャ

Datarmineのサーバから使用するインセンティブが送り返されます(JSONオブジェクト内)。インセンティブの最後に、http://wate.at/2209のようなリンクが付けられています。このリンクは実際にDatarmineの情報ページにつながりますが、末尾の識別子が特に重要です(2209)。なぜならこれが各投稿の参照コードになるからです。投稿にはそれぞれ新たな識別子が付けられます。この識別子はDatarmineエクステンションが暗号を解読して正しい投稿を表示するために必須なのです。

最後に、権限を与えられたユーザーがDatarmineで処理された投稿を見る際、HTTP POSTリクエストが投稿の識別子(tids)とともにユーザーのブラウザからDatarmineのサーバへ送信されます。Datarmineはサーバ上で暗号化された正規の投稿をフェッチし、それをユーザーのブラウザへ送り返します。投稿はローカルで(ユーザーのホスト上で)解読されます。暗号パラメータがいくつか使われています。

  • IV: 入力ベクトル
  • ks: 鍵サイズ - 128ビット
  • ts: これは何かわかりません。
  • mode: CCM、つまりCBC-MACがあるカウンタ。これはブロック暗号化モードです。
  • adata: 追加認証されたデータ。これはCCMのパラメータです。認証はされていますが、暗号化はされていないデータを含みます。今回のケースには使われていません。
  • cipher: AES。有名なブロック暗号。
  • iter: おそらくイテレーション(1000)のこと。しかし、これが何に使われているのかはわかりません。CCMカウンタではありません。
  • salt: 確かではありませんが、このsaltはAESブロック暗号の鍵をつくり出すためにシークレットキーと組み合わせて使われているのではないかと思います。
  • ct: サイファテキスト
  • author: このエントリーを投稿した人物のユーザー名

このリバースエンジニアリングから私たちは何を学ぶのか?

  1. Datarmineで処理された投稿はローカルで暗号化されます。暗号化されたテキストのみがインターネット上で送信されます。いいですよね。CCMモードでAES-128が使われています。Datarmineの開発者は慎重に投稿ごとに異なるIV(入力ベクトル)を使用しています。これがCCMモードのセキュリティの条件だからです。これも嬉しいですよね。IVが変更されること以外は、メッセージが正しく暗号化されているのか、どこで、どのようにシークレットキーが保護されているのかはまだ確認していません。これはなるべく近いうちに行うつもりです。
  2. ネットワーク上でスニッフィングを行うスパイは誰が投稿しているのかを見ることができます。ユーザーIDはいくつかのパケットとともに送信されていますし、author nameはreadパケットへの返答に含まれています。スパイは誰に対して投稿しているのかも見ることができます。権限を与えられたエンドユーザーのリストがpublishNewのパケットで、クリアテキストで送信されているからです。プライバシーの観点からすれば、これは修正すべきでしょう。
  3. Datarmineのサーバがダウンしたら、投稿の暗号を解読することはできません。暗号化された投稿はHTTPリクエスト「read」への応答として送り返されるからです。Guillaume Lovet(本ブログのテクニカルエディター)によると、Datarmineではインセンティブ内に暗号化されたメッセージを隠したほうが良いだろうということでした。そうすれば、投稿を読む際にDatarmineのサーバへ接続するは必要なくなるからです。さらに、外部の閲覧者(http://wate.atのリンクを容易に見つけることができる)に対しても投稿が暗号化されていることがわかりにくくなるだろうということでした。興味深い提案ですね!
  4. 私の理解では、Datarmineで処理された特定の投稿を読める人を限定するのは、2つの段階で行われています。1つ目が暗号法であり、シークレットキーが必要になります。2つ目がアクセスレベルであり、投稿を読むには権限を与えられなければなりません。権限を与えられたさまざまなユーザーがpublishNewのPOSTリクエストのauth fieldに明記されています。読む資格のない投稿を読もうとすると、サーバがHTTP 500エラーで応答します。
    $ wget -post-data='user_id=7777&tids=%5B2209%5D'
    ...
    HTTP request sent, awaiting response... 500 Internal Server Error

しかし、アクセスレベルによるセキュリティは暗号法によるセキュリティよりもかなり弱いものです。シークレットキーを手に入れ、何らかの方法でサイファテキストを入手することができれば(例えば、ネットワーク上で権限を与えられたユーザーへのパケットに対してスニッフィングを行うなどして)、実際には投稿を読むことができます。このアクセスレベルのセキュリティはあまり当てにしないほうがいいですね。投稿する時は、シークレットキーを持っている人なら誰でもその投稿を読むことができるだろう、ということを心に留めておいたほうが良いでしょう。

Datarmineエクステンションは現在、Chromeでしか利用できませんが、Datarmineの開発者は他のブラウザのエクステンションも現在開発中だということです。

- Crypto Girl