Tấn công CRIME

Tấn công CRIME là một tấn công mới nhắm vào giao thức SSL/TLS mà anh Juliano Rizzo và tôi vừa trình bày ở hội thảo ekoparty 2012 cách đây vài ngày.

Khi nào có thời gian tôi sẽ viết một bài mô tả chi tiết, tạm thời mời xem slides ở đây. Nếu anh chị nào có thắc mắc gì thì có thể đặt câu hỏi ở trên slides hoặc ở đây cũng được.

Chủ đề : Chưa phân loạiBookmark the permalink. Trackbacks are closed, but you can post a comment.

2 Comments

  1. Posted 08/10/2012 at 12:30 am | Permalink

    Em đang gặp một số vấn đề khó hiểu mong anh Thái giải thích:
    Trong phần TLS Compression ở phần giải thuật:
    url = random_16K_url(known)
    record_lens = query(url)
    length = record_lens[0]
    1. Theo em hiểu: record_lens là độ dài record sau khi encrypt thu được từ sniff còn length là độ dài record sau khi compress. Vậy làm sao để tính được length từ record_lens vì đối với block encrypt thì không thể xác định chính xác độ dài plaintext khi chỉ biết độ dài ciphertext.
    2. Hàm random_16K_url có gì đặc biệt không vì chỉ cần 6 request là đoán được 1 byte nên có lẽ hàm random này sẽ sinh theo kiểu nhị phân tức bước đầu tiên sẽ lần lượt cho url xét 32 ký tự để tạo thành twid = a twid = b… sau đó lần lượt xét 16, 8,4,2,1 ký tự.

    • Posted 12/10/2012 at 1:26 am | Permalink

      > Theo em hiểu: record_lens là độ dài record sau khi encrypt thu được từ sniff còn length là độ dài record sau khi compress.

      record_lens là một mảng, chứa chiều dài của các record. Bạn để ý sẽ thấy là tôi lấy phần tử đầu tiên của mảng này và gán nó cho biến length. Nói cách khác giá trị của biến length chính là chiều dài (sau khi nén rồi mã hóa) của record đầu tiên.

      > Vậy làm sao để tính được length từ record_lens vì đối với block encrypt thì không thể xác định chính xác độ dài plaintext khi chỉ biết độ dài ciphertext.

      Quan sát này của bạn rất chính xác. Đoạn code mà tôi ghi trong slide chỉ chạy được với RC4. Dẫu vậy không khó để chỉnh nó lại để nó có thể chạy với AES. Bạn có thể thiết kế hàm random_16k_url như thế này:


      def random_16k_url(known):
      path = random_str(500)
      record = get_record(path, known)
      assert len(record) == RECORD_LEN - len(known) - 1
      while len(compress(record + known)) % 16 != 15:
      print "bad length: %d" % (len(compress(record + known)))
      path += random.choice(BASE64)
      record = get_record(path, known)
      return url

      Bạn để ý là hàm này muốn tìm một cái URL mà chiều dài nén của record tương ứng với nó chia cho 16 dư 15. Ý tưởng là nếu có một URL như thế thì một thay đổi nhỏ có thể sẽ khiến chiều dài nén chia hết cho 16. Lúc đó sẽ có thêm một dummy padding block được thêm vào. Nói cách khác, ta đã tạo ra hai nhóm chiều dài nén khác nhau và tùy vào biến length mà ta sẽ loại được một trong hai nhóm đó.

      > Hàm random_16K_url có gì đặc biệt không vì chỉ cần 6 request là đoán được 1 byte nên có lẽ hàm random này sẽ sinh theo kiểu nhị phân tức bước đầu tiên sẽ lần lượt cho url xét 32 ký tự để tạo thành twid = a twid = b… sau đó lần lượt xét 16, 8,4,2,1 ký tự.

      Ý tưởng chủ đạo cái URL nhận được từ random_16k_url phải chia các tập hợp các candidate bytes ra làm 2 nửa gần bằng nhau. Nếu làm được như thế thì chỉ cần logW là có thể tìm được byte cần tìm. Cách thiết kế không có gì đặc biệt: cứ tạo một url ngẫu nhiên, nén thử xem nó có chia tập hợp các candidate bytes ra làm 2 nửa gần bằng nhau hay không.

Post a Comment

Your email is never published nor shared. Required fields are marked *

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*
*