1. Trang chủ
  2. » Công Nghệ Thông Tin

Tìm hiểu tấn công Padding Oracle lên chế độ CBC của mã khối

18 1,8K 12

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 566,5 KB

Nội dung

Đầu tiên, lỗ hổng này không liên quan đến CSDL Oracle hay Oracle company. Trong mật mã học, một “oracle ” là một hệ thống mà việc mã hóa thực hiện bởi việc tham gia vào đầu vào nhất định. Có thể hiểu, oracle là một hộp đen đáp ứng các yêu cầu. Có thể hình dung nó như giao thức dựa trên hàm băm, với một đầu vào ngẫu nhiên, nó sẽ trả về một đầu ra dữ liệu ngẫu nhiên tương ứng. Do đó, “Padding oracle ” là một loại hộp đen mà giải mã thông điệp đầu vào và nói cho bạn biết việc padding là đúng hay sai.

Trang 1

HỌC VIỆN KỸ THUẬT MẬT MÃ

KHOA AN TOÀN THÔNG TIN



BÁO CÁO BÀI TẬP LỚN MÔN HỌC

MẬT MÃ HỌC NÂNG CAO

Chủ đề số 05

TÌM HIỂU TẤN CÔNG PADDING ORACLE LÊN CHẾ ĐỘ

CBC CỦA MÃ KHỐI

Giảng viên: ThS Phạm Quốc Hoàng

KS Nguyễn Văn Nghị Thực hiện: Sinh viên lớp AT8B

1 Nguyễn Thị Thu Hiền

2 Trần Nhật Trường

3 Lê Văn Vũ

HÀ NỘI, 2015

Trang 2

MỤC LỤC

Danh mục kí hiệu và từ viết tắt

Danh mục các hình vẽ

Lời mở đầu

Chương 1 các khái niệm cơ bản

1.1 Mã hóa khối - Block Ciphers 4

1.2 Một số kĩ thuật Padding 5

1.1.1 Bit Padding 6

1.1.2 Byte Padding 6

1.1.3 Zero Padding 6

1.3 Giới thiệu CBC mode trong hoạt động mã khối 7

Chương 2 Padding Oracle attack

2.1 Giới thiệu về Padding Oralce attack 8

2.2 Using Padding Oracle attack 12

1.1.4 Cracking CAPTCHA 12

1.1.5 Giải mã JSF ViewStates 13

2.3 Một số Web Framework dễ bị tấn công Padding Oralce 14

1.1.6 Ruby On Rails 14

1.1.7 OWASP ESAPI 14

Kết luận

Tài liệu tham khảo

Trang 3

DANH MỤC KÍ HIỆU VÀ TỪ VIẾT TẮT

Trang 4

DANH MỤC CÁC HÌNH VẼ

Hình 1.Mã hóa khối

Hình 2.Một số ví dụ về kỹ thuật Padding với Block size là 8 byte

Hình 3.Mô hình CBC của mã khối

Hình 4.Một số ví dụ về padding

Hình 5.Sơ đồ giải mã trong CBC mode

Hình 6.CBC mode decryption

Hình 7.Kết quả nhận được khi padding 8 byte 0

Hình 8.Kết quả nhận được khi tăng padding block khởi đầu lên 1

Hình 9.Kết quả nhận được khi padding đúng

Hình 10.Vận dụng để đoán plaintext

Trang 5

LỜI MỞ ĐẦU

Ngày nay, ngành công nghiệp web đang sử dụng rộng rãi và các trang web đang

sử dụng mã hóa không chính xác nên đã tạo ra các lỗ hổng để kẻ tấn công có thể đọc và sửa đổi dữ liệu cần được bảo vệ Nó đã được biết đến trong nhiều năm qua trong cộng đồng

Nếu thông điệp được mã hóa không được xác thực, tính toàn vẹn dữ liệu không thể được đảm bảo mà làm cho hệ thống dễ bị tấn công, một trong số họ bị tấn công bởi

kỹ thuật Padding Oracle, một kỹ thuật được bởi Serge Vaudenay phát minh và trình bày tại EuroCrypt năm 2002

Vì vậy trong đề tài này chúng em đi vào nghiên cứu để tìm hiểu rõ hơn vè kỹ thuật padding oracle lên chế độ cbc của mã khối

Chúng em xin cảm ơn!

Trang 6

CHƯƠNG 1 CÁC KHÁI NIỆM CƠ BẢN 1.1 Mã hóa khối - Block Ciphers

Trong mã hóa khối, hàm mã hóa và giải mã thường lấy đầu vào là một block 1 khối dữ liệu có độ dài nhất định (4bytes, 8bytes….) Vì vậy, với một đoạn dữ liệu có độ dài lớn, người ta thường chia nó thành các đoạn nhỏ (trùng với độ dài input của thuật toán mã hóa) và mã hóa lần lượt

được mã hoá tách biệt Điều này làm cho việc phá mã trở nên dễ dàng hơn Trong mã khối, thông điệp sẽ được chia thành các khối (Blocks) có kích thước bằng nhau (VD: DES làm việc với các khối 64 bit, AES với các khối 128 bit… ) Các khối thông điệp này

sẽ được mã hóa lần lượt và gửi đi Trong kiểu mã hoá này, các tham số quan trọng là kích thước (độ dài) của mỗi khối và kích thước khoá

Điều kiện an toàn của mã hóa khối:

- Kích thước khối phải đủ lớn để chống lại các loại tấn công phá hoại bằng phương pháp thống kê Tuy nhiên điều này sẽ dẫn đến thời gian mã hóa tăng lên

- Không gian khóa phải đủ lớn(tức là chiều dài khóa phải đủ lớn) để chống lại tìm kiếm vét cạn.Tuy nhiên, khóa cần phải đủ ngắn để việc làm khóa, phân phối và lưu trữ được hiệu quả

Hầu hết các thuật toán mã hóa khối sử dụng lặp đi lặp lại các hàm đơn giản Phương pháp này còn được gọi là mã hóa khối lặp Mỗi chu kỳ lặp được gọi là một vòng (round) và thông thường các thuật toán có từ 4 tới 32 vòng

Trang 7

Rất nhiều thuật toán mã hóa khối có tính chất của mạng Feistel, hay tổng quát hơn

là hệ thống thế và hoán vị Các thành phần sử dụng trong thuật toán là các hàm toán học,

các hàm lô gíc (đặc biệt là hàm XOR), hộp thế (S-box) và hoán vị (P-box).

Khi thiết kế mã khối cần đảm bảo hai yêu cầu sau:

- Confusion (tính gây lẫn): làm phức tạp hóa mối liên quan giữa bản mã và khóa.

Do đó cũng ngăn chặn việc suy lại ra khóa Tính chất này dựa vào sử dụng S-box

- Diffusion(tính khuếch tán): Làm khuếch tán những mẫu văn bản mang đặc tính

thống kê (gây ra do dư thừa của ngôn ngữ) lẫn vào toàn bộ văn bản Nhờ đó tạo ra khó khăn cho kẻ thù trong việc dò phá mã trên cơ sở thống kê các mẫu lặp lại cao Tính chất này có được dựa vào sử dụng P-box kết hợp với S-box

Mã khối có ưu điểm là tốc độ mà hóa rất nhanh, linh hoạt hơn trong việc xây dựng các số giả ngẫu nhiên, dòng khóa… Mã khối có thể ứng dụng cho cả các thuật toán mã hóa bí mật và mã hóa khóa công khai

Một số hệ mã nổi tiếng như: Lucifer(1969), DES(1977), AES, RC4, GOST…

1.2 Một số kĩ thuật Padding

Trong mã hóa khối, hàm mã hóa và giải mã thường lấy đầu vào là một block 1 khối dữ liệu có độ dài nhất định (4bytes, 8bytes….) Vì vậy, với một đoạn dữ liệu có độ dài lớn, người ta thường chia nó thành các đoạn nhỏ (trùng với độ dài input của thuật toán mã hóa) và má hóa lần lượt Vì đoạn dữ liệu được tách ra trong quá trình mã hóa, sẽ gây ra trường hợp block cuối cùng sẽ ngắn hơn kích thước (size) cần, trong trường hợp này người ta sẽ thêm vào sau một số kí tự, kỹ thuật này gọi là Padding

Trang 8

1.1.1 Bit Padding

Trong kỹ thuật này, một bit 1 sẽ được thêm vào khối tin Sau đó là các bit 0

Ví dụ: Đệm 9 bit vào sau một đoạn 23 bit để được khối tin 32 bit :

1.1.2 Byte Padding

a) Chuẩn ANSI X.923

Theo tiêu chuẩn ANSI X.923, Các byte 0 được thêm vào sau, riêng byte cuối dùng

để xác định số byte được thêm vào

Ví dụ: Trong ví dụ sau kích thước khối là 8 byte và số byte cần thêm vào là 4 byte(trong hệ Hexa):

b) Chuẩn PKCS#5 và PKCS#7

Trong PKCS#7, giá trị của mỗi byte thêm vào chính bằng số byte được thêm vào Phần byte được Padding sẽ có dạng là:

Ví dụ: Trong ví dụ sau, kích thước khối là 8 byte, số byte cần thêm là 4 byte:

PKCS#5 giống hệt PKCS#7, ngoại trừ việc nó chỉ được sử dụng cho mật mã khối

có kích thước khối là 64 bit (8 byte) Trong thực tế, hai chuẩn này có thể sử dụng thay thế cho nhau

c) Chuẩn ISO/IEC 7816-4

Theo ISO/IEC 7816-4, byte đầu tiên được thêm vào bắt buộc phải có giá trị là 80 (trong hệ Hexa) Các byte tiếp theo là 00

Ví dụ: Kích thước khối là 8 byte, số byte cần thêm vào là 4 byte:

1.1.3 Zero Padding

Tất cả các byte được thêm vào là số 0, kỹ thuật này không được coi là một chuẩn

để mã hóa

Ví dụ: Kích thước khối là 8 byte, số byte cần thêm là 4 byte:

…| 1011 1001 1101 0100 0010 0111 0000 0000 |

…| DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |

…| DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

…| DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |

Trang 9

1.3 Giới thiệu CBC mode trong hoạt động mã khối

Trong chế độ này, mỗi khối tin trước khi được mã hóa thì được XOR với khối mã sinh ra từ bước trước đó

X1 = X1’ ⊕ IV

X2 = X2’ ⊕ Y1

Xi = Xi’ ⊕ Yi-1

Mô hình CBC như hình dưới Ci = E(Pj⊕ Ci-1, K) với i=2,3…N-1

Việc mã hóa khối đầu tiên, người ta dùng một khối dữ liệu giả được gọi là vecter khởi tạo (initialization vecter-IV) và được chọn ngẫu nhiên: C1 = E(K,[IV⊕P1])

Để giả mã, tiến hành ngược lại:

P1=D(K,C1) ⊕IV

Pj= D(K,Cj) ⊕ Cj-1 với j= 2,…,N

Như vâỵ các khối mã đều phụ thuộc rất chặt theo kiểu “móc xích” Người mã hóa

và giải mã phải sử dụng chúng một vector khởi tạo IV Vector khởi tạo không vần giữ bí

Tóm lược,

Ci = E(Pj⊕ Ci-1, K) với i=2,3…N-1 Pj= D(K,Cj) ⊕ Cj-1 với j= 2,…,N

Trang 10

CHƯƠNG 2 PADDING ORACLE ATTACK 2.1 Giới thiệu về Padding Oralce attack

Đầu tiên, lỗ hổng này không liên quan đến CSDL Oracle hay Oracle company Trong mật mã học, một “oracle ” là một hệ thống mà việc mã hóa thực hiện bởi việc tham gia vào đầu vào nhất định Có thể hiểu, oracle là một hộp đen đáp ứng các yêu cầu

Có thể hình dung nó như giao thức dựa trên hàm băm, với một đầu vào ngẫu nhiên, nó sẽ trả về một đầu ra dữ liệu ngẫu nhiên tương ứng Do đó, “Padding oracle ” là một loại hộp đen mà giải mã thông điệp đầu vào và nói cho bạn biết việc padding là đúng hay sai

Tưởng tượng trường hợp A connect đến server B và gửi một encrypted message (C) với key thỏa thuận từ trước và sử dụng CBC, trên B có một ứng dụng (app) làm nhiệm vụ:

1 Nhận cypher text

2 Decrypt cypher text=> plain text

3 Kiểm tra định dạng plain text, nếu padding không đúng=> return ER_PADDING

4 Đọc dữ liệu trong plain text => return SOMETHING_ELSE

Giả sử bằng một cách nào đó, attacker có được đoạn encrypted message (C) này,

kỹ thuật Padding oracle có thể decrypt đoạn C mà không cần key cũng như thông tin về thuật toán mã hóa

Bạn cũng có thể hiểu đơn giản như thế này, Padding oracle là kỹ thuật dựa vào hành động xử lý ngoại lệ của chế độ mã khối Dù attacker padding đúng hay sai, nó sẽ trả

về kết quả tương ứng, và từ đó, attacker dò ra được thông tin về bytes hay bít cuối cùng

Để hiểu thêm, hãy nhìn vào hai đoạn dữ liệu dưới đây Chúng có block size là 8 Đoạn 1, ta có thể dễ dàng thấy rằng nó chia thành 3 đoạn với block size là 8 (8A + 8B + 8C) Nhưng với đoạn 2, phần cuối rút đi 4 chữ cái Vì vậy để apply block size là 8, ta phải cần đến padding

Đoạn 1: AAAAAAAABBBBBBBBCCCCCCCC

Đoạn 2: AAAAAAAABBBBBBBBCCCC

Đơn giản là padding thêm vào các đoạn bit cần thiết trước khi mã hóa để tạo các khối rõ ràng Dưới đây là một tình huống padding khác Tuy nhiên, trong đây ta chỉ dùng tiêu chuẩn PKCS #5

Ở chuẩn PKCS#5 block cuối cùng của đoạn bản rõ được pad với N byte với giá trị

N Ví dụ, ở hình dưới, tất cả đều có block size là 8 bytes Tại ví dụ 1, có 5 byte thiếu, do

đó tất cả 5 chỗ trống sẽ được thêm vào giá trị 0x05 Tương tự, ví dụ 3 chỉ có 1 byte bị thiếu, do đó các chỗ còn lại sẽ được điền với giá trị 0x01

Trang 11

Hình 4 Một số ví dụ về padding Kịch bản tấn công:

Cuối cùng với tất cả thông tin hữu ích cần phải biết, chúng ta tập trung tiến hành tấn công Đầu tiên giả sử ta có đoạn URL dưới đây:

https://www.example.com/home.asp?

UID=8A219A434525535FF324D4G56FC95348

Giả sử các thông tin sẽ được gửi qua tham số UID ( username ) được mã hóa ở CBC mode và tiêu chuẩn PKCS#5 Do đó ứng dụng giã mã giá trị này và trả về kết quả Nói cách khác, có 3 trường hợp có thể xảy ra khi ứng dụng gửi các UID khác nhau

Trường hợp 1: Đoạn văn bản mã hóa chính xác – Hợp lệ và load page bình thường Trường hợp 2 Đoạn văn bản mã hóa không chính xác( với đoạn padding không đúng ) – Page không hợp lệ ( 404 )

Trường hợp 3: Đoạn văn bản mã hóa chính xác nhưng padding không hợp lệ - Lỗi

8A219A434525535FF324D4G56FC95348 và nó giải mã để thành ‘tom’ Sau đó ứng dụng sẽ gửi một response bình thường ( đây là đoạn URL mà ‘tom’ nhận được sau khi logging in)

Ví dụ tình huống 2: Bạn gửi đi giá trị UID=998877PA434525535FF324D4G56FC95348 và ứng dụng sẽ giải mã thành ‘xxx’ ( user không hợp lệ ) Ứng dụng có thể sẽ trả về 404 message

Ví dụng tình huống 3: Bạn gửi đi giá trị UID=66IXS7IA434525535FF324D4G56FC95348 và giải mã thành ‘sam’ ( user hợp lệ ) nhưng với padding không hợp lệ Ứng dụng sẽ trả về một ngoài exception

Trang 12

Do đó, nếu bạn có thể gửi các đoạn văn bản mã hóa khác nhau và tìm giải mã các giả trị khác nhau với padding hoặc không có padding ta có thể giải mã các đoạn mã hóa cho sẵn

Khai thác:

Hãy nhìn vào mô hình giải mã CBC mode dưới đây:

Trong giải mã CBC, mỗi đoạn mã hóa được sẽ được xor với đoạn block trước để được plaintext

Cho nên ta có:

https://www.example.com/home.asp?UID=8A219A43|4525535F|F324D4G5| 6FC95348

Cipher blocks: 8A219A43| 4525535F| F324D4G5| 6FC95348

Các bước tấn công:

Nếu request dưới đây với block khởi đầu là toàn số 0, ứng dụng khả năng sẽ trả về 500

Trang 13

Hình 7 Kết quả nhận được khi padding 8 byte 0 Nhưng bây giờ, gửi một request tương tự nhưng tăng giá trị của block khởi đầu lên 1

https://www.example.com/home.asp?UID=00000001|4525535F|F324D4G5|

6FC95348

Chú ý rằng mặc request trả về một error, giả trị cuối cùng của đoạn giải mã sẽ thay đổi khi ta gửi 0x01 trong request

Do đó, nếu ta tang chỉ vài byte cuối của IV lên vài lần ( lên tới FF ) chúng ta sẽ đạt được một giá trị padding hợp lệ

Từ đây, chúng ta có thể suy ra " intermediary value " tại vị trí này, vì chúng ta biết rằng khi XORed với 0x3C, nó tạo 0x01

Nếu [intermediary Byte] ^ 0x3C == 0x01,

sau đó [intermediary Byte] == 0x3C ^ 0x01,

như vậy [intermediary Byte] == 0x3D

Trang 14

Một khi bạn biết giá trị byte trung gian, chúng ta có thể suy ra những gì giá trị thực tế là giải mã Chỉ cần XOR nó với các văn bản mật mã trước đó Hình sau thể hiện điều đó

2.2 Using Padding Oracle attack

1.1.4 Cracking CAPTCHA

CAPTCHA là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không Đây là một quá trình một máy tính (máy chủ) yêu cầu một người dùng hoàn tất một kiểm tra đơn giản mà máy tính có thể dễ dàng tạo ra và đánh giá, nhưng không thể tự giải nó được Vì máy tính không thể giải quyết CAPTCHA, bất kỳ người dùng nào nhập vào lời giải đúng sẽ được xem là con người Một loại CAPTCHA phổ biến yêu cầu người dùng phải nhập các chữ cái trong một tấm hình méo mó, đôi khi cùng với một dãy số hoặc chữ lờ mờ xuất hiện trên màn hình Một số hệ thống CAPTCHA dựa trên mật mã là ví dụ đơn giản nhất cho padding oracle attack

Một hệ thống CAPTCHA bị tổn thương làm việc như sau:

1 Server sinh một random code, mã hóa nó sử dụng CBC-mode với khóa K và

IV ERC=EK,IV(rand())

ngay khi nhận được, sẽ giải mã nó, và tạo ra một hình ảnh méo mó Nếu một form HTML

Trang 15

để hiện một CAPTCHA, nó chỉ đặt một cái gì đó giống như /captcha.jsp?token=ERC vào một thẻ <img> để tải một hình ảnh méo mó

3 ERC sẽ được lưu trữ hoặc như là một trường ẩn trong các form CAPTCHA hoặc như một cookie, vì vậy một khi một người dùng submit, nó sẽ được gửi trở lại cho server

4 Sau đó server đi vào giải mã ERC, và so sánh nó với mã mà người dùng đã nhập Nếu bằng nhau, server chấp nhận yêu cầu bằng không từ chối

Bởi vì captcha.jsp sẽ giải mã bất kỳ ERC gửi đến nó, nên dễ bị padding oracle attack Bây giờ sẽ xem xét khi nào padding là VALID, và khi nào không

May mắn là, hầu hết các hệ thống CAPTCHA sẽ gửi lại một thông báo lỗi khi thất bại trong việc giải mã ERC, chẳng hạn, padding là INVALID Một số server gửi hoặc phản hồi trống hoặc HTML với một error mesage Ngoài ra, nếu sửa đổi ERC để padding

là VALID, captcha.jsp sẽ hiển thị một hình ảnh với broken code Nếu mọi thứ làm việc theo cách đó, attckers đã có một padding oracle, và họ có thể sử dụng nó giải mã bất kỳ ERC nào để nhận được mã số ngẫu nhiên , do đó hoàn toàn bỏ qua bảo vệ CAPTCHA

CAPTCHA với IV bí mật:

P0 = IV ⊕ DPaddingOracle(C0)

phần của mã ngẫu nhiên

Đối với những hệ thống CAPTCHA mà tác giả đã tìm thấy trong nghiên cứu, các

IV có thể được phục hồi dễ dàng với sự can thiệp của con người Hầu hết các lần văn bản

biết DPadding Oracle(C0), sau đó họ có thể tính toán IV bí mật như sau:

IV = Human ⊕ D PaddingOracle (C0)

ích để tấn công các hệ thống CAPTCHA, khám phá IV một lần duy nhất cho phép attacker giải mã bất kỳ thách thức mới, do IV là không thay đổi, khi không có bất kỳ sự can thiệp nào của con người

1.1.5 Giải mã JSF ViewStates

JavaServer Faces (JSF) giới thiệu một hệ thống mạnh mẽ và linh hoạt để lưu và khôi phục lại trạng thái của thời điểm giữa các request gửi đến server Triển khai JSF hỗ trợ hai cơ chế chính để lưu trạng thái, dựa trên các giá trị của javax.faces và các tham số khởi STATE_SAVING_METHOD Nếu tham số này được thiết lập cho client, trạng thái được lưu bao gồm trong việc đánh dấu thời điểm postback được gửi cho client (chẳng hạn như trong một hidden input cho HTML?) Các thông tin trạng thái phải bao gồm các

Ngày đăng: 26/06/2016, 09:35

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w