Tấn công mở rộng độ dài là một cuộc tấn công liên quan đến thuộc tính của một số loại hàm băm nhất định (chẳng hạn như MD5, SHA-1 và SHA-2). Nói một cách đơn giản, cuộc tấn công này khai thác thực tế là khi biết H(tin nhắn) và độ dài của tin nhắn, chúng ta có thể dễ dàng tính toán H(tin nhắn || phần đệm || phần mở rộng) mà không cần biết chính tin nhắn đó. Trong đó "||" thể hiện kết nối thì "đệm" được thêm vào theo quy định của hàm băm.
Điều này là do các hàm băm này sử dụng cấu trúc Merkle-Damgård, chia đầu vào thành các khối và hàm băm của mỗi khối phụ thuộc vào hàm băm của khối trước đó. Điều này có nghĩa là khi chúng tôi đã tính toán hàm băm của một tin nhắn nhất định, chúng tôi có trạng thái mà từ đó chúng tôi có thể bắt đầu và thêm nhiều khối hơn.
Chế độ xác minh phía máy chủ
Để thuận tiện cho việc mô tả kịch bản lỗ hổng, trước tiên chúng tôi giả định rằng có một chế độ xác thực phía máy chủ như vậy, nghĩa là khi người dùng cố gắng đăng nhập, máy chủ sẽ chuyển một hàm băm cụ thể dựa trên ID, tên và khóa gồm 30 chữ số chỉ máy chủ mới biết. Thuật toán tạo ra giá trị băm và gửi nó đến máy khách. Sau này, khi máy khách cố gắng truy cập một số giao diện cụ thể, chẳng hạn như giao diện sửa đổi quyền của người dùng, máy chủ sẽ tạo lại hàm băm để xác minh dựa trên ID vai trò, tên vai trò, quyền của vai trò và cùng khóa 30 chữ số ở mặt trước. -kết thúc BÀI ĐĂNG. Nếu hàm băm được tải lên nhất quán với hàm băm do máy chủ tạo ra thì quá trình xác minh được coi là đã vượt qua và các quyền của vai trò mới sẽ được ghi vào cơ sở dữ liệu.
Để dễ hiểu, đây là một số mã đơn giản được viết theo mô tả làm ví dụ:
Suy nghĩ vượt quá thẩm quyền
Do có những sơ hở trong chế độ xác minh, kẻ tấn công có thể bỏ qua việc xác minh quyền bằng cách xây dựng lại yêu cầu giao dịch mà không biết SecretKey. Ý tưởng cốt lõi của cuộc tấn công trái phép là khai thác đặc điểm của các cuộc tấn công mở rộng độ dài. Trước tiên, kẻ tấn công cần lấy giá trị băm ban đầu và tính toán độ dài của dữ liệu gốc thông qua thuật toán lặp đơn giản. Sau khi có được thông tin này, các tham số trái phép bổ sung có thể được thêm vào dữ liệu gốc và thuật toán băm tương tự có thể được sử dụng để tạo ra các hàm băm độc hại.
Nguyên tắc tấn công mở rộng độ dài
Tấn công mở rộng độ dài xảy ra do cơ chế bên trong của một phần hàm băm. Trước tiên, các hàm này chia dữ liệu thành các khối có độ dài cố định trước khi xử lý dữ liệu đầu vào, sau đó đệm vào cuối mỗi khối để đáp ứng các yêu cầu cụ thể. Thiết kế này cho phép kẻ tấn công tạo ra một giá trị băm hiệu quả mới bằng cách đệm và nối thêm dữ liệu mới trong khi biết giá trị băm và độ dài của tin nhắn gốc.
Lấy SHA-256 làm ví dụ, hoạt động trên các khối 512 bit. Đối với dữ liệu có độ dài không phải là bội số của 512 bit thì cần phải có phần đệm. Quy tắc điền của nó như sau:
Thêm bit "1" vào cuối dữ liệu;
Thêm một số bit "0" nhất định để độ dài của modulo dữ liệu 512 bằng 448 (để biết chi tiết, xem [1] );
Thêm một khối dài 64 bit ở cuối để biểu thị độ dài của dữ liệu gốc.
Tóm lại, số "1" theo sau là m "0"s, cộng với số nguyên 64 bit hoặc 128 bit, được thêm vào cuối tin nhắn để tạo ra tin nhắn đệm có độ dài 512*n. Số nguyên được thêm vào là độ dài của tin nhắn gốc. Sau đó, tin nhắn được đệm sẽ được băm thành n khối 512 bit.
Phương pháp xây dựng
Trong ví dụ này, chúng tôi sẽ sử dụng mã được đề cập trong hình trên làm trường hợp cụ thể, trong đó chuỗi dữ liệu là data="user_id=1&user_name=aa" và khóa là SecretKey="Length_extension\ _Attack\ _bí mật". Máy chủ sẽ phân tích trường dữ liệu trong dữ liệu được tải lên và phân tích các tham số bắt buộc user_id và user_name thông qua dấu phân cách &. Nếu trường vai trò tồn tại, máy chủ cũng sẽ nhận được giá trị của trường này. Sau đó, máy chủ sẽ băm tất cả các trường có SecretKey và so sánh nó với hàm băm xác minh đã tải lên. Nếu các giá trị băm nhất quán thì các tham số được coi là tuân thủ quy tắc và được sử dụng trực tiếp.
Đầu tiên, chúng ta đăng nhập vào giao diện loginHandler để lấy giá trị băm hash="37d310d3465506486431fb2c2eb163f0f470479703f66dc9e5fdead8a3390c68" được tạo bằng SHA-256 dựa trên dữ liệu và SecretKey.
Tiếp theo, chúng ta sẽ xem xét độ khó của việc bẻ khóa. Lấy tình huống thử nghiệm của chúng tôi làm ví dụ, theo nguyên tắc tấn công mở rộng độ dài, miễn là chúng tôi biết độ dài của H (tin nhắn) và tin nhắn, chúng tôi có thể thêm dữ liệu mới thông qua tấn công mở rộng độ dài. Tin nhắn ban đầu = SecretKey + data, bây giờ chúng ta đã có trong tay H (tin nhắn), chúng ta chỉ cần biết độ dài của tin nhắn là có thể xây dựng một giá trị băm mới. Vì SecretKey là khóa 30 bit nên chỉ cần 30 lần lặp để biết độ dài của tin nhắn thực sự. Vì vậy, chúng ta có thể dễ dàng xây dựng một giá trị băm mới. Vì cần sử dụng quyền quản trị viên nên chúng tôi cần ghép trường độc hại "&role=admin" vào dữ liệu gốc.
Chúng ta có thể tận dụng tính năng tấn công mở rộng độ dài để thêm dữ liệu mới và tạo giá trị băm mới mà không cần biết SecretKey. Ở đây chúng tôi sử dụng một thư viện đã triển khai chức năng này [2] để hoàn thành bài kiểm tra. Sau đó sử dụng công cụ này để tạo giá trị băm mới.
Vì quá trình xác minh giao diện của adminActionHandler xác minh hàm băm dựa trên user_id, user_name và vai trò đã tải lên nên dữ liệu chúng tôi tải lên tại thời điểm này là user_id=1, user_name=aa\x80\x00\x00\x00 \ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x70 và role=admin, như minh họa trong hình sau:
Giá trị băm là 84ae4ae437eeabf3bd8a26294392770b86f64a81998194156ac003d58a21acd0. Sau đó, bạn có thể gọi giao diện adminActionHandler. Sau khi nhận được dữ liệu, máy chủ sẽ so sánh hàm băm đã tải lên với sha256 (SecretKey + fakeData). Sau khi vượt qua xác minh, một số thao tác nhạy cảm sẽ được thực hiện. Bằng cách này, chúng tôi đã vượt qua thành công quá trình xác minh phía máy chủ bằng cách sử dụng cuộc tấn công mở rộng độ dài và nhận ra hoạt động trái phép.
Các tình huống tấn công có thể xảy ra khác
1. Xác minh tính toàn vẹn của tệp: Nếu tính toàn vẹn của tệp được xác minh bằng cách nối khóa với nội dung tệp rồi băm nó, kẻ tấn công có thể mở rộng tệp và tạo ra hàm băm hợp lệ, do đó bỏ qua việc kiểm tra tính toàn vẹn;
2. Bảo mật ứng dụng web: Trong các ứng dụng web, nếu hàm băm dễ bị tấn công mở rộng độ dài được sử dụng để xác minh dữ liệu do người dùng gửi, thì kẻ tấn công có thể lợi dụng điều này để gửi dữ liệu độc hại;
3. Chữ ký số: Trong một số lược đồ chữ ký số, nếu chữ ký được tạo bằng cách ghép khóa riêng tư và tin nhắn, sau đó băm nó thì kẻ tấn công có thể mở rộng tin nhắn và tạo chữ ký hợp lệ;
**4. Lưu trữ mật khẩu: **Mặc dù không phổ biến, nhưng nếu mật khẩu được lưu trữ bằng cách ghép một khóa (chẳng hạn như muối) và mật khẩu, sau đó băm nó, kẻ tấn công có thể cố gắng bẻ khóa nó bằng cách sử dụng mật khẩu tấn công mở rộng độ dài.
Cách phòng tránh
1. Chọn hàm băm không dễ bị tấn công kéo dài, chẳng hạn như SHA-3;
**2. Sử dụng HMAC: **HMAC yêu cầu một khóa và một thông báo làm đầu vào và kết quả đầu ra phụ thuộc vào cả khóa và thông báo, vì vậy kẻ tấn công không thể thực hiện các cuộc tấn công mở rộng độ dài mà không biết khóa;
**3. Tăng cường xác minh thẩm quyền: **Thêm các bước xác minh thẩm quyền bổ sung ở phía máy chủ, chẳng hạn như sử dụng xác thực đa yếu tố.
Sau đây là đặc điểm của một số thuật toán Hash thường được sử dụng:
| Thuật toán | Chống va chạm | Các cuộc tấn công va chạm tiền tố được chọn | Kháng tiền ảnh | Các cuộc tấn công mở rộng độ dài |
| --- | --- | --- | --- | --- |
| MD5 | 2^18 | 2^39 | 2^123.4 | Dễ bị tổn thương |
| SHA-1 | 2^61.2 | 2^63.4 | 2^160 | Dễ bị tổn thương|
| SHA-256 (SHA-2) | 2^65.5 | - | 2^254.9 | Dễ bị tổn thương|
| SHA-512 (SHA-2) | 2^32.5 | - | 2^511.5 | Dễ bị tổn thương|
| SHA-3 | 2^50 | - | chưa biết | không dễ bị tổn thương |
| BLAKE2s | 2^112 | - | 2^241 | Không dễ bị tổn thương |
| BLAKE2b | 2^224 | - | 2^481 | không dễ bị tổn thương|
Phần kết luận
Cách phòng thủ hiệu quả chống lại các cuộc tấn công mở rộng độ dài là sử dụng các hàm băm miễn nhiễm với các cuộc tấn công như vậy, chẳng hạn như SHA-3 và BLAKE2. Ngoài ra, nó cũng có thể được bảo vệ thông qua cấu trúc HMAC (mã xác thực tin nhắn băm có khóa). Những biện pháp này có thể cải thiện hiệu quả tính bảo mật của hệ thống và đảm bảo tính toàn vẹn của dữ liệu cũng như độ ổn định của ứng dụng.
Liên kết tham khảo:
[1]
[2]
Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
Những mối nguy hiểm tiềm ẩn của hàm băm: các cuộc tấn công mở rộng độ dài và rủi ro bảo mật phía máy chủ
Giới thiệu
Tấn công mở rộng độ dài là một cuộc tấn công liên quan đến thuộc tính của một số loại hàm băm nhất định (chẳng hạn như MD5, SHA-1 và SHA-2). Nói một cách đơn giản, cuộc tấn công này khai thác thực tế là khi biết H(tin nhắn) và độ dài của tin nhắn, chúng ta có thể dễ dàng tính toán H(tin nhắn || phần đệm || phần mở rộng) mà không cần biết chính tin nhắn đó. Trong đó "||" thể hiện kết nối thì "đệm" được thêm vào theo quy định của hàm băm.
Điều này là do các hàm băm này sử dụng cấu trúc Merkle-Damgård, chia đầu vào thành các khối và hàm băm của mỗi khối phụ thuộc vào hàm băm của khối trước đó. Điều này có nghĩa là khi chúng tôi đã tính toán hàm băm của một tin nhắn nhất định, chúng tôi có trạng thái mà từ đó chúng tôi có thể bắt đầu và thêm nhiều khối hơn.
Chế độ xác minh phía máy chủ
Để thuận tiện cho việc mô tả kịch bản lỗ hổng, trước tiên chúng tôi giả định rằng có một chế độ xác thực phía máy chủ như vậy, nghĩa là khi người dùng cố gắng đăng nhập, máy chủ sẽ chuyển một hàm băm cụ thể dựa trên ID, tên và khóa gồm 30 chữ số chỉ máy chủ mới biết. Thuật toán tạo ra giá trị băm và gửi nó đến máy khách. Sau này, khi máy khách cố gắng truy cập một số giao diện cụ thể, chẳng hạn như giao diện sửa đổi quyền của người dùng, máy chủ sẽ tạo lại hàm băm để xác minh dựa trên ID vai trò, tên vai trò, quyền của vai trò và cùng khóa 30 chữ số ở mặt trước. -kết thúc BÀI ĐĂNG. Nếu hàm băm được tải lên nhất quán với hàm băm do máy chủ tạo ra thì quá trình xác minh được coi là đã vượt qua và các quyền của vai trò mới sẽ được ghi vào cơ sở dữ liệu.
Để dễ hiểu, đây là một số mã đơn giản được viết theo mô tả làm ví dụ:
Suy nghĩ vượt quá thẩm quyền
Do có những sơ hở trong chế độ xác minh, kẻ tấn công có thể bỏ qua việc xác minh quyền bằng cách xây dựng lại yêu cầu giao dịch mà không biết SecretKey. Ý tưởng cốt lõi của cuộc tấn công trái phép là khai thác đặc điểm của các cuộc tấn công mở rộng độ dài. Trước tiên, kẻ tấn công cần lấy giá trị băm ban đầu và tính toán độ dài của dữ liệu gốc thông qua thuật toán lặp đơn giản. Sau khi có được thông tin này, các tham số trái phép bổ sung có thể được thêm vào dữ liệu gốc và thuật toán băm tương tự có thể được sử dụng để tạo ra các hàm băm độc hại.
Nguyên tắc tấn công mở rộng độ dài
Tấn công mở rộng độ dài xảy ra do cơ chế bên trong của một phần hàm băm. Trước tiên, các hàm này chia dữ liệu thành các khối có độ dài cố định trước khi xử lý dữ liệu đầu vào, sau đó đệm vào cuối mỗi khối để đáp ứng các yêu cầu cụ thể. Thiết kế này cho phép kẻ tấn công tạo ra một giá trị băm hiệu quả mới bằng cách đệm và nối thêm dữ liệu mới trong khi biết giá trị băm và độ dài của tin nhắn gốc.
Lấy SHA-256 làm ví dụ, hoạt động trên các khối 512 bit. Đối với dữ liệu có độ dài không phải là bội số của 512 bit thì cần phải có phần đệm. Quy tắc điền của nó như sau:
Thêm bit "1" vào cuối dữ liệu;
Thêm một số bit "0" nhất định để độ dài của modulo dữ liệu 512 bằng 448 (để biết chi tiết, xem [1] );
Thêm một khối dài 64 bit ở cuối để biểu thị độ dài của dữ liệu gốc.
Tóm lại, số "1" theo sau là m "0"s, cộng với số nguyên 64 bit hoặc 128 bit, được thêm vào cuối tin nhắn để tạo ra tin nhắn đệm có độ dài 512*n. Số nguyên được thêm vào là độ dài của tin nhắn gốc. Sau đó, tin nhắn được đệm sẽ được băm thành n khối 512 bit.
Phương pháp xây dựng
Trong ví dụ này, chúng tôi sẽ sử dụng mã được đề cập trong hình trên làm trường hợp cụ thể, trong đó chuỗi dữ liệu là data="user_id=1&user_name=aa" và khóa là SecretKey="Length_extension\ _Attack\ _bí mật". Máy chủ sẽ phân tích trường dữ liệu trong dữ liệu được tải lên và phân tích các tham số bắt buộc user_id và user_name thông qua dấu phân cách &. Nếu trường vai trò tồn tại, máy chủ cũng sẽ nhận được giá trị của trường này. Sau đó, máy chủ sẽ băm tất cả các trường có SecretKey và so sánh nó với hàm băm xác minh đã tải lên. Nếu các giá trị băm nhất quán thì các tham số được coi là tuân thủ quy tắc và được sử dụng trực tiếp.
Đầu tiên, chúng ta đăng nhập vào giao diện loginHandler để lấy giá trị băm hash="37d310d3465506486431fb2c2eb163f0f470479703f66dc9e5fdead8a3390c68" được tạo bằng SHA-256 dựa trên dữ liệu và SecretKey.
Tiếp theo, chúng ta sẽ xem xét độ khó của việc bẻ khóa. Lấy tình huống thử nghiệm của chúng tôi làm ví dụ, theo nguyên tắc tấn công mở rộng độ dài, miễn là chúng tôi biết độ dài của H (tin nhắn) và tin nhắn, chúng tôi có thể thêm dữ liệu mới thông qua tấn công mở rộng độ dài. Tin nhắn ban đầu = SecretKey + data, bây giờ chúng ta đã có trong tay H (tin nhắn), chúng ta chỉ cần biết độ dài của tin nhắn là có thể xây dựng một giá trị băm mới. Vì SecretKey là khóa 30 bit nên chỉ cần 30 lần lặp để biết độ dài của tin nhắn thực sự. Vì vậy, chúng ta có thể dễ dàng xây dựng một giá trị băm mới. Vì cần sử dụng quyền quản trị viên nên chúng tôi cần ghép trường độc hại "&role=admin" vào dữ liệu gốc.
Chúng ta có thể tận dụng tính năng tấn công mở rộng độ dài để thêm dữ liệu mới và tạo giá trị băm mới mà không cần biết SecretKey. Ở đây chúng tôi sử dụng một thư viện đã triển khai chức năng này [2] để hoàn thành bài kiểm tra. Sau đó sử dụng công cụ này để tạo giá trị băm mới.
Vì quá trình xác minh giao diện của adminActionHandler xác minh hàm băm dựa trên user_id, user_name và vai trò đã tải lên nên dữ liệu chúng tôi tải lên tại thời điểm này là user_id=1, user_name=aa\x80\x00\x00\x00 \ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x70 và role=admin, như minh họa trong hình sau:
Giá trị băm là 84ae4ae437eeabf3bd8a26294392770b86f64a81998194156ac003d58a21acd0. Sau đó, bạn có thể gọi giao diện adminActionHandler. Sau khi nhận được dữ liệu, máy chủ sẽ so sánh hàm băm đã tải lên với sha256 (SecretKey + fakeData). Sau khi vượt qua xác minh, một số thao tác nhạy cảm sẽ được thực hiện. Bằng cách này, chúng tôi đã vượt qua thành công quá trình xác minh phía máy chủ bằng cách sử dụng cuộc tấn công mở rộng độ dài và nhận ra hoạt động trái phép.
Các tình huống tấn công có thể xảy ra khác
1. Xác minh tính toàn vẹn của tệp: Nếu tính toàn vẹn của tệp được xác minh bằng cách nối khóa với nội dung tệp rồi băm nó, kẻ tấn công có thể mở rộng tệp và tạo ra hàm băm hợp lệ, do đó bỏ qua việc kiểm tra tính toàn vẹn;
2. Bảo mật ứng dụng web: Trong các ứng dụng web, nếu hàm băm dễ bị tấn công mở rộng độ dài được sử dụng để xác minh dữ liệu do người dùng gửi, thì kẻ tấn công có thể lợi dụng điều này để gửi dữ liệu độc hại;
3. Chữ ký số: Trong một số lược đồ chữ ký số, nếu chữ ký được tạo bằng cách ghép khóa riêng tư và tin nhắn, sau đó băm nó thì kẻ tấn công có thể mở rộng tin nhắn và tạo chữ ký hợp lệ;
**4. Lưu trữ mật khẩu: **Mặc dù không phổ biến, nhưng nếu mật khẩu được lưu trữ bằng cách ghép một khóa (chẳng hạn như muối) và mật khẩu, sau đó băm nó, kẻ tấn công có thể cố gắng bẻ khóa nó bằng cách sử dụng mật khẩu tấn công mở rộng độ dài.
Cách phòng tránh
1. Chọn hàm băm không dễ bị tấn công kéo dài, chẳng hạn như SHA-3;
**2. Sử dụng HMAC: **HMAC yêu cầu một khóa và một thông báo làm đầu vào và kết quả đầu ra phụ thuộc vào cả khóa và thông báo, vì vậy kẻ tấn công không thể thực hiện các cuộc tấn công mở rộng độ dài mà không biết khóa;
**3. Tăng cường xác minh thẩm quyền: **Thêm các bước xác minh thẩm quyền bổ sung ở phía máy chủ, chẳng hạn như sử dụng xác thực đa yếu tố.
Sau đây là đặc điểm của một số thuật toán Hash thường được sử dụng:
| Thuật toán | Chống va chạm | Các cuộc tấn công va chạm tiền tố được chọn | Kháng tiền ảnh | Các cuộc tấn công mở rộng độ dài | | --- | --- | --- | --- | --- | | MD5 | 2^18 | 2^39 | 2^123.4 | Dễ bị tổn thương | | SHA-1 | 2^61.2 | 2^63.4 | 2^160 | Dễ bị tổn thương| | SHA-256 (SHA-2) | 2^65.5 | - | 2^254.9 | Dễ bị tổn thương| | SHA-512 (SHA-2) | 2^32.5 | - | 2^511.5 | Dễ bị tổn thương| | SHA-3 | 2^50 | - | chưa biết | không dễ bị tổn thương | | BLAKE2s | 2^112 | - | 2^241 | Không dễ bị tổn thương | | BLAKE2b | 2^224 | - | 2^481 | không dễ bị tổn thương|
Phần kết luận
Cách phòng thủ hiệu quả chống lại các cuộc tấn công mở rộng độ dài là sử dụng các hàm băm miễn nhiễm với các cuộc tấn công như vậy, chẳng hạn như SHA-3 và BLAKE2. Ngoài ra, nó cũng có thể được bảo vệ thông qua cấu trúc HMAC (mã xác thực tin nhắn băm có khóa). Những biện pháp này có thể cải thiện hiệu quả tính bảo mật của hệ thống và đảm bảo tính toàn vẹn của dữ liệu cũng như độ ổn định của ứng dụng.
Liên kết tham khảo:
[1]
[2]