メデューサ、パスポート、たわごとコード-なぜインターネット投票のすべての参加者のパスポート番号がインターネット上で終わったのか

予想外にうまく終わったインターネット投票が長い間続いた後、私と多くの人々は、ロシアでは何かがうまくいかないと感じていました。これでリラックスできます-現実は失望しませんでしたが、ソリューションのアーキテクチャと暗号化の両方に関して、二重の狂気を目にしました。



ところで、テレコムとマスコミュニケーション省は、まだ除外ANY有権者のパスポートのデータの漏洩の可能性。



このようなパスポートのルックスのシリーズの一方、分布:



画像



レッツ・再生イベントとこのすべてが回避されている可能性がどのように理解しよう



どうした?



7月9日、Meduzaの資料が表示され、当局は実際にすべてのインターネット有権者の個人データを公開し、そこでdegvoter.zipアーカイブについて話しました。



degvoter.zipアーカイブを見つけるにはどうすればよいですか?



こんな感じで見つけました。Yandexの通じ慎重な検索がページに私を導いた:

vudu7.vuduwiki.duckdns.org/mk.ru/https_check.ege.edu.ru.html



テキスト「HTTPS checkvoter.gosuslugi.ru degvoter.zipが」そこにいました。当時の日付は2020年7月7日(メデューサの発行前)でしたが、このテキストは既にページの上部に移動しており、日付が変更されています。



アーカイブ自体は州サービスのサイトから削除されましたが、そのコピーはweb.archive.orgに保存され、そこから私を含む研究に関心のあるすべての人がダウンロードしました。これがなぜ起こったかを理解するために、私は州のサービスのウェブサイトにあるrobots.txtファイルを参照することをお勧めします



degvoter.exeの中身は?



degvoterプログラム自体はC#で書かれており、膝の上で書かれたWinFormsアプリケーションであり、sqliteデータベースで動作します。アーカイブ内のファイルの日付は2020-06-30 22:17(2020年6月30日)です。その時点ですでにカムチャッカで7:17であったため、アプリケーションは可能な限り最短の時間で作成されたことがわかります。プロットが8:00に開かれたという事実は、締め切りがこれまでよりも近いことを示しています(電子投票したのは良いことです)モスクワとニジニノヴゴロドのみ)。



パスポート検証コード:



画像



アプリケーションは、アーキテクチャの観点からも暗号の観点からも、最悪のたわごとコードです。そしてそれが理由です:



アーキテクチャの欠陥とパスポート識別子の回復に対する攻撃の原則の説明



プログラムには、numという2つのフィールドがあり、使用されるパスポートテーブルが存在するローカルデータベースが含まれていました。ここで、numはSHA256(<series> + <number>)でした。



非常に多くの場合、関連する経験のないプログラマが暗号の問題に取り組むとき、彼は同じタイプの誤りをたくさん犯します。このようなエラーの1つは、何もハングしないハッシュ関数の使用です。パスポート識別子は、4桁のシリーズと6桁の番号[xxxx xxxxxx]で構成されています。それら。 10 ^ 10のオプションがあります。ちなみに、電話番号も10桁[+7(xxx)xxx-xx-xx]で構成されています。現代のデジタル世界の規模では、これらはそれほど大きな数ではありません。つまり、1 GBは10 ^ 9バイトを超えます。すべてのオプションを記録するには100GBで十分です。あなたはそれらをちょっと整頓することができる可能性が高いです。シングルスレッドモードでは、最新のIntel Core i5プロセッサーが一連のパスポートのすべてのsha256ハッシュを5秒(000000-999999)で反復することを測定しました。そして、これは追加の微調整なしの標準のsha256実装にあります。それら。通常のコンピューター上のすべてのスペースを完全に検索するのに1日もかかりません。複数のスレッドで検索を実行できることを考慮に入れると、平均的なプロセッサーは数時間でそのようなタスクに対処します。これは、システムの開発者がハッシュ関数の使用原理を理解していないことを示しています。しかし、そのようなアーキテクチャでハッシュ関数を正しく使用しても、攻撃者が無制限のリソースを持っている場合は、パスポートデータが公開されることはありません。結局のところ、データベースにアクセスした人は、有限の時間でパスポート識別子を取得できます。限られた時間内に1つのパスポートをチェックする必要があります。全体の問題はリソースに関するものだけです(ただし、数百万回のラウンドでハッシュを適用しただけの場合は、アプリケーションと一緒にデータベースを配布するなどの議論の余地のあるアーキテクチャ上の決定でさえ、このような大きな影響につながらないため、少なくともジャーナリストから身を守ることができます)。メドゥーサは、システムのこの部分を設計した人々の無能さを示しました。



一方でそれをはるかに良くする方法を考えてみましょう。また、一方で、開発の1泊以内にしてください。



膝の上の建築



時間がないため、夜間にソリューションを作成する必要があるとします。

明らかな要件は、パスポートハッシュを持つデータベースがサーバー上にあり、クライアントサーバーアプリケーションでなければならないことです。問題がすぐに発生します。インターネットがサイトで突然故障した場合はどうすればよいですか?これらの目的のために、クライアントアプリケーションのAndroidバージョンを作成する必要があります。これは、PECメンバーにダウンロードするためにも提供する必要があります。インターネットやセルラー通信がない場所では、人々はこの投票に投票しませんでした。



データベース内のハッシュは、パスポートIDから直接計算しないでください。これは、データベースのハッシュをブルートフォース用の既存のテーブルを使用してブルートフォースにできないようにするために行われます。まず、強力なハッシュ関数を使用する必要があります。主な質問は、それをどのように使用すべきかです。ここには多くの可能な実装がありますが、実際にはすべて、3つのパラメータがあるアルゴリズムを使用することになります。ハッシュ関数のタイプ、反復回数、およびハッシュに混合するために使用する必要がある値(すべてのハッシュに共通)です。最後の要件は、各反復内で強力なハッシュ関数を使用する必要があり、ハッシュ計算速度が毎秒数ユニットでなければならないことです。サーバーからデータベースを引き継いだとしても、この場合、攻撃者はすべてのデータを回復するのにかなりの時間を要します。



各クライアントアプリケーションは、単なる入力フィールド+サーバーにリクエストを送信するHttpクライアントになります。



サーバーはHTTPSでのみ、投票中にのみ機能し、IPあたり1 RPSの制限があります。 RPS区切り文字としてRedisを使用します。IPアドレスとTTLをキーとして1秒で書き込みます。値がある場合-IPからの要求は許可されません。値がない場合-IPからの要求は許可されます。これにより、外部からのブルートフォースを回避できます。



このように書かれた、私たちのソリューションは、文字通りたわごとと棒でできており、現在のデグボターよりも桁違いに安全です。同時に、書き込み時間の違いは小さく、コード自体を記述するプロセスは3人(サーバー、win-client、android-client)で並列化できます。



考えられるリークのシナリオを見てみましょう。



システムに関する情報を取得できる次のポイントがあります。



  1. サーバーのソースコード
  2. コンパイルされたバックエンドファイル
  3. サーバーDB
  4. クライアントアプリケーション


この場合のクライアントアプリケーションは情報を伝達しませんが、最大数のユーザーがアクセスできます。これが、リークの可能性が最も高い場所です(発生しました)。



情報を回復するには、ポイント(1,2)または(1,3)から情報にアクセスする必要があります。ベースのみが存在する場合、既知のハッシュ方法がないと、何かを回復することは不可能です。



結論



  1. 何らかの形で個人データを扱う必要があるときはいつでも-建築家を巻き込む
  2. 何らかの形で個人データを扱う必要があるときはいつでも-暗号化または情報セキュリティの分野で経験/教育を受けた開発者を巻き込む


これら2つの単純なルールは、degvoterアプリケーションの例で見た恥を回避するのに役立ちます(通常の開発者は、ハッシュ関数を使用するニュアンスを理解していない



可能性があることに注意してください)個人データを回復する可能性を示すためのユーティリティ... デフォルトでは、8スレッド用に構成されています。すでにdegvoter.zipアーカイブをダウンロードしていて、C#でプログラムしている場合は、その仕組みを簡単に理解できます。



github.com/AlexeiScherbakov/Voting2020



All Articles