Rubyのこのビットに遭遇したばかりです。これは、携帯電話のキャッシュから取り出されたSnapchat写真を復号化するために使用できます。明らかに here から改作されています。驚いたことに、 Snapchatのセキュリティに関する最近よく知られている問題(ほとんどの場合、電話番号/ユーザー名全体のリークは私の記憶にある限り)を考慮して、問題なく動作しました。
require 'openssl'
ARGV.each do|a, index|
data = File.open(a, 'r:ASCII-8BIT').read
c = OpenSSL::Cipher.new('AES-128-ECB')
c.decrypt
c.key = 'M02cnQ51Ji97vwT4'
o = ''.force_encoding('ASCII-8BIT')
data.bytes.each_slice(16) { |s| o += c.update(s.map(&:chr).join) }
o += c.final
File.open('decyphered_' + a , 'w') { |f| f.write(o) }
end
ですから、私の質問は、彼らがここで何を間違っているのか、そしてこの点に関してアプリケーションのセキュリティを向上させるために、彼らが今していることよりも何をより良くしているのかということです。 1人だけに10秒を超えて共有することを意図したものではなく、このアプリの人気を考慮しましたか?
tldr /コンピュータがどのように動作するかを本当に知りたくないが、何が起きているかを知りたいすべての人のために:基本的に、あなたが持っているとしましょう- 4000万人 Snapchatを使用するユーザー。1650万人のユーザーが相互に写真を送信し、それぞれの写真は小さな専用の金庫に保管されています。では、1650万人全員に同じ薄っぺらなプラスチックキーを与えて、これらすべてのロックボックスを開いてSnapchatメディアをキャプチャするとどうなるでしょうか。
これはパスワード管理における深刻な問題です。ここで最初の問題は、彼らがソースコードで彼のキーを管理する方法です。 SnapChatは、暗号化された写真をインターネット経由で送信することを述べており、結局のところ本当ですが、「事前共有」キーを使用してこのデータを暗号化しています( ECBモードでAESを使用することも悪い )。 、地球上のすべてのユーザーが各写真を解読する鍵を持っています。
ここでの問題は、インターネットがどのようにキーを取得したかです。ケーキ、すべてのアプリに含まれているだけです 誰かが検索しただけ 。
Snapchatアプリで使用されているこの魔法の暗号化キーは何ですか?
M02cnQ51Ji97vwT4
これは(Androidアプリ内)にある定数文字列にあります
com.snapchat.Android.util.AESEncrypt;掘る必要はありません、それは
文字通り誰でも見つけられるのを待っているところに座ってください。3.0.4(2013年8月18日)ビルドのより肯定的なノート(おそらく)
Androidアプリの場合、奇妙なことに、2つ目のキーがあります!1234567891123456
ソースにパスワードをハードコーディングすることは非常に悪い習慣です(ヘッダーにあるかバイナリにあるかに関係なく)。簡単な "strings"コマンドを使用してバイナリに誰かがそれを見つけることができるという主な問題( または、コードを友達と共有するために使用した場所を調べることにより ):
strings binaryFile
次に、悪意のあるユーザーは各文字列を調べて、それが探しているパスワードであるかどうかを確認できます。したがって、コードでパスワードをハードコードする必要がある場合は、パスワードを非表示にすることをお勧めしますが、これは単に「 obcursityによるセキュリティ 」となり、悪意のあるユーザーがキーを見つけることになります(したがって、別のアプローチで)。
セキュリティを改善するために何ができますか?写真ごとにキーを生成したり、写真や公開/秘密キーを共有するクライアント間でキーを事前共有したりできます。たくさんのオプションがあります。
これは情報理論の基本原理だからです。
マシンが情報を解読して10秒間保持できる場合、その情報を解読して永久に保存できます。
これを偽装する試みは、単に煙と鏡です。
コードは暗号化を「解読」していません。
アプリケーションをリバースエンジニアリングして取得した正しい暗号化キーでデータを復号化するだけです。
彼らはどうすればもっと上手くできるでしょうか?暗号化キーをハードコードしないでください。
完全に安全であるとは想定されていないからです。 Snapchatは共有用であり、保護とは正反対です。
彼らは自分たちのモデルに「十分」なセキュリティであると考えるものを実装したと思います。人々はいつでもアナログの穴から写真をコピーできるので、写真が数秒以上続くことをあまり心配していません。この暗号化により、ユーザーはファイルを保存して友達に見せることができなくなり、少し余分な作業を行う必要があります。この簡単な手順で、写真の99%以上が十分に保護されます。
意図的に。行数は関係ないと思います。また、言語が関連しているとは思いません。
単純化された質問は、「なぜ誰もがこれらを解読できるのか」です。答え-それが意図だったからです。
暗号化された.pdfがパスワードとして4文字の辞書ワードとともに送信されることが多いのと同じように、暗号化はリップサービスのみである可能性があります。
セキュリティはありますが、トークンのレベルによっては回避できます。素人は手がかりがありません。私たちはよく知っています。 (私たちスノーデンの世界では、SSLで保護されたWebサイトを信頼できるかどうかはわかりません。)
要するに、それは暗号化された送信の約束を満たすプラスチック製の南京錠です。
「だから、私の質問は、彼らがここで何が間違っているのか」
それは簡単です。彼らは、テクノロジーに慣れていない人々に誤った安心感を助長していますtrustプライベートと見なされる情報を知らない人に送信します。 。
それがデザインの本当の欠陥です。
これを行うためのより便利な方法を作成する代わりに、彼らはよりスマートな世代の育成を支援するか、またはインストールを免責するだけで、自分で負った犠牲者が反則することができないようにします。
インターネット通信には確実で実証済みの暗号化および送信方法があり、最終的な目標は、セキュリティが必要な場合はセキュリティを確保し、傍受、再配布、および不適切なコーディング方法の可能性が必要な場合は、最もホットなものをダウンロードすることです。今週のアプリストア...
セキュリティは便利ではなく、一般的に面白くなく、簡単でもありません。夜のアプリでハエを殺すすべてのもの。
個人的には、開発者が個々の攻撃に対して大量にアクセスできることにもっともっと気をつけたいと思います...
Snapchatの問題は、実際には[〜#〜] drm [〜#〜]が必要であるにもかかわらず、プレーンクリプトを実行していることです。後者には、単にデータを暗号化する以上のトピックが含まれます。たとえば、ユーザーからキーを隠す必要があります。彼らはこれに失敗したようです。
悪い慣行と減価されたセキュリティ標準を組み合わせることで、この脆弱性が開かれました。特にSnapchatの'mission'を指定すると、画像やテキストなどを再現できず、一度だけ表示できるため、起動ごとにランダムにPSKを生成し、その間PSKを使用する方がより良い方法でしょう。アプリが実行されているため、再起動するたびにデータが役に立たなくなります。そして、はい、他の多くの人が言ったように、アプリケーションのコードに直接セキュリティキーをハードコーディングすることは、非常に非常に悪い習慣であり、簡単に回避できます。
要約すると、この問題を簡単に解決するには:
ランダムに生成された文字列(およびより優れた暗号化アルゴリズム。ただし、この不適切な選択は、プロセッサ要件が低いことや、スマートフォンに日付を付けている可能性が高い主な対象読者[若者]に多少関係している可能性があります)をSSL事前共有キーとして使用します。起動のたびに循環し、アプリの再起動時にキャッシュを無効にします。
本当に簡単に解決できます。彼らはセキュリティのベストプラクティスに関するいくつかのコンサルティングでできるように聞こえます。
それで、私は彼らのサポートで尋ねたこの質問に答えるためにスナップチャットを呼び出し、代わりにこれを得ました。それで、数日後、サポートリクエストに対するSnapchatの正式な返信がここにあります。この投稿にリンクしていて、この質問への正直な返信で相手を検討できるかどうか尋ねています。私は個人的に、これはほとんど何も得ることができなかった最も弱い応答であり、セキュリティ慣行の機能不全の考慮の兆候であり、広報は言うまでもありません。
Team Snapchat replied:
Hi Dmitri,
Thank you for sharing your concerns. We remain committed to maintaining
the security and integrity of the Snapchat community.
Best,
Tobias
ありがとう、snapchat!