Gần đây xuất hiện loại tấn công cài đặt nguy hiểm và phức tạp về mặt khoa học và công nghệ, đó là tấn công các hệ mật dựa trên khái niệm hàm tiên tri (Oracle Functions). Trong tấn công này, kẻ tấn công không cần biết khóa bí mật mà vẫn giải mã được các thông báo, dựa vào việc khai thác và tích lũy các thông tin rò rỉ trong thực hành cài đặt và vận hành của các hệ mật, khi người ta “đệm” thông báo (Padding) vào các bản rõ nhằm làm an toàn và thuận tiện cho quy trình lập mã, giải mã.
Hoạt động mật mã đã có nhiều thay đổi kể từ khi lập mã, giải mã và truyền thông báo được tự động hóa trên các máy tính và mạng máy tính. Thực tế này làm xuất hiện các loại tấn công và nguy cơ tấn công cài đặt thực hành hay tấn công kênh kề (Side Channel Attacks). Các tấn công và nguy cơ tấn công này trầm trọng đến mức, các hệ mật cho dù được thiết kế lý thuyết an toàn cao song trong thực tế vẫn có thể bị phá vỡ qua thực hành với các kiến thức và phương tiện tính toán phổ dụng sẵn có. Kẻ tấn công có thể tìm kiếm khóa bí mật giải mã trong phiên các liên lạc trực tuyến được lưu trữ đâu đó trong bộ nhớ của máy chủ dựa vào sơ hở trong quá trình quản lý bộ nhớ tại các máy chủ trong mạng.
Cũng có loại tấn công cài đặt thực hành tinh vi hơn đã được nêu trong các tiết lộ của Edward Snowden. Trong đó chỉ ra rằng, cơ quan an ninh quốc gia Mỹ NSA đã chủ định cài các cửa hậu (Back Doors) và kênh ngầm (Covert Channels) vào một số sản phẩm mật mã thương mại lưu thông trên thị trường sau khi khôi phục lại dãy giả ngẫu nhiên hoặc các khóa bí mật của người sử dụng.
Loại tấn công hệ mật dựa trên khái niệm hàm tiên tri không cần biết khóa bí mật vẫn giải mã được các thông báo dựa vào việc khai thác các thông tin rò rỉ trong thực hành cài đặt và vận hành hệ mật. Loại tấn công này được gọi là tấn công hàm tiên tri đệm thông báo (Padding Oracle Attacks). Các tấn công hàm tiên tri đệm thông báo có thể áp dụng cho cả các hệ mật khóa công khai (Phi đối xứng) và cả các hệ mật khóa bí mật (Đối xứng).
Tấn công giải mã thông báo đối với hệ mật khóa công khai
Tập trung vào nghiên cứu tấn công hàm tiên tri đệm thông báo lên một chuẩn mật mã cụ thể là PKCS#1 phiên bản 1.5 đối với hệ mật khóa công khai RSA với độ dài Modulus là 1024 bit. Tấn công này do Daniel Bleichenbacher công bố từ năm 1998, nhưng đến gần đây nó được cải tiến để đạt được hiệu quả khi triển khai thực hành.
Trong chuẩn PKCS#1 phiên bản 1.5, một thông báo m được mã hóa sử dụng hệ mật RSA, với khóa công khai e và khóa bí mật d cùng với Modulus N. Vì lý do an toàn và các lý do sử dụng khác, trước khi mã hóa, m được “đệm thông báo” vào trước nó và trở thành PKCS(m) = 00 02 R1 R2 … Rs 00 m. Trong đó, byte đầu tiên có giá trị 0, byte thứ hai có giá trị 2, Ri là các byte ngẫu nhiên khác 0 và s ≥ 8 để đáp ứng yêu cầu về an toàn và byte ngay sau Rs cũng có giá trị 0.
Nếu chuẩn PKCS#1 phiên bản 1.5 được cài đặt vào phần mềm hay thiết bị phần cứng chuyên dụng thì mỗi khi giải mã xong, phần mềm hay phần cứng này sẽ kiểm tra bản rõ PKCS(m) và phúc đáp lại nơi yêu cầu giải mã rằng bản rõ m này có tuân theo chuẩn PKCS hay không.
Chính phúc đáp này làm rò rỉ thông tin và giúp cho kẻ tấn công khai thác thông tin này để tấn công, tính ra được bản rõ trên một bản mã của nó, mà không cần phải biết khóa giải mã.
Kẻ tấn công được giả thuyết là có thể gửi yêu cầu giải mã với số lượng bản mã tùy thích đến các phần mềm, phần cứng đóng vai trò là hàm tiên tri và nhận về các phúc đáp xác định xem các bản rõ được giải mã có tuân theo PKCS hay không. Căn cứ vào các phúc đáp này, kẻ tấn công có thể tìm ra bản rõ tương ứng với một bản mã mong muốn giải mã mà không biết khóa giải mã vì nó được bảo vệ an toàn.
Tấn công cụ thể được Daniel Bleichenbacher thể hiện thành thuật toán nhờ ý tưởng hàm RSA bảo toàn đồng cấu nhân. Tức là, nếu bản rõ là tích modulo N của hai bản rõ khác nhau thì bản mã kết quả cũng là tích modulo N của hai bản mã tương ứng. Bleichenbacher đã sinh ra các cặp rõ, mã ngẫu nhiên, nhân modulo N bản mã với bản mã cần giải mã để tạo ra bản mã tích, sau đó đưa bản mã tích vào hàm tiên tri xem bản rõ của nó có tuân theo PKCS không.
Cứ mỗi lần tìm được bản mã tích tuân theo PKCS thì Bleichenbacher lại khoanh được giá trị của bản rõ cần tìm vào một số khoảng đóng không giao nhau nằm trong khoảng đóng lớn <1, N>. Bản rõ cần tìm chỉ có thể nằm trong một trong các khoảng đóng có thể nêu trên. Đồng thời, mỗi lần tìm được bản mã tích tuân theo PKCS thì Bleichenbacher lại giảm dần số lượng các khoảng đóng có thể chứa bản rõ cần tìm và giảm dần độ dài của các khoảng đóng này. Khi số lượng khoảng đóng còn là 1 và độ dài khoảng đóng là 0, thì tìm được chính xác bản rõ m nằm trong khoảng đóng này.
Trong thực hành, trung bình cứ sau 220 lần gọi hàm tiên tri sẽ giúp cho kẻ tấn công khám phá ra được hoàn toàn bản rõ m. Vì vậy, ban đầu nó có tên là “Tấn công triệu thông báo”. Vào năm 2012, người ta đã thực hiện một số cải tiến để tăng hiệu suất thực hành của thuật toán như: đánh giá chính xác hơn các cận, loại bỏ các khoảng trống, song song hóa xử lý, làm các hàm tiên tri phức tạp hơn. Tấn công đã thành công khi triển khai thực hành mà chỉ cần thực hiện dưới 50 nghìn lần lời gọi hàm tiên tri.
Tấn công của Bleichenbacher rất nguy hiểm đối với các thiết bị SmartCard kiểu USB Token và HSM hỗ trợ chức năng nhập khẩu khóa bí mật có lập mã. Tấn công giải mã bản mã RSA kích thước 1024 bit theo chuẩn PKCS#1 phiên bản 1.5 thực hiện trong khoảng vài chục phút cho đến vài giờ.
Tấn công giải mã thông báo đối với hệ mật khóa đối xứng
Tập trung vào trường hợp cụ thể, cài đặt thuật toán DES với thức hoạt động là CBC (Cipher Block Chaining). Năm 2002, Serge Vaudenay đã công bố về lý thuyết tấn công này. Do mỗi khối lập mã dài 8 byte nên một bản rõ cần lập mã sẽ có độ dài tính ra byte không chia hết cho 8 và phải đệm thông báo sao cho đủ bội của 8.
Trong chuẩn PKCS#5, lược đồ đệm thông báo được định nghĩa như sau: Nếu độ dài thông báo là bội của 8, thì lược đồ đệm thông báo sẽ nối thêm một khối gồm 8 byte nữa và tất cả các byte này được gán giá trị 08 là số byte được nối thêm vào phía sau thông báo; Ngược lại thì số byte còn lại được đệm vào cho chẵn độ dài của khối sau cùng còn thiếu và mỗi byte được gán giá trị là số byte được thêm vào sau thông báo cho tất cả các byte này.
Rất nhiều các tấn công trên các phần mềm và thiết bị lập mã hoạt động trực tuyến sử dụng mã khối với giao thức CBC đã thành công. Điều khó nhất trong tấn công này là việc chèn các bản mã do kẻ tấn công tạo ra vào phiên liên lạc trực tuyến của phần mềm hay thiết bị phần cứng và chặn bắt phúc đáp tuân thủ quy tắc đệm thông báo để giải mã từng byte của khối bản mã cần giải mã.
Các tác giả như Thái Dương, người Việt và Juliano Rizzo, người Brazil đã thực hiện thành công tấn công này trên nhiều loại phần mềm ứng dụng hoạt động trực tuyến khác nhau đối với các mã khối sử dụng thức CBC.
Các tác giả khác tại Pháp, Ý, Anh và Na-uy lại thực hiện thành công tấn công đối với các thiết bị SmartCard kiểu USB Token hay HSM trong trường hợp chúng hỗ trợ chức năng nhập khẩu khóa bí mật có lập mã từ bên ngoài vào thiết bị đối với cả hai loại mật mã khóa đối xứng và phi đối xứng.
Các biến thể tấn công và các giải pháp ngăn chặn tấn công
Có rất nhiều hình thức tấn công hàm tiên tri đệm thông báo được khai thác từ phần mềm, phần cứng, cách thức hoạt động mật mã và các loại công nghệ, kỹ thuật để phát triển các phần mềm, phần cứng tương ứng cũng như trong các môi trường mạng ứng dụng mật mã khác nhau.
Việc phát hiện ra một sản phẩm mật mã cài đặt trong một môi trường ứng dụng cụ thể có làm phát sinh tấn công hàm tiên tri đệm thông báo hay không và xác định khả năng thành công của tấn công này đến mức độ nào không phải là công việc dễ dàng.
Sau khi phát hiện tấn công hàm tiên tri đệm thông báo thì việc khắc phục hậu quả cũng là một công việc khó khăn, vì các tấn công này khai thác vào cấu trúc hoạt động của các phần mềm, phần cứng mật mã. Muốn điều chỉnh sửa đổi để vô hiệu hóa các tấn công này thì cần hiểu rõ về cơ chế hoạt động và phải có bản nguồn để sửa đổi và biên dịch lại. Còn đối với thiết bị phần cứng thì phải làm lại firmware.
Sau khi khắc phục được tấn công hàm tiên tri đệm thông báo thì lại tồn tại khả năng vô tình tạo ra một biến thể hoặc loại tấn công hàm tiên tri đệm thông báo khác, vì trong nhiều giao thức mật mã vấn đề đệm thông báo là bắt buộc.
Giải pháp tổng thể là tìm ra nguyên nhân khách quan của tấn công hàm đệm thông báo để ngăn chặn tận gốc chúng. Nguyên nhân khách quan của tấn công hàm tiên tri đệm thông báo là điều kiện để rò rỉ thông tin trong khi vận hành thuật toán mật mã.
Trong trường hợp tấn công hàm tiên tri đệm thông báo, thì nguyên nhân chính là điều kiện để việc tạo ra bản mã lựa chọn của kẻ tấn công mà chúng lại tuân theo PKCS. Nếu điều kiện để một bản mã lựa chọn được tạo ra bởi kẻ tấn công có xác suất tuân theo PKCS là rất nhỏ hoặc không đáng kể, thì tấn công này sẽ rất khó có khả năng thành công, vì thời gian thực hiện tấn công sẽ là rất lâu giống như tấn công vét cạn.
Muốn như vậy, người ta phải phân tích giữa bản mã lựa chọn được tạo ra bởi kẻ tấn công và bản mã thực sự được tạo ra bởi hàm tiên tri đệm thông báo khác biệt nhau cơ bản ở điểm nào.
Người ta thấy rằng, nếu thêm vào bản rõ trước khi lập mã cả thông tin xác thực thông báo để đảm bảo tính xác thực, toàn vẹn của thông báo này thì kẻ tấn công không thể sinh ra được các thông báo lập mã cũng thỏa mãn các điều kiện xác thực, toàn vẹn thông báo. Loại lập mã này có tên gọi là lập mã có xác thực (Authenticated Encryption).
Trong quá trình kiểm tra tuân theo PKCS thì hàm tiên tri kiểm tra điều kiện xác thực, toàn vẹn thông báo, điều này sẽ ngăn chặn được tận gốc tấn công hàm tiên tri đệm thông báo.
Tuy nhiên, cũng phải thấy rằng, kết hợp cơ chế kiểm tra tính xác thực, toàn vẹn thông báo vào các phần mềm và thiết bị phần cứng sẵn có trên thực tế sẽ không phải là một công việc dễ dàng, nếu như các sản phẩm này lại là các sản phẩm đóng và chưa cài đặt sẵn cơ chế này.
Kết luận
Tấn công hàm tiên tri khai thác sự rò rỉ thông tin trong quá trình tự động lập mã/ giải mã thông báo mà không cần biết khóa bí mật bằng cách tích lũy thông tin rò rỉ trong hoạt động lập mã/ giải mã tự động để tìm ra được bản rõ cần tìm đã xuất hiện trong thực tế. Loại tấn công này nguy hiểm ở chỗ, cho dù khóa bí mật được bảo vệ như thế nào thì vẫn có thể giải mã được các bản mã mong muốn. Do vậy, nếu không khắc phục được tấn công này thì các loại thiết bị như thẻ thông minh SmartCard, các môđun an toàn phần cứng HSM hay các loại thẻ USB Token sẽ không còn được coi là an toàn nữa.
Tính chất an toàn của các loại phần mềm ứng dụng hoạt động trực tuyến trên mạng như trình duyệt Web và các dịch vụ như SSL/TLS hay VPN cũng không còn được đảm bảo, vì các luồng thông tin được lập mã giữa hai đầu ứng dụng có thể được giải mã mà không cần phải biết khóa bí mật.
Do vậy, cần phải triển khai thực hành cài đặt các thuật toán mật mã nhằm hạn chế tối đa khả năng làm phát sinh tấn công hàm tiên tri đệm thông báo thay vì khắc phục khi bị tấn công.
Bên cạnh đó cũng cần có những nghiên cứu mới sâu sắc hơn để thực hành cài đặt các thuật toán mật mã an toàn và hiệu quả, hạn chế đến mức cao nhất việc làm phát sinh các tấn công hàm tiên tri đệm thông báo.
Nghiên cứu tạo ra các thuật toán mật mã có độ an toàn cao cũng quan trọng như việc triển khai cài đặt thực hành chúng trong các phần cứng, phần mềm một cách an toàn hiệu quả chống lại các tấn công cài đặt thực hành. Phải đảm bảo được an toàn mật mã thì mới thực sự đưa được mật mã vào sử dụng trong thực tế dù đó là trong lĩnh vực kinh tế - xã hội hay lĩnh vực an ninh, quốc phòng.
Tấn công giải mã thông báo đối với hệ mật khóa đối xứng dựa vào ý tưởng là khi đưa một bản mã vào hàm giải mã (tức là hàm tiên tri) thì hàm giải mã sau khi giải mã sẽ kiểm tra khối bản rõ cuối cùng xem có tuân theo quy tắc đệm thông báo không. Nếu tuân theo quy tắc đệm thông báo thì các byte cuối cùng của XOR (khối bản mã trước khối bản mã cuối cùng) với khối kết quả giải mã của khối bản mã cuối cùng sẽ chỉ có thể là 01, hoặc 02 02, hoặc 03 03 03, … hoặc 08 08…08.
Trong giao thức giải mã CBC thì khối bản rõ cuối cùng chính là XOR của khối bản mã trước đó và khối kết quả giải mã khối bản mã cuối cùng của mã khối DES. Khi muốn giải mã một khối bản mã bất kỳ, người ta nối vào trước nó một khối ngẫu nhiên làm khối bản mã giả. Sau đó tính toán giá trị của khối ngẫu nhiên này cho đến khi thông báo khối bản rõ tuân theo quy tắc đệm thông báo. Đầu tiên, tiến hành tính toán byte thấp nhất của khối ngẫu nhiên để tìm byte thấp nhất của khối kết quả giải mã; Tức là tìm ra trường hợp 01. Sau đó tìm các byte tiếp theo của khối kết quả giải mã; Tức là tìm ra trường hợp 02 02, 03 03 03,… 08 08… 08.
Đối với từng byte, do biết giá trị của byte ngẫu nhiên và giá trị XOR của nó với byte tương ứng của khối kết quả giải mã, nên dễ dàng tính được byte tương ứng của khối kết quả giải mã. Giá trị XOR này lần lượt là 01, 02, 03,… 08.
Khi giải mã byte cuối cùng nếu rơi vào các trường hợp đứng trước trường 01 thì sẽ tìm được luôn các byte cuối cùng và dẫn đến trường hợp 08 08… 08 ngay mà không cần bắt đầu từ trường hợp 01 nữa.
Có hai điều cần lưu ý tại đây. Thứ nhất là khi tìm ra được bản mã tuân theo quy tắc đệm thông báo thì cần làm rõ kết quả rơi vào trường hợp nào trong các trường hợp 01, 02 02,… 08 08… 08. Chúng ta lần lượt thay đổi giá trị của byte ngẫu nhiên cao nhất. Nếu nó vẫn tuân theo quy tắc đệm thông báo, thì đó không phải là trường hợp 08 08…08. Ngược lại, có thể kết luận đó chính là trường hợp 08 08… 08. Chúng ta lại thay đổi byte ngẫu nhiên tiếp theo để biết đó có phải trường hợp 07 07… 07 hay không.
Trường hợp lâu nhất là kết quả tìm thấy rơi vào trường hợp 01 còn lại, khi chúng ta thay đổi byte ngẫu nhiên đứng trước byte ngẫu nhiên cuối cùng mà nó vẫn tuân theo quy tắc đệm thông báo.
Thứ hai là trong trường hợp cụ thể là 01. Khi đó chúng ta tính được byte thấp nhất của khối kết quả giải mã. Khi muốn chuyển sang byte tiếp theo chúng ta điều khiển cho giá trị XOR tại byte thấp nhất của khối bản rõ trở thành 02, rồi điều khiển byte ngẫu nhiên đứng trước cho đến khi tuân theo quy tắc đệm thông báo. Nếu rơi vào trường hợp 02 02 thì sẽ tính được byte đứng trước của khối kết quả giải mã. Tiếp tục thực hiện cho đến khi tính được tất cả các byte của khối kết quả giải mã.
Khi đã giải mã được một khối bản mã bất kỳ thì có thể giải mã tiếp các khối bản mã khác của thông báo mã. Các khối bản mã của thông báo mã được tách rời để giải mã riêng biệt, thông qua hàm tiên tri với quy tắc đệm thông báo. Mỗi byte chỉ cần thử trung bình 128 lần là tìm ra byte cần tìm.
|