チュートリアル 2: 暗号化 ZIP ファイル形式の検出

このチュートリアルは、パスワード保護された (暗号化された) ZIP ファイルを検出するためにカスタムスクリプトを記述する方法を示します。
Symantec Data Loss Prevention
検出サーバーは暗号化 ZIP ファイルを検出できますが、Endpoint Agent はできません。ここで提供するソリューションによってこの問題を回避できます。
このスクリプトは、最初のファイルエントリで暗号化ビットが有効かどうかを確認することで、ZIP ファイルが暗号化されているかどうかを検出します。ZIP ファイルはファイル単位の暗号化のみが可能なため、ZIP アーカイブ内のすべてのファイルまたは最初のファイルが暗号化されている場合のみ、このスクリプトは動作します。
このチュートリアルは、最初のチュートリアルを完了したことを想定します。
  1. 暗号化 ZIP ファイル形式を検出するには
  2. 複数 (15 個以上) のパスワード保護された ZIP ファイルを作成し、
    c:\temp\files\ZIP
    のようなディレクトリに置きます。
  3. 次に、ZIP ファイルの 2 番目のセット (5 個以上) を、暗号化せずに作成します。これで、一致する結果と不一致の結果の両方があることになります。
    これらの暗号化されていない ZIP ファイルを
    c:\temp\files\ZIP2
    などの 2 番目のディレクトリに置きます。
  4. File Type Analyzer ユーティリティ (
    analyzer_gui.exe
    ) を起動します。
  5. データセットとして
    c:\temp\files\ZIP
    ディレクトリを追加します。
    また、
    c:\temp\files\ZIP2
    ディレクトリもデータセットに追加します。
  6. 必要なデータセットパラメータを入力し、選択します。
    • File Name Filter
      :
      [\w\s]+.[\w]+
    • Number of Bytes
      :
      1024
    • Chunk Size
      :
      1
    • Parser Types
      : BYTE
  7. [Analyze Dataset]
    をクリックします。
  8. [COLUMN_MATCH]が選択された状態で、
    [Analyze Table Data]
    をクリックします。
    ユーティリティはすべてのファイルにわたってバイトの一致をハイライトします。全ファイルの最初の 6 バイトが完全一致することに注意してください。また、暗号化されていない ZIP ファイルでは、第 7 バイトがゼロであることにも注意してください。第 7 バイトは暗号化ビットです。
  9. [Solution]
    フィールドに、次のスクリプトを入力します。
    $pktag=ascii('PK'); $frecord=getHexStringValue('0304'); $pkbytes=getBinaryValueAt($data, 0x0, 2); assertTrue($pktag == $pkbytes); $recordbytes=getBinaryValueAt($data, 0x2, 2); assertTrue($frecord == $recordbytes); $cryptByte=getBinaryValueAt($data, 0x6, 1); $encrypted=mod($cryptByte, 2); assertTrue($encrypted == 1);
  10. ソリューションは、暗号化されているデータセットの ZIP ファイルにのみ一致する必要があります。暗号化されていない ZIP ファイルは[Mismatched Files]ペインに表示される必要があります。
    • $pktag=ascii('PK');
      最初の文は、「$pktag」変数に値「PK」を割り当てます。[Parser Type]を
      [ASCII]
      に切り替えると、すべての ZIP ファイルの最初の 2 バイトが「P」と「K」であることがわかります。
    • $frecord=getHexStringValue('0304');
      第 2 文では、「$frecord」変数に「0304」という値を割り当てます。これは、ZIP ファイルの第 3 バイトと第 4 バイトです。(この値を確認するには、[Parser Type]を[BYTE]に再び切り替えます。)
    • $pkbytes=getBinaryValueAt($data, 0x0, 2);
      第 3 文は最初の 2 バイトのバイナリ値を取得します。
    • assertTrue($pktag == $pkbytes);
      第 4 文は「$pktag」変数と「$pkbytes」変数の値を比較して、「P」と「K」の完全一致を見つけます。値が一致すれば、assertTrue が真になります。
    • $recordbytes=getBinaryValueAt($data, 0x2, 2);
      第 5 文は第 3 バイトと第 4 バイト (第 3 バイトで開始して、2 つカウント) のバイナリ値を調べます。ここでは、値は ([BYTE]モードで)「03」と「04」です。
    • assertTrue($frecord == $recordbytes);
      第 6 文は「$frecord」変数の値を「$recordbytes」変数の値と比較します。戻された値 (「$recordbytes」) が、「$frecord」変数に割り当てられた値 (「03」と「04」) と一致する場合、assertTrue が真になります。
    • $cryptByte=getBinaryValueAt($data, 0x6, 1);
      第 7 文は第 7 バイト (第 6 列) のバイナリ値を取得します。
    • $encrypted=mod($cryptByte, 2);
      第 8 文は、第 7 バイトの値 (「$cryptByte」変数に割り当て済み) を「2」で割ります。その後、この剰余を「$encrypted」変数に割り当てます。
    • assertTrue($encrypted == 1);
      第 9 文は「$encrypted」変数の値を調べます。値がゼロ (剰余なし) なら、ZIP ファイルは暗号化されていません。剰余があれば ZIP ファイルは暗号化されています。