Forcing CRC-32 Attack

Trong truyền dẫn dữ liệu, CRC (cyclic redundancy check) là một giá trị được tính toán và truyền cùng với dữ liệu gốc, CRC được dùng để dò lỗi khi dữ liệu được truyền hay lưu vào thiết bị lưu trữ. Nguyên tắc hoạt động của CRC như một hàm băm (hashing), điều này có thể khiến nhiều người dùng CRC như một hàm băm trong xác thực. Đây là một điều tuyệt đối không nên! CRC sinh ra chỉ để đảm bảo tính toàn vẹn cho dữ liệu trong truyền dẫn và lưu trữ, nó không là công cụ của mật mã học tạo ra để bảo vệ thông tin của bạn.
Việc tính toán CRC dựa vào các phép chia đa thức của khối dữ liệu cho một đa thức sinh (Generator polynomial), CRC Code tạo ra chính là phần dư của phép chia, các đa thức sinh phổ biến được IEEE đưa ra dựa vào kết quả của toán học giúp cho việc tính toán CRC một các nhanh nhất có thể.

Cách tính CRC như sau, giả sử:
+Dữ liệu truyền D(x): 1110 1101 <=> 1 + x + x2 + x4 + x5 + x7
+ĐT sinh G(x): 1011 <=> 1 + x2 + x3

Thực hiện phép chia D(x)/G(x)
CRC calculation
Phần dư của phép chia trên là R(x) = 100, vậy dữ liệu truyền là 11101101100. Đây chính là CRC-3

Hiện tại CRC-32 là chuẩn được dùng nhiều nhất, các đa thức sinh cho chuẩn này như bên dưới
Nguồn: http://en.wikipedia.org/wiki/Cyclic_redundancy_check
CRC hoạt động như hàm băm vì vậy CRC-32(file1) = CRC-32(file2) nếu file1 và file2 cùng nội dung. Có thể dùng tiện ích crc32 của Linux để tính CRC32 của một file.
Lệnh crc32
Đây chính là ứng dụng của CRC để đảm bảo tính toàn vẹn dữ liệu, nếu có thay đổi thì CRC-32 ở đầu nhận sẽ không giống CRC-32 đã tính ở đầu gửi. Vậy có cách nào phá vỡ khả năng kiểm tra hoặc bắt CRC hoạt động theo ý muốn của ta không!? Câu trả lời là có thể làm được dễ dàng.
Không gian CRC-32 khá lớn 232, nhưng không gian của dữ liệu là vô cùng nên sẽ xảy ra "Birthday Problem" hay "CRC collision", xác xuất collision này sẽ ít gặp trong thực tế kiểm tra tính toàn vẹn, tham khảo tại Probability of collision CRC-32, có thể Brute-force để tìm ra CRC Collision, chỉ gặp phải vấn đề thời gian :D

Còn một cách khác rất hay, dựa vào khả năng có thể dịch ngược của thuật toán tính CRC ta hoàn toàn tạo ra được chuỗi CRC-32 theo ý muốn từ một dữ liệu bất kì. Bài viết Forcing a file's CRC-32 to any value phân tích quá trình tấn công dạng này, tôi sẽ mô phỏng lại bằng công cụ viết bằng Python của tác giả bài viết vừa đề cập là forcecrc32.py.

Mục tiêu là tạo ra một giá trị CRC-32 như mong muốn mà chỉ cần thay đổi tối thiểu 4 byte trong tập tin file1.dat

Nội dung file1.dat ban đầu

Thực hiện thay đổi CRC-32 thành 0xABCDABCD

Nội dung file1.dat đã bị thay đổi

Đây thực tế không phải là lỗi nguy hiểm của CRC-32, lỗi này chỉ xảy ra khi dùng CRC-32 cho việc xác thực. Hãy nhớ CRC chỉ sinh ra cho mục đích phát hiện lỗi nếu có mất mát dữ liệu.

Nhận xét

  1. Hay quá! Mình đang cần tìm hiểu về CRC. Cám ơn bác nhiều nha! ^_^

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

CVE-2019-12839: Lỗ hổng thực thi mã lệnh tùy ý trên OrangeHRM CMS

[Steganography] Kỹ thuật che dấu thông tin - Phần 2

PHP Race Condition Vulnerability Example