デジタル署名を損傷せずにEXEファイルにタグを付ける





みなさんこんにちは!



私たちは、Windows PEファイルのデジタル署名を研究した経験と、独自の目的のためにそれらの機能を使用する可能性についてお話したいと思います。 技術的な詳細に興味がある場合や、一見古くから知られていることについて読んでいる場合は、catへようこそ。



ユーザーアカウント制御



多くの方は、Windows Vistaの登場により、UAC(ユーザーアカウント制御)と呼ばれる興味深いことがあることを知っています。 このメカニズムはセキュリティを改善するために作られました。その本質は、オペレーティングシステムの重要な部分へのアプリケーションアクセスを制限することです。 ただし、これらの部分に到達する機会は依然として存在し、ユーザーはこれを制御できます。



Windowsアプリケーションには、マニフェスト(アプリケーションの起動時にWindowsが使用するXMLファイル)を含めることができます。 このマニフェストでは、昇格された特権でアプリケーションを起動するための要件を説明できます。この場合、アプリケーションを起動すると、ユーザーはアプリケーションを信頼して最大の権限で実行できるかどうかを尋ねる同じUACウィンドウを表示しますか?







この段階でユーザーが簡単になり、開発者が転送されたファイルの整合性と独創性に自信を持つことができるように、Microsoftは合法で無害なソフトウェアの作成者にデジタル署名を使用することをお勧めします。 作成者、さらに重要なことには、元のファイルの信頼性を証明します。







検証済みの発行元に関する情報を含む起動要求を見ると、ユーザーはこのファイルの実行可能部分の内容が変更されていないこと、および明確な良心をもって起動できることを確認できます(もちろん、この著者を信頼している場合)。 ただし、未検証の発行元からアプリケーションの起動を要求する場合、考えられる原因と結果を検討および分析する価値があります。



トピックに近い



しかし、私たち(これらのアプリケーションの作成者)がダウンロード時にのみ知られる追加情報をそれらに転送したい場合はどうでしょうか? 結局のところ、ファイルを変更すると、デジタル署名は自動的に無効になります。 どのようなオプションがありますか?



  1. 転送するファイルの名前に転送に必要なデータを追加すると、Webサーバーは正規表現を使用してそのような要求を1つの物理ファイルにリダイレクトします。

    +実装が簡単。

    +ファイル内部はそのままで、署名は常に正しいです。

    -少数のデータ(たとえば、複数の識別子)のみを転送できます。

    -ファイルの名前を変更すると、情報が消えます。



  2. ファイル内のデータを変更し、アップロード時に再署名します。

    +任意の量のデータを転送できます。

    +名前を変更しても何も失われません。

    --署名は、私たちの場合のように、1秒間に何百もの大規模(100 MB以上)のゲーム配信を返す場合、非常に長いプロセスです。



  3. 正しいデジタル署名を維持しながら、ファイル内のデータを変更し、再署名しないでください。

    +任意の量のデータを転送できます。

    +名前を変更しても何も失われません。

    +ファイルに再署名する必要はありません。

    -これは不可能です(または可能ですか?)。



理論のビット



以下は、Windows PEファイルの構造で、デジタル署名を形成する部分と、このプロセスでスキップされるブロックに関する情報が含まれています。

また、Microsoftが使用するデジタル署名ブロック形式( PKCS #7構造)も示しています。











このスキームの重要なポイントは、デジタル署名の生成および検証中に除外されるブロックの存在です。 これらのブロックは、最も単純なC構造によって記述されます。



「データディレクトリ」セクションの「証明書テーブル」はIMAGE_DATA_DIRECTORY構造です。



typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
      
      





ここで:



「証明書テーブルの属性」は、WIN_CERTIFICATE構造です。



 typedef struct _WIN_CERTIFICATE { DWORD dwLength; WORD wRevision; WORD wCertificateType; BYTE bCertificate[ANYSIZE_ARRAY]; } WIN_CERTIFICATE, *LPWIN_CERTIFICATE;
      
      





その要素には次の値が含まれます。



PEファイルに署名する場合、証明書テーブルの属性セクションは常にファイルの最後に配置されます(「残りのコンテンツ」ブロックがありません)。 この機能を知っていれば、少し魅力的な結果を出すことができます。



不可能は可能です



Theは次のとおりです。IMAGE_DATA_DIRECTORYで説明されているセクションサイズは、WIN_CERTIFICATE構造体の実際のサイズと異なる場合があり 、デジタル署名をチェックする場合、IMAGE_DATA_DIRECTORYでサイズが説明されているセクション全体が除外されます。 同時に、このセクションに手動で追加されたコンテンツはデジタル署名の一部ではなくなり、実際、任意のデータセットを含めることができます。 したがって、ファイルのデジタル署名を損傷することなく、IMAGE_DATA_DIRECTORY構造のセクションのサイズを以前に変更して、「証明書テーブルの属性」ブロックのコンテンツにデータを簡単に追加することができます。 8バイトの倍数のサイズにファイルをパディングすることを忘れないでください。



この方法を使用する場合に考えられる結果を理解する必要があります。送信されるデータのタイプ、ボリューム、処理の可能性、およびこれに関連する潜在的なホールに留意してください。 (意図的に誰かがそれをしたい場合)安全に削除/置換/台無しすることができるような情報のみをそこに送信することはあなたの利益ですが、同時に基本的な機能を失わないでください。



「もちろん、PEファイルのチェックサムはどうですか?」と尋ねます。 安心させていただきます-通常のEXEファイルの起動と操作には何の役割も果たしません。 チェックサムは、重要なシステムファイルでのみチェックされます。たとえば、システムファイルチェッカーサービスは(不足または破損したシステムファイルを診断するために)それに焦点を合わせます。



結論として、誰がどのようにそれを使用しますか?



Googleはこの機会を利用して、Google Omahaの自動更新を通じて製品を配布しています。 Google ChromeまたはGoogle Earthをダウンロードすると、ダウンロードする前に、ChromeブラウザをEarthにインストールするなど、いくつかの設定を行うことができます。 これらの設定は、ディストリビューションにタグを付けるだけで送信されます。これは、EXEファイルにデータを追加するプロセスであり、ユーザーのローカルマシンでさらに処理されます。



また、この機会をさまざまなアフィリエイトネットワーク(パートナートラッキングを使用した返品配布)で使用すると便利です。



この機能を使用してWebサーバーからファイルをアップロードするためのメカニズムは、FUSEに基づく仮想ファイルシステムであるnginxの自己記述プラグインを使用して、またはその他のよりエキゾチックな方法で実装できます(独自のバージョンを思いついた場合はコメントで教えてください)。



PEファイルのデジタル署名に関する情報は、このドキュメントで見つけることができます: Windows Authenticode Portable Executable Signature Format



All Articles